目录
  • 前言
  • 集成步骤
    • 添加依赖
    • 邮件配置信息
    • 邮件配置类
  • 代码实现
    • 发送简单邮件
      • 邮件实体类
      • 业务实现类
      • 测试类
  • 扩展功能
    • 发送Html内容的邮件
      • 业务实现类
      • 测试类
    • 发送带附件邮件
      • 业务实现类
      • 测试类
    • 发送模板邮件
      • 添加依赖
      • 模板内容
      • 业务实现类
      • 测试示例
  • 总结

    前言

    项目中邮件发送为常用功能之一,例如注册成功后需要发送激活邮件,账号的会员到期提示,每日报表统计等功能都需要自动发送邮件,本文将讲解Spring Boot如何实现邮件发送功能。

    集成步骤

    添加依赖

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

    邮件配置信息

    在resource目录下新增mail.properties内容如下:

    #企业邮件配置
    mail.host=smtp.exmail.qq.com
    #端口
    mail.port=587
    mail.userName=xxx.com
    mail.password=yyy
    mail.smtp.timeou=15000
    mail.smtp.auth=false
    mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory

    加载属性文件

    @Component
    @ConfigurationProperties(prefix = "mail")
    @PropertySource(value = { "classpath:mail.properties" })
    public class MailSenderConfig implements Serializable
    {
        private static final long serialVersionUID = -4558468113448742143L;
    
        /**
         * 主机
         */
        private String host;
    
        /**
         * 端口
         */
        private int port;
    
        /**
         * 用户名
         */
        private String userName;
    
        /***
         * 密码
         */
        private String password;
        
        //省略get、set方法
      }

    通过@PropertySource注解加载外部属性文件,不熟悉的朋友可以查看这篇文章。

    邮件配置类

    @Configuration
    public class MailConfig
    {
       @Autowired
       private MailSenderConfig mailSenderConfig;
       
       @Bean
       public JavaMailSenderImpl createMailSender()
       {
           JavaMailSenderImpl javaMailSender =new JavaMailSenderImpl();
           javaMailSender.setDefaultEncoding("UTF-8");
           javaMailSender.setHost(mailSenderConfig.getHost());
           javaMailSender.setPort(mailSenderConfig.getPort());
           javaMailSender.setProtocol(JavaMailSenderImpl.DEFAULT_PROTOCOL);
           javaMailSender.setUsername(mailSenderConfig.getUserName());
           javaMailSender.setPassword(mailSenderConfig.getPassword());
           Properties p = new Properties();
           p.setProperty("mail.smtp.timeout", "25000");
           p.setProperty("mail.smtp.auth", "true");
           p.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
           javaMailSender.setJavaMailProperties(p);
           return javaMailSender;
       }
    }

    注意:JavaMailSenderImpl是JavaMailSender的实现。

    代码实现

    发送简单邮件

    邮件实体类

    public class Mail implements Serializable
    {
        private static final long serialVersionUID = -1001194001681838276L;
        /**
         * 发送者
         */
        private String from;
        /**
         * 接收者
         */
        private String to;
        private String cc;
        private String bcc;
        /**
         * 主题
         */
        private String subject;
        /**
         * 内容
         */
        private String body;
        private String fileName;
        /**
         * 文件路径
         */
        private String filePath;
       //
      } 

    业务实现类

    public interface MailService
    {
        /**
         * 发送简单邮件
         * @param mail
         */
      void sendSimpleMail(Mail mail);
     }
     
     // 实现类
     @Component
    public class MailServiceImpl implements MailService
    {
        private Logger logger = LoggerFactory.getLogger(MailServiceImpl.class);
        
        @Autowired
        private JavaMailSenderImpl mailSender;
        
        @Autowired
        private SpringTemplateEngine templateEngine;
        
        public void sendSimpleMail(Mail mail)
        {
            SimpleMailMessage message = new SimpleMailMessage();
            message.setFrom(mail.getFrom());
            message.setTo(mail.getTo());
            message.setSubject(mail.getSubject());
            message.setText(mail.getBody());
            mailSender.send(message);
            logger.info("发送完毕");
        }
     }

    测试类

    @RestController
    @RequestMapping("mail")
    public class MailController
    {
        @Autowired
        private MailService mailService;
        
        @Async
        @GetMapping("sendSimplEmail")
        public String sendSimplEmail() 
        {
            Mail mail = new Mail();
            mail.setFrom("xx@qq.com);
            mail.setTo("yyy@qq.com");
            mail.setSubject("测试邮件");
            mail.setBody("这是一封测试邮件");
            mailService.sendSimpleMail(mail);
            
            return "发送成功";
        }

    注意:邮件功能需要异步发送,所以采用的@Async注解来实现。

    至此简单的邮件发送功能已经完成。

    扩展功能

    发送Html内容的邮件

    发送简单的邮件,有时候无法满足业务的需求,我们需要至此发送带HTMl内容格式的邮件。

    业务实现类

     public void sendHtmlMail(Mail mail)
        {
            MimeMessage message =mailSender.createMimeMessage();
            MimeMessageHelper messageHelper=null;
            try
            {
                // 设置编码utf-8
                messageHelper = new MimeMessageHelper(message, true, "UTF-8");
                messageHelper.setFrom(mail.getFrom());
                messageHelper.setTo(mail.getTo());
                messageHelper.setSubject(mail.getSubject());
                //转换html
                messageHelper.setText(mail.getBody(),true);
                mailSender.send(message);
            }
            catch (MessagingException e)
            {
                logger.error("发送邮件失败");
                throw new RuntimeException("发送邮件失败",e);
            }
            logger.info("发送完毕");
        }

    注意事项: 1.采用html格式的邮件需要注意内容的格式,采用UTF-8格式否则中文会出现乱码。 2.设置邮件内容时,需要将设置为true,否则html内容会原本输出。

    测试类

       @Async
        @GetMapping("sendHtmlEmail")
        public String sendHtmlEmail() 
        {
            Mail mail = new Mail();
            mail.setFrom("xx@qq.com);
            mail.setTo("yyy@qq.com");
            mail.setSubject("测试html格式邮件");
            String content = "<html>\n" +
                    "<body>\n" +
                    "<h3>hello! 这是测试html内容邮件!</h3>\n" +
                    "</body>\n" +
                    "</html>";
            
            mail.setBody(content);
            mailService.sendHtmlMail(mail);
            
            return "发送成功";
        }

    发送带附件邮件

    业务实现类

       public void sendAttachmentsMail(Mail mail)
        {
            MimeMessage message =mailSender.createMimeMessage();
            MimeMessageHelper messageHelper=null;
            try
            {
                // 设置编码utf-8
                messageHelper = new MimeMessageHelper(message, true, "UTF-8");
                messageHelper.setFrom(mail.getFrom());
                messageHelper.setTo(mail.getTo());
                messageHelper.setSubject(mail.getSubject());
                //转换html
                messageHelper.setText(mail.getBody(),true);
                
                // 附件
                FileSystemResource resourse = new FileSystemResource(new File(mail.getFilePath()));
                // 附件名称和路径
                messageHelper.addAttachment(mail.getFileName(), resourse);
                mailSender.send(message);
            }
            catch (MessagingException e)
            {
                logger.error("发送邮件失败");
                throw new RuntimeException("发送邮件失败",e);
            }
            logger.info("发送完毕");
        }

    测试类

        @Async
        @GetMapping("sendAttachmentsMail")
        public String sendAttachmentsMail() 
        {
            Mail mail = new Mail();
            mail.setFrom("xx@qq.com);
            mail.setTo("yyy@qq.com");
            mail.setSubject("测试附件邮件");
            mail.setBody("测试附件邮件,有附件请下载");
            mail.setFilePath("E:\\cfg\\test.png");
            mail.setFileName("test.png");
            mailService.sendAttachmentsMail(mail);
            return "发送成功";
        }

    注意:设置附件的路径和附件的名称。

    发送模板邮件

    有些特殊需要,我们需要采用固定的邮件模板发送邮件。

    邮件的模板可以采用thymeleaf和freemark来实现,本文将采用thymeleaf来实现邮件模板发送。

    添加依赖

    <!-- thymeleaf 模板 -->
    	<dependency>
    	    <groupId>org.springframework.boot</groupId>
    	    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    	</dependency>
    	
    	<dependency>
    	    <groupId>ognl</groupId>
    	    <artifactId>ognl</artifactId>
    	    <version>3.2.14</version>
    	</dependency>

    模板内容

    模板路径:src/main/resources/templates/emailTemplate.html

    模板内容:

    <!DOCTYPE html>
    <html lang="en"
          xmlns="http://www.w3.org/1999/xhtml"
          xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
        <title>mail</title>
    </head>
    <body>
    
    <table align="center" cellpadding="0" cellspacing="0" width="600px" style="margin-bottom:20px">
        <tr>
            <td>
                <table align="center" border="0" cellpadding="0" cellspacing="0" width="600"
                       style="border-collapse: collapse;">
    
                    <tr>
                        <td bgcolor="#ffffff">
                            <h3>邮件模板</h3>
    
                            <table border="0" cellpadding="0" cellspacing="0" width="100%">
                                <tr>
                                    <td colspan="2" style="padding: 0 0 3px 0">
                                             公司名称:<span th:text="${emailParam.companyName}"></span>
                                    </td>
                                </tr>
                                <tr>
                                    <td style="padding: 12px 0 3px 0">
                                        地址:<span th:text="${emailParam.address}"></span>
                                    </td>
                                </tr>
                                <tr>
                                    <td style="padding: 12px 0 3px">
                                        联系人:<span th:text="${emailParam.phone}"></span>
                                    </td>
                                </tr>
    
                            </table>
                        </td>
                    </tr>
                </table>
            </td>
        </tr>
    
    </table>
    </body>
    </html>

    业务实现类

     public void sendTemplateMail(Mail mail)
        {
            Context context = new Context();
            Map<String, Object> emailParam = new HashMap<>();
            emailParam.put("companyName", "公司名称");
            emailParam.put("address", "公司地址");
            emailParam.put("phone", "联系电话");
            context.setVariable("emailParam", emailParam);
            //模板合成html内容
            String emailTemplate = templateEngine.process("emailTemplate", context);
            mail.setBody(emailTemplate);
            sendHtmlMail(mail);
        }

    测试示例

        @Async
        @GetMapping("sendTemplateEmail")
        public String sendTemplateEmail() 
        {
            Mail mail = new Mail();
            mail.setFrom("xx@qq.com);
            mail.setTo("yyy@qq.com");
            mail.setSubject("测试模板邮件");
            mailService.sendTemplateMail(mail);
            return "发送成功";
        }

    总结

    本文讲解的是Spring Boot集成JavaMailSender发送邮件,邮件内容格式有种,需要结合业务的来选择对应的实现方式。

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。