使用 SpringBoot 发送应用系统邮件

Tue, May 17, 2022

前言

在一些特定的场景下是需要发送邮件的。比如系统的报警、用户反馈的提醒等等。那么在 SpringBoot 项目中怎么实现呢?

准备

先准备发送的邮箱和密码。这里我建议使用客户端专用密码,没有过期的烦恼。也不会暴露原始的密码。以 腾讯企业邮 为例。 申请发送邮箱需要先绑定微信,才能生成。这里是比较坑的一点,但也是安全起见吧,如果是公司需要申请一下,绑定系统维护人员微信即可。具体设置如下图: pass_setting

导入相应的包

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

根据 官方文档,这里使用的是 JavaMail / Jakarta Mail 1.6 。有兴趣的可以自行了解。

创建 util 包

由于个人习惯的问题,喜欢把这些非业务功能封装成工具类,由于是工具类,那么就不使用依赖注入和查找了。直接使用了 new JavaMailSenderImpl() ,具体 demo 如下。

@Slf4j
public class SendEmailUtil {

    public static void sendEmail(String to, String subject, String content) throws MessagingException {
        JavaMailSenderImpl sender = new JavaMailSenderImpl();
        sender.setPassword("专用密码"); // 密码
        sender.setPort(465);
        sender.setUsername("xxx@xxxxxbbb.com"); // 发送者邮箱
        sender.setHost("smtp.exmail.qq.com");
        sender.setProtocol("smtps"); // 协议
        MimeMessage message = sender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message);

        helper.setFrom("xxx@xxxxxbbb.com"); // 发送者邮箱
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(content);

        sender.send(message);
    }
}

为什么协议要使用 smtps 呢? 根据 wiki 上解释来看

Some email service providers allow their customers to use the SMTPS protocol to access a TLS-encrypted version of the “submission” service on port 465.

一些邮件服务允许在 465 端使用 SMTPS 协议。 而腾讯企业使用的端口就是 465。

使用

使用以下代码便可收到邮件

SendEmailUtil.sendEmail("aa@qq.com", "aa", "content");

将 “aa@qq.com” 替换成你自己的邮箱便能收到邮件了。