Spring Boot(十):集成邮件发送功能

2,499 阅读3分钟

「这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战」。

在 Spring Boot 项目开发中,或多或少会接触到邮件发送这个功能,若要在 Spring 项目中实现发送邮件,需要封装较为复杂的消息体,但在 Spring Boot 项目中仅需导入第三方依赖以及配置即可完成。

本文以 163 邮箱为例演示邮件发送功能的实现,其他邮箱的配置大同小异。

1. 获取邮箱的授权码

常用的邮件传输协议有 POP3SMTPIMAP,这里选择 SMTP 协议进行演示。

首先我们登录自己的邮箱,在设置中找到协议地址:

然后点击开启服务,获得授权码(授权码仅显示一次,务必保管好):

如下是网易邮箱对应的三种协议主机地址:

2. 引入依赖

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

3. 配置邮箱信息

⭐注意:如下 password 指向的是刚刚保存的授权码,而非个人邮箱密码。

spring:
  mail:
    default-encoding: utf-8
    # 主机地址
    host: smtp.163.com
    # 邮箱名
    username: xxx@163.com
    # 授权码 (非邮箱密码)
    password: xxxxxxxxxxxxxxx

4. 发送邮件

4.1 纯文本邮件

如下封装了 SimpleMailMessage 消息内容,注入 JavaMailSender 并调用其 send() 以完成邮件发送功能。其中收件人和抄送人可支持多个同时发送,多个地址间使用 , 拼接即可:

@RestController
public class EmailController {

    @Autowired
    private JavaMailSender javaMailSender;

    @RequestMapping("/sendMail")
    public void send() {
        SimpleMailMessage message = new SimpleMailMessage();
        // 发件人
        message.setFrom("xxx@163.com");
        // 收件人(可实现批量发送)
        message.setTo("xxx1@qq.com", "xxx2@qq.com");
        // 邮箱标题
        message.setSubject("Java发送邮箱Demo");
        // 邮箱内容
        message.setText("测试 Spring Boot 集成邮箱发送功能的!");
        // 抄送人
        message.setCc("xxx?@163.com");
        // 发送邮件
        javaMailSender.send(message);
    }
}

4.2 HTML 格式邮件⭐

与发送纯文本不同的是,发送 HTML 格式需要创建一个 MIME 消息,并将其注入到 MimeMessageHelper 对象中,但仍是以 JavaMailSender 接口进行发送:

@RestController
public class EmailController {

    @RequestMapping("/sendHtmlMail")
    public void sendHtmlMsg() throws MessagingException {
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper mimeHelper = new MimeMessageHelper(message, true);
        // 发件人
        mimeHelper.setFrom("xxx@163.com");
        // 收件人
        mimeHelper.setTo("xxx@qq.com");
        // 邮箱标题
        mimeHelper.setSubject("Java发送邮箱Demo");
        // 邮箱内容
        mimeHelper.setText("<h2>MimeMessageHelper测试</h2>", true);

        // 仍然使用 JavaMailSender 接口发送邮件
        javaMailSender.send(message);
    }
}

4.3 携带附件的邮件⭐

相对于发送 HTML 仅多增加了 addAttachment() 方法:

@RestController
public class EmailController {

    @Autowired
    private JavaMailSender javaMailSender;
    
	@RequestMapping("/addAttachment")
    public void sendMailWithAttachment() throws MessagingException {
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper mimeWithAttachment = new MimeMessageHelper(message, true);
        // 发件人
        mimeWithAttachment.setFrom("w577159462@163.com");
        // 收件人
        mimeWithAttachment.setTo("577159462@qq.com");
        // 邮箱标题
        mimeWithAttachment.setSubject("发送邮件(带附件)");
        // 邮箱内容
        mimeWithAttachment.setText("添加附件..");

        // 1 附件添加图片
        mimeWithAttachment.addAttachment("1.jpg", new File("D:\\Temp\\_mail\\1.jpg"));
        // 2. 附件添加word文档
        mimeWithAttachment.addAttachment("test.docx", new File("D:\\Temp\\_mail\\test.docx"));

        // 仍然使用 JavaMailSender 接口发送邮件
        javaMailSender.send(message);
    }
}

4.4 内嵌图片邮件

addInline() 实现发送图片:

@RestController
public class EmailController {

    @Autowired
    private JavaMailSender javaMailSender;
    
    @RequestMapping("/embeddedPic")
    public void mailWithEmbeddedPic() throws MessagingException {
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper embeddedPic = new MimeMessageHelper(message, true);
        // 发件人
        embeddedPic.setFrom("xxx@163.com");
        // 收件人
        embeddedPic.setTo("xxx@qq.com");
        // 邮箱标题
        embeddedPic.setSubject("发送邮件(内嵌图片)");
        // 邮箱内容
        embeddedPic.setText("发送内嵌图片..");
        // 添加内嵌图片
        embeddedPic.addInline("img1.jpg", new FileSystemResource("D:\\Temp\\_mail\\1.jpg"));

        // 仍然使用 JavaMailSender 接口发送邮件
        javaMailSender.send(message);
    }

}

至此,我们就在 Spring Boot 环境中快速实现了邮件发送功能,是不是比想象中的还要简单且迅速?!

希望本文对你有所帮助🧠
欢迎在评论区留下你的看法🌊,我们一起讨论与分享🔥