SpringBoot邮件服务(一):发送第一封邮件

474 阅读3分钟

这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

作为一名合格的后端开发程序员,不能不会在项目中发送邮件。注册登录的邮箱验证提升项目体验,定期的巡检邮件帮助开发人员关注项目质量,必要的报警邮件降低服务宕机危害。可谓是邮件用的好,服务坏不了!

1.常见邮件协议

1.1 STMP

STMP,Simple Mail Transfer Protocl,即简单邮件传输协议,是一种从源地址到目的地址传输邮件的规范,控制邮件的发送过程和中转方式。为了减少使用过程中的垃圾邮件,STMP认证时需要提供账号和密码登录服务器。

1.2 IMAP

IMAP,Internet Message Access Protocol,即互联网邮件访问协议,该协议用于从服务器上获取和下载邮件信息。

1.3 POP3

POP3,Post Office Protocol 3,叫做邮局协议,也是一种获取和下载服务器邮件信息的协议。与IMAP协议不同的是,POP3是一种单向通信,客户端可以从服务器中获取信息,但是客户端的操作并不会同步到服务器中;而IMAP协议是一种双向通信的协议。

2. 邮箱授权码

使用邮箱发送邮件时,可以使用账号+密码的方式登录邮箱,也可以使用账号+授权码的方式登录。其中授权码使用更加灵活,不需要暴露真实密码信- POP3/SMTP/IMAP息,保证安全性。

2.1 @163邮箱

以163邮箱为例,网页版登录邮箱之后,点击设置 -> POP3/SMTP/IMAP选项,进入页面后可以开启IMAP/SMTP服务和POP3/SMTP服务,开启后在页面中管理授权密码。

image.png

3. SpringBoot中邮件使用流程

3.1 引入依赖信息

SpringBoot中为邮件服务提供了专门的启动器依赖包,只需要在maven项目的pom.xml文件中引入即可使用提供的邮件服务。

<!--邮件依赖信息-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

3.2 增加配置信息

使用邮件服务时,需要提供邮箱账号和密码(或授权码)来登录后发送邮件,相关信息只需要配置在SpringBoot的application.properties配置文件中即可。

#SMTP服务器地址
spring.mail.host= smtp.163.com
# 账号
spring.mail.username= xxxx
# 登录密码或授权密码
spring.mail.password= VBBDHWGAAAAAAA
# 邮件编码
spring.mail.default-encoding=UTF-8
# 发送邮件账号
spring.mail.properties.from = xxxx@163.com

3.3 JavaMailSender

SpringBoot中提供了集成邮件服务的JavaMailSender接口和其实现类JavaMailSenderImpl,可以快速高效的完成邮件的发送。

实际使用时,只需要将JavaMailSender注入,定义其中需要的相关属性并发送邮件到指定邮箱即可。

3.4 邮件发送逻辑处理

定义一个MailService用来执行属性赋值和发送邮件的逻辑

@Component
public class MailService{
    private final Logger logger = LoggerFactory.getLogger(MailService.getClass());
    
    @Autowired
    private JavaMailSender mailSender;

    @Value("${mail.fromMail.from}")
    private String from;

    public void sendMail(String to, String subject, String content) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);
        message.setTo(to);
        message.setSubject(subject);
        message.setText(content);

        try {
            mailSender.send(message);
        } catch (Exception e) {
            logger.error("发送邮件时发生异常!", e);
        }

    }
}

其中,邮箱账户密码等信息会根据文件中的设置自动配置,发送邮件邮箱通过@Value注解获取注入字段中,其他信息在调用sendMail()方法时作为参数传递。

3.5 发送邮件

定义测试类,测试邮件发送功能。

@SpringBootTest
public class MailServiceTest {
    @Autowired
    private MailService MailService;

    @Test
    public void testSendMail() throws Exception {
        MailService.sendMail("123123@qq.com","test mail"," hello jue jin!");
    }
}

执行单元测试后,目标邮箱中会收到邮件信息。

image.png