zoukankan      html  css  js  c++  java
  • 使用Spring Boot 优雅地发送邮件

    1、前言

           在实际项目中,经常需要用到邮件通知功能。比如,用户通过邮件注册账号,通过邮件找回账号密码等;又比如通过邮件发送系统运行情况,通过邮件发送报表信息,给用户发送营销信息等等,实际应用场景很多,故发送邮件是网站的必备拓展功能之一。
          关于邮件发送的Java API,相信大家对Spring Framework提供的接口 JavaMailSender 都不陌生。那么Spring Boot是否支持开箱即用的邮件发送功能呢?
    答案是肯定的,Spring Boot为发送邮件提供了starter模块spring-boot-starter-mail 。这篇文章,小编就就向大家演示如何通过springboot快速的实现发送电子邮件的功能。      
     

    2、发送邮件

          下面以常用的网易个人邮箱为例,演示如何发送电子邮件。 如果spring.mail.host和相关的库(通过spring-boot-starter-mail定义)都存在,一个默认的JavaMailSender将被创建。该sender可以通过spring.mail命名空间下的配置项进一步自定义,下面具体讲述一下Spring Boot如何实现发送邮件。

    2.1 准备工作

          引入spring-boot-starter-mail依赖,在pom.xml配置文件中增加如下内容:
    <dependency>
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>

     2.2 添加配置

         在application.properties配置文件中加入如下配置,温馨提示,请替换自己的电子邮箱用户名和密码:
    #邮箱环境配置 如何用Spring Boot优雅地发送邮件
    #发送邮件服务器
    spring.mail.host=smtp.163.com
    #发送邮件的邮箱地址
    spring.mail.username=XXX@163.com
    #邮箱密码
    spring.mail.password=yourPassword
    spring.mail.default-encoding=utf-8
    #邮件协议
    spring.mail.protocol=smtps
    #设置ssl端口
    spring.mail.port=465
    # I/O连接超时时间,单位为毫秒,默认为永不超时
    spring.mail.smtp.timeout=1000
    #设置默认的邮件发送源地址
    spring.mail.from=${spring.mail.username}

       这些配置除了spring.mail.from需要手动注入项目,其他项将自动注入,无需人为干预,贴心!如果是QQ邮箱,需要设置yourPassword为QQ官方服务授权码,自己问问度娘吧!自动装载邮件传输协议配置属性的源码:

    org.springframework.boot.autoconfigure.mail.MailSenderPropertiesConfiguration

    打断点并启动系统后,可以看到如下信息:

         下面是发送邮件的接口:

    public interface MailService {
    
        Boolean sendSimpleMail(String to, String subject, String content);
        String sendHtmlEmail(String to, String subject, String content);
        String sendAttachmentsMail(String to, String subject, String content, String filePath);
    }

         下面是实现类,负责创建和发送新的电子邮件消息。

    @Service
    @Slf4j
    public class MailServiceImpl implements MailService {
        @Autowired
        private JavaMailSender javaMailSender;
        @Value("${spring.mail.from}")
        private String from;
        /**
         * 发送普通电子邮件
         * @param to 邮件接收地址
         * @param subject 邮件主题
         * @param content 邮件内容
         * @return 电子邮件是否发送成功
         */
        @Override
        public Boolean sendSimpleMail(String to, String subject, String content) {
            SimpleMailMessage msg = new SimpleMailMessage();
            msg.setFrom(from);
            msg.setTo(to);
            msg.setSubject(subject);
            msg.setText(content);
            try {
                javaMailSender.send(msg);
                log.info("简单邮件已经发送。" + content);
            } catch (MailException ex) {
                log.error("发送失败:" + ex.getMessage());
                return false;
            }
            return true;
        }
        /**
         * 发送HTML邮件
         * @param to
         * @param subject
         * @param content
         * @return
         */
        @Override
        public String sendHtmlEmail(String to, String subject, String content) {
            MimeMessage message = null;
            try {
                message = javaMailSender.createMimeMessage();
                MimeMessageHelper helper = new MimeMessageHelper(message, true);
                helper.setFrom(from);
                
                helper.setTo(to);
                helper.setSubject(subject);
                // 撰写HTML格式的内容
                StringBuffer sb = new StringBuffer("<p style='color:#6db33f'>使用Spring Boot发送HTML格式电子邮件。</p>");
                helper.setText(sb.toString(), true);
                javaMailSender.send(message);
                return "发送成功";
            } catch (Exception e) {
                return e.getMessage();
            }
        }
        /**
         * 发送带附件的邮件
         *
         * @param to
         * @param subject
         * @param content
         * @param filePath
         */
        @Override
        public String sendAttachmentsMail(String to, String subject, String content, String filePath) {
            MimeMessage message = javaMailSender.createMimeMessage();
            try {
                //true表示需要创建一个multipart message
                MimeMessageHelper helper = new MimeMessageHelper(message, true);
                helper.setFrom(from);
                helper.setTo(to);
                helper.setSubject(subject);
                helper.setText(content, true);
    
                FileSystemResource file = new FileSystemResource(new File(filePath));
                String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
                helper.addAttachment(fileName, file);
    
                javaMailSender.send(message);
                log.info("带附件的邮件已经发送。");
            } catch (Exception e) {
                log.error("发送带附件的邮件时发生异常!", e);
                return "失败";
            }
            return "成功";
        }
    }

          简单邮件是没有样式的,很多时候,我们希望发送的邮件内容带有样式,此时可发送HTML邮件,使用第二个函数即可满足需求。如果遇到需要为邮件插入附件的场景,请调用第三个函数。

    3、测试入口类

    @RestController
    @RequestMapping("/sendEmail")
    public class SendEmailsController {
    
        @Autowired
        private MailService mailService;
        private static String to = "yyy@163.com";
        @RequestMapping("/sendSimpleEmail")
        @ResponseBody
        public boolean sendEmail() {
            return mailService.sendSimpleMail(to, "一封文本格式的邮件", "哈哈哈");
        }
        @RequestMapping("/sendHtmlEmail")
        @ResponseBody
        public String sendHtmlEmail() {
            return mailService.sendHtmlEmail(to, "一封HTML格式的邮件", "哈哈哈");
        }
        @GetMapping(value = "/sendAttachmentsMail")
        public String sendAttachmentsMail() {
            return mailService.sendAttachmentsMail(to, "测试发送附件Title",
                    "测试发送附件 title", "C:\Users\20190265\Pictures\15718018.jpg");
        }
    }

         关于在Spring Boot中发送电子邮件的不同姿势,大家有什么看法?欢迎留言讨论,祝各位生活愉快,工作顺利!

    Reference 

          https://blog.yoodb.com/yoodb/article/detail/1412
     
  • 相关阅读:
    fiddler 抓包工具(新猿旺学习总结)
    Monkey之常用ADB命令(新猿旺学习总结)
    APP压力测试 monkey(新猿旺学习总结)
    linux 系统shell运行程序不退出
    c++字节对齐编译器指令#pragma
    vmware 14 新安装centos7 没法联网
    windows dll的def文件
    c编译器字节对齐指令
    centos 7 进入图形界面
    cent os 7 与cent os 6区别
  • 原文地址:https://www.cnblogs.com/east7/p/13357216.html
Copyright © 2011-2022 走看看