zoukankan      html  css  js  c++  java
  • 最简单的 springboot 发送邮件,使用thymeleaf模板

    1,导入需要的包

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

    2,添加配置

    添加配置前先要到邮箱设置里开启SMTP服务

    application.yml

    spring:
      mail:
        host: smtp.qq.com
        username: xxxxxxx@qq.com #发送邮件人的邮箱
        password: xxxxx #这个密码是邮箱设置里SMTP服务生成的授权码
        default-encoding: UTF-8

     3,编写发送邮箱的类

     接收类MailDO.java

    package com.bootdo.oa.domain;
    
    import java.util.Map;
    
    /**
     * 邮件接收参数
     */
    
    public class MailDO {
    
        //标题
        private String title;
        //内容
        private String content;
        //接收人邮件地址
        private String email;
        //附加,value 文件的绝对地址/动态模板数据
        private Map<String, Object> attachment;
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public Map<String, Object> getAttachment() {
            return attachment;
        }
    
        public void setAttachment(Map<String, Object> attachment) {
            this.attachment = attachment;
        }
    }

    MailService.java

    package com.bootdo.oa.service;
    
    import com.bootdo.oa.domain.MailDO;
    
    public interface MailService {
    
        void sendTextMail(MailDO mailDO);
    
        void sendHtmlMail(MailDO mailDO,boolean isShowHtml);
    
        void sendTemplateMail(MailDO mailDO);
    }

    MailServiceImpl.java

    package com.bootdo.oa.service.impl;
    
    import com.bootdo.common.exception.SystemException;
    import com.bootdo.oa.domain.MailDO;
    import com.bootdo.oa.service.MailService;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.core.io.FileSystemResource;
    import org.springframework.mail.MailException;
    import org.springframework.mail.SimpleMailMessage;
    import org.springframework.mail.javamail.JavaMailSender;
    import org.springframework.mail.javamail.MimeMessageHelper;
    import org.springframework.scheduling.annotation.Async;
    import org.springframework.stereotype.Service;
    import org.thymeleaf.TemplateEngine;
    import org.thymeleaf.context.Context;
    
    import javax.mail.MessagingException;
    import javax.mail.internet.MimeMessage;
    import java.io.File;
    
    /**
     * 发送邮件
     */
    @Service
    public class MailServiceImpl implements MailService {
    
        private final static Logger log = LoggerFactory.getLogger(MailServiceImpl.class);
    
        //template模板引擎
        @Autowired
        private TemplateEngine templateEngine;
    
        @Autowired
        private JavaMailSender javaMailSender;
    
        @Value("${spring.mail.username}")
        private String from;
    
        /**
         * 纯文本邮件
         * @param mail
         */
        @Async //不解释不懂自行百度,友情提示:有坑
        @Override
        public void sendTextMail(MailDO mail){
            //建立邮件消息
            SimpleMailMessage message = new SimpleMailMessage();
            message.setFrom(from); // 发送人的邮箱
            message.setSubject(mail.getTitle()); //标题
            message.setTo(mail.getEmail()); //发给谁  对方邮箱
            message.setText(mail.getContent()); //内容
            try {
                javaMailSender.send(message); //发送
            } catch (MailException e) {
                log.error("纯文本邮件发送失败->message:{}",e.getMessage());
                throw new SystemException("邮件发送失败");
            }
        }
    
        /**
         * 发送的邮件是富文本(附件,图片,html等)
         * @param mailDO
         * @param isShowHtml 是否解析html
         */
        @Async
        @Override
        public void sendHtmlMail(MailDO mailDO, boolean isShowHtml) {
            try {
                MimeMessage mimeMessage = javaMailSender.createMimeMessage();
                //是否发送的邮件是富文本(附件,图片,html等)
                MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage,true);
                messageHelper.setFrom(from);// 发送人的邮箱
                messageHelper.setTo(mailDO.getEmail());//发给谁  对方邮箱
                messageHelper.setSubject(mailDO.getTitle());//标题
                messageHelper.setText(mailDO.getContent(),isShowHtml);//false,显示原始html代码,无效果
                //判断是否有附加图片等
                if(mailDO.getAttachment() != null && mailDO.getAttachment().size() > 0){
                    mailDO.getAttachment().entrySet().stream().forEach(entrySet -> {
                        try {
                            File file = new File(String.valueOf(entrySet.getValue()));
                            if(file.exists()){
                                messageHelper.addAttachment(entrySet.getKey(), new FileSystemResource(file));
                            }
                        } catch (MessagingException e) {
                            log.error("附件发送失败->message:{}",e.getMessage());
                            throw new SystemException("附件发送失败");
                        }
                    });
                }
                //发送
                javaMailSender.send(mimeMessage);
            } catch (MessagingException e) {
                log.error("富文本邮件发送失败->message:{}",e.getMessage());
                throw new SystemException("邮件发送失败");
            }
        }
    
        /**
         * 发送模板邮件 使用thymeleaf模板
         * 若果使用freemarker模板
         *     Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
         *     configuration.setClassForTemplateLoading(this.getClass(), "/templates");
         *     String emailContent = FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate("mail.ftl"), params);
         * @param mailDO
         */
        @Async
        @Override
        public void sendTemplateMail(MailDO mailDO) {
            try {
                MimeMessage mimeMessage = javaMailSender.createMimeMessage();
                MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage,true);
                messageHelper.setFrom(from);// 发送人的邮箱
                messageHelper.setTo(mailDO.getEmail());//发给谁  对方邮箱
                messageHelper.setSubject(mailDO.getTitle()); //标题
                //使用模板thymeleaf
                //Context是导这个包import org.thymeleaf.context.Context;
                Context context = new Context();
                //定义模板数据
                context.setVariables(mailDO.getAttachment());
                //获取thymeleaf的html模板
                String emailContent = templateEngine.process("/mail/mail",context); //指定模板路径
                messageHelper.setText(emailContent,true);
                //发送邮件
                javaMailSender.send(mimeMessage);
            } catch (MessagingException e) {
                log.error("模板邮件发送失败->message:{}",e.getMessage());
                throw new SystemException("邮件发送失败");
            }
        }
    }

    差点忘了还有个模板 mail.html

    放在templates/mail目录下

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>title</title>
    </head>
    <body>
        <h3>你看我<span style="font-size: 35px" th:text="${username}"></span>, 哈哈哈!</h3>
    </body>
    </html>

    4,测试

    单元测试启动太慢了,直接写controller测试

       @GetMapping("/testMail")
        public R mail(MailDO mailDO){
            try {
                mailService.sendTextMail(mailDO);
            } catch (Exception e) {
                return R.error(e.getMessage());
            }
            return R.ok();
        }
    
        @GetMapping("/htmlMail")
        public R mail(MailDO mailDO){
            try {
                Map<String,Object> map = new HashMap<>();
                map.put("附件名","附件的绝对路径");
                mailDO.setAttachment(map);
                mailService.sendHtmlMail(mailDO,false);
            } catch (Exception e) {
                return R.error(e.getMessage());
            }
            return R.ok();
        }
    
    
       @GetMapping("/templateMail")
        public R mail(MailDO mailDO){
            try {
                Map<String,Object> map = new HashMap<>();
                map.put("username","我变大了");
                mailDO.setAttachment(map);
                mailService.sendTemplateMail(mailDO);
            } catch (Exception e) {
                return R.error(e.getMessage());
            }
            return R.ok();
        }

    5,测试结果

    收工。

  • 相关阅读:
    [模板] Miller_Rabin素数判断代码实现存档
    [模板] KMP字符串匹配标准代码
    [模板] 二分图匹配问题——匈牙利算法
    [原博客存档] [模板] 矩阵快速幂
    matplotlib 随记
    23种设计模式
    26、Android--AsyncTask
    25、Android--Handler
    24、Android--SurfaceView
    23、Android--WebView
  • 原文地址:https://www.cnblogs.com/chancy/p/10456210.html
Copyright © 2011-2022 走看看