• Spring Boot邮件功能


    1.应用场景

    邮件功能的应用场景可谓十分广泛,诸如注册用户、密码找回,消息通知、以及一些程序异常通知等都需要使用到该功能。

    正是由于邮件功能的使用广泛,因此springboot也加在它的组件中添加了邮件。

    2.maven依赖

    springboot中已经给我们准备好了邮件的相关组件,我们只要在springboot项目中将其添加即可。

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-mail</artifactId>
            </dependency>

    添加后继续查看这个组件的相关依赖(下图),可见里面实际也是封装了javax.mail的邮件收发相关类。

    3.普通邮件发送

    我们首先编写一个简单text邮件的样例,之后会再在样例的demo上进行其他几种复杂邮件的发送,以及部分源码的解析。

    3.1.配置文件

    #我这里使用QQ邮箱来发送邮件,因此配置的host是smtp.qq.com,使用其他邮箱需要找到对应的host
    spring.mail.host=smtp.qq.com
    #发送邮件的邮箱账号
    spring.mail.username=*********@qq.com
    #发送邮件的邮箱的SMTP服务密码(有的邮箱使用的是邮箱密码,不同邮箱可能不同)
    spring.mail.password=**********
    #是否进行身份验证
    spring.mail.properties.mail.smtp.auth=true
    spring.mail.properties.mail.smtp.starttls.enable=true
    spring.mail.properties.mail.smtp.starttls.required=true

    3.2.使用方法

    @Component
    public class EmailService {
    
        @Autowired
        private JavaMailSender mailSender;
    
        public void sendMsg() {
            SimpleMailMessage mailMessage = new SimpleMailMessage();
            // 邮件发送者,这里不能随便填写,必须是真实的发送邮件的邮箱名称
            mailMessage.setFrom("527724431@qq.com");
            // 邮件接受者
            mailMessage.setTo("18373143942@sina.cn");
            // 邮件主题
            mailMessage.setSubject("testSubject");
            // 邮件内容
            mailMessage.setText("hello email!");
            // 发送邮件
            mailSender.send(mailMessage);
        }
    
    }

    3.3.测试代码

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class DemoApplicationTests {
    
        @Autowired
        private EmailService emailService;
    
        @Test
        public void contextLoads() {
            emailService.sendMsg();
        }
    
    }

    3.4查看邮箱

    4.复杂邮件发送

    复杂邮件分为很多种情况,由于篇幅有限,这里只简单列举其中几种。

    4.1多个邮件接收人

    我们查看上面方法中设置的setTo()源码:

        public void setTo(String to) {
            this.to = new String[]{to};
        }
    
        public void setTo(String... to) {
            this.to = to;
        }

    可见里面实际是将我们传入的参数作为数组来接受的,因此我们可以以下面的两种形式来将邮件发送给多个接收者:

    1. 数组。
    2. 多个参数。
            // 邮件接受者
            mailMessage.setTo("","","");
            mailMessage.setTo(new String[]{"",""});

    4.2抄送

    添加抄送者与添加接受者的方式差不多,区别在于方法名,添加抄送者方法为setCc():

        public void setCc(String cc) {
            this.cc = new String[]{cc};
        }
    
        public void setCc(String... cc) {
            this.cc = cc;
        }

    同样也可以添加一个,或以数组和多参数形式添加多个抄送者:

            // 邮件抄送者
            mailMessage.setCc("");
            mailMessage.setCc("","");
            mailMessage.setCc(new String[]{"",""});

    4.3发送带路径的邮件

    复杂邮件与简单邮件相比,这里使用的消息类不再是SimpleMailMessage。而是由邮件发送器JavaMailSender生成的MimeMessage作为消息类,同时加以一个辅助类MimeMessageHelper进行消息的添加。

        public void sendComplexMsg() {
            MimeMessage message = mailSender.createMimeMessage();
    
            try {
    // 生成消息辅助类,注意后面的true是用来决定是否添加附件 MimeMessageHelper messageHelper = new MimeMessageHelper(message, true); messageHelper.setSubject("testSubject"); messageHelper.setFrom("527724431@qq.com"); messageHelper.setTo("18373143942@sina.cn");
    // 这里后面的true,用来让text内容以html格式进行展示,如果不设置,里面的链接会被作为普通字符串展示 messageHelper.setText("
    <a href="#">链接</a>", true); } catch (MessagingException e) { e.printStackTrace(); } mailSender.send(message); }

    4.4添加附件

    添加附件和添加带路径内容差不多,区别只在于多使用了"addAttachment()"方法。方法第一个参数是附件在邮件中的命名,第二个参数是要上传的文件。

    一个邮件可以添加多个附件,只要继续调用addAttachment()方法即可。

    但要注意的是,发送附件文件时,setText()必须要被调用,否则程序将抛出异常,无法发送邮件。

        public void sendComplexMsg() {
            MimeMessage message = mailSender.createMimeMessage();
    
            try {
                MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
                messageHelper.setSubject("testSubject");
                messageHelper.setFrom("527724431@qq.com");
                messageHelper.setTo("18373143942@sina.cn");
                messageHelper.setText("<a href="#">链接</a>", true);
                messageHelper.addAttachment("附件", new File("D://yxf//123.txt"));
            } catch (MessagingException e) {
                e.printStackTrace();
            }
    
            mailSender.send(message);
    
        }

    4.5

  • 相关阅读:
    EcFinal游记
    简要介绍补码的原理
    【SCOI2007】降雨量
    【ecfinal2019热身赛】B题
    【HAOI2011】problem a
    20200301(ABC)题解 by李旭晨
    20200228(ABC)题解 by 马鸿儒
    20200220(C)题解 b刘存
    20200225(DEF)题解 by 马鸿儒
    20200224(ABC)题解 by 马鸿儒
  • 原文地址:https://www.cnblogs.com/yxth/p/11202837.html
Copyright © 2020-2023  润新知