使用Spring Boot 优雅地发送邮件

2021-04-12 00:28

阅读:378

标签:chm   失败   发送   artifact   user   tostring   信息   注册账号   个人   

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配置文件中增加如下内容:
org.springframework.boot 
    spring-boot-starter-mail

 2.2 添加配置

     在application.properties配置文件中加入如下配置,温馨提示,请替换自己的电子邮箱用户名和密码:
#邮箱环境配置
#发送邮件服务器
spring.mail.host=smtp.163.com
#发送邮件的邮箱地址
spring.mail.username=XXX@163.com
#邮箱密码
spring.mail.password=yourPassword
spring.mail.default-encoding=utf-8
spring.mail.port=465
spring.mail.protocol=smtps
spring.mail.from=${spring.mail.username}

     这些配置除了spring.mail.from需要手动注入项目,其他项将自动注入,无需人为干预,贴心!如果是QQ邮箱,需要设置yourPassword为QQ官方服务授权码,自己问问度娘吧!下面是发送邮件的接口:

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("

使用Spring Boot发送HTML格式电子邮件。

"); 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
 

使用Spring Boot 优雅地发送邮件

标签:chm   失败   发送   artifact   user   tostring   信息   注册账号   个人   

原文地址:https://www.cnblogs.com/east7/p/13357216.html


评论


亲,登录后才可以留言!