美文网首页
Spring Boot 整合邮件发送

Spring Boot 整合邮件发送

作者: SheHuan | 来源:发表于2020-09-26 19:34 被阅读0次

    Spring Boot整合邮件发送功能还是比较简单的,下边我们详细看整个实现过程。

    一、基础配置

    首先创建好Spring Boot项目,pom.xml中需要添加如下依赖:

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

    然后在application.properties中添加如下配置:

    spring.mail.host=smtp.qq.com
    spring.mail.port=465
    // 发件人的邮箱
    spring.mail.username=544642279@qq.com
    // QQ邮箱的授权码
    spring.mail.password=xxxxxxxxxxx
    spring.mail.default-encoding=UTF-8
    spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
    // 打开调试
    spring.mail.properties.mail.debug=true
    

    这里使用QQ邮箱发送邮件,授权码需要在自己的QQ邮箱中获取,步骤网上很多。

    二、发送简单的文本邮件

    @Service
    public class MailService {
        @Autowired
        private JavaMailSender javaMailSender;
    
        @Value("${spring.mail.username}")
        private String from;
    
        public void send() {
            SimpleMailMessage smm = new SimpleMailMessage();
            smm.setSubject("邮件主题");
            smm.setText("邮件正文\nhello spring boot");
            // 发送邮箱
            smm.setFrom(from);
            // 发送日期
            smm.setSentDate(new Date());
            // 要发给的邮箱
            smm.setTo("shehuandev@163.com");
            // 密送的邮箱
            smm.setBcc("shehuan320@163.com");
            // 抄送邮箱
            smm.setCc("shehuan.dev@gmail.com");
            javaMailSender.send(smm);
        }
    }
    

    首先需要注入JavaMailSender对象,Spring Boot已经帮我们创建好了,它是发送邮件的核心类。然后就是SimpleMailMessage类,同它来完成邮件信息的配置。测试结果如下:

    但是SimpleMailMessage的功能相对弱一些,不能实现更加丰富的邮件内容,所以更多的时候可以考虑使用功能更强大的MimeMessage

    三、发送html内容和带附件的邮件

    发送html内容或者带附件的邮件,可以使用MimeMessage类,通过它创建MimeMessageHelper来完成对应的配置:

    @Service
    public class MailService {
        @Autowired
        private JavaMailSender javaMailSender;
    
        @Value("${spring.mail.username}")
        private String from;
    
        public void send2() {
            try {
                MimeMessage mimeMessage = javaMailSender.createMimeMessage();
                MimeMessageHelper mmh = new MimeMessageHelper(mimeMessage, true);
                mmh.setSubject("邮件主题");
                // 设置邮件内容
                mmh.setText("<html><body>邮件正文\n<img src='cid:img1'/>\n<h1>hello spring boot</h1></body></html>", true);
                // 配置图片资源
                mmh.addInline("img1", new File("src/main/resources/static/favicon.ico"));
                mmh.setFrom(from);
                // 发送日期
                mmh.setSentDate(new Date());
                mmh.setTo("shehuandev@163.com");
                // 添加附件
                mmh.addAttachment("favicon.ico", new File("src/main/resources/static/favicon.ico"));
                javaMailSender.send(mimeMessage);
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        }
    }
    

    其中setText()方法的第二个参数为true,表示发送的是html格式的内容,第一个参数则是html格式的邮件内容,cid:img1相当于图片的占位符,需要使用addInline()方法替换成对应的图片。

    addAttachment()是用来添加附件的,第一个参数是附件名称,第二个是具体的附件内容。

    测试的结果如下:


    四、邮件模板

    考虑一个问题,虽然可以使用MimeMessageHelper来配置邮件的内容为html格式,但是这样并不好维护,更好的办法可以使用邮件模板,将html和发送邮件的java代码分离开。这里分别使用ThymeleafFreeMarker来实现邮件模板的功能。

    1、Thymeleaf邮件模板

    先添加Thymeleaf的依赖:

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

    然后编写一个简单的Thymeleaf邮件模板notice.html,放到resources/templates下:

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>放假通知</title>
    </head>
    <body>
    <div>各位小伙伴们:</div><br>
    <div><span th:text="${festival}"></span>即将到来,在此祝大家节日快乐!</div>
    <div>根据公司安排将于<span style="color: red" th:text="${date}"></span>放假,请知悉。</div>
    </body>
    </html>
    

    其中festivaldate是模板参数,需要发送邮件时传给模板。

    最后就是发送邮件的代码了,这里需要注入Thymeleaf的模板引擎TemplateEngine来完成模板的渲染:

    @Service
    public class MailService {
        @Autowired
        private JavaMailSender javaMailSender;
    
        @Value("${spring.mail.username}")
        private String from;
    
        @Autowired
        private TemplateEngine templateEngine;
    
        public void send3() {
            try {
                MimeMessage mimeMessage = javaMailSender.createMimeMessage();
                MimeMessageHelper mmh = new MimeMessageHelper(mimeMessage, true);
                mmh.setSubject("国庆放假通知");
    
                // 开始配置Thymeleaf邮件模板
                Context context = new Context();
                // 准备邮件模板参数
                Map<String, Object> params = new HashMap<>();
                params.put("festival", "国庆节");
                params.put("date", "2020年10月1日至2020年10月8日");
                // 给模板传递参数
                context.setVariables(params); 
               // 完成模板的渲染
                String process = templateEngine.process("notice.html", context);
                mmh.setText(process, true);
    
                mmh.setFrom(from);
                mmh.setSentDate(new Date());
                mmh.setTo("shehuandev@163.com");
                javaMailSender.send(mimeMessage);
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        }
    }
    

    注意ContextThymeleaf对应包下的类。测试的效果如下:

    2、FreeMarker邮件模板

    FreeMarker邮件模板的用法也类似,先添加对应依赖:

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

    对应的邮件模板如下notice.ftlh,同样放到resources/templates下:

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>放假通知</title>
    </head>
    <body>
    <div>各位小伙伴们:</div><br>
    <div><span>${festival}</span>即将到来,在此祝大家节日快乐!</div>
    <div>根据公司安排将于<span style="color: red">${date}</span>放假,请知悉。</div>
    </body>
    </html>
    

    同样的festivaldate是模板参数。

    发送邮件的代码如下,但FreeMarker邮件模板的配置相对复杂一些,需要我们自己构建模板渲染引擎,具体的代码如下:

    @Service
    public class MailService {
        @Autowired
        private JavaMailSender javaMailSender;
    
        @Value("${spring.mail.username}")
        private String from;
    
        public void send4() {
            try {
                MimeMessage mimeMessage = javaMailSender.createMimeMessage();
                MimeMessageHelper mmh = new MimeMessageHelper(mimeMessage, true);
                mmh.setSubject("国庆放假通知");
    
                // 开始配置FreeMarker邮件模板
                Configuration configuration = new Configuration(Configuration.VERSION_2_3_30);
                configuration.setClassLoaderForTemplateLoading(this.getClass().getClassLoader(), "templates");
                Template template = configuration.getTemplate("notice.ftlh");
                // 准备邮件模板参数
                Map<String, Object> params = new HashMap<>();
                params.put("festival", "国庆节");
                params.put("date", "2020年10月1日至2020年10月8日");
                StringWriter out = new StringWriter();
                // 渲染模板到输出流
                template.process(params, out);
                mmh.setText(out.toString(), true);
    
                mmh.setFrom(from);
                mmh.setSentDate(new Date());
                mmh.setTo("shehuandev@163.com");
                javaMailSender.send(mimeMessage);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    ConfigurationFreeMarker对应包下的类,Configuration.VERSION_2_3_30是使用的FreeMarker的版本号。测试的效果和Thymeleaf的一致。

    相关文章

      网友评论

          本文标题:Spring Boot 整合邮件发送

          本文链接:https://www.haomeiwen.com/subject/wntiyktx.html