软件工程应用与实践——邮件发送
Posted 叶卡捷琳堡
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件工程应用与实践——邮件发送相关的知识,希望对你有一定的参考价值。
2021SC@SDUSC
一、概述
在的老年健康管理系统中,在注册和多权限验证时,需要向用户发送邮件验证码。此外,该系统实现了邮件发送附件的功能,经过小组成员讨论,决定由我负责这一部分源代码的阅读和解释
二、代码分析
2.1 SMTP协议
在了解发送邮件的代码之前,需要首先了解邮件发送的SMTP协议。由于本项目中使用java代码利用Spring Boot封装好的类进行邮件发送,而邮件发送基于SMTP协议。
SMTP的全称是,Simple Mail Transfer Protocol,即简单邮件传输协议。SMTP协议定义了邮件客户端软件和SMTP服务器之间,以及SMTP服务器之间互相的通信规则。
以一次邮件发送为例,假设xxx@qq.com要发送一封邮件给yyy@163.com
首先将邮件发送至腾讯的SMTP服务器,之后腾讯的SMTP服务器将邮件发送至网易的SMTP服务器,当163邮箱的用户登录后准备查看邮件时,邮件服务商会为每个用户提供专门的邮件存储空间,网易SMTP服务器收到邮件后,会将邮件保存至相应用户的邮件存储空间中。
SMTP协议有POP3/SMTP和IMAP/SMTP两种。用户读取文件由POP3邮件服务器完成,IMAP协议是对POP3协议的拓展
2.2 邮件发送
在简单理解了SMTP协议后,接下来简述本系统中发送邮件的基本流程和代码分析
1.引入依赖
由于本项目使用Spring Boot,而Spring Boot中对邮件发送已经进行了相应的封装,因此本项目使用spring-boot-starter-mail作为发送邮件的工具
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2.配置基本信息
在引入依赖之后,需要在项目中配置邮件服务器的基本信息
- 在spring.mail.host中配置SMTP服务器的地址
- 在spring.mail.port中配置SMTP服务器的端口
- 在spring.mail.username中配置邮箱的用户名
- 在spring.mail.password中配置密码(特别注意的是,这里的密码并不是邮箱的密码,而是申请SMTP服务时,从邮件服务商那里获取到的授权码)
- 在spring.mail.default-encoding中配置邮件的默认编码为UTF-8
- 在spring.mail.properties.mail.smtp.socketFactory.class中配置SSL连接(即项目连接邮件服务器的方式)
- 在spring.mail.properties.mail.debug中配置日志级别为debug
这里多说一句,Spring Boot中的日志级别有很多种,这里使用debug级别的日志
spring.mail.host=smtp.163.com
spring.mail.port=465
spring.mail.username=xx@163.com
spring.mail.password=xxxxx
spring.mail.default-encoding=UTF-8
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.debug=true
3.邮件发送封装
在本项目中,使用MailService类对邮件的发送进行封装。首先定义一个接口,里面定义了一个sendMail方法,这个方法里各个参数的作用我已经在注释中写清楚了
//发送邮件的类
public interface MailService
{
/*
发送邮件方法的参数
from:邮件发送人
to:邮件收件人
cc:抄送人
subject:邮件主题
content:邮件内容
*/
String sendMail(String from,String to,String cc,String subject,String content);
}
在对应的实现类中,我们可以发现一个使用@Autowired注解自动注入的类JavaMailSender,对于这个类,有以下几点说明
- JavaMailSender是Spring Boot在MailSenderPropertiesConfiguration类中配置好的,而这个类在Mail自动配置类MailSenderAutoConfiguration中导入,因此在代码中,这个类可以直接使用@Autowired注解自动注入
- 由于发送验证码,属于简单邮件,因此在本项目中,直接使用SimpleMailMessage对要发送的消息进行封装,并使用send方法发送该邮件
@Service
@Transactional
public class MailServiceImpl implements MailService
{
@Autowired
JavaMailSender javaMailSender;
@Override
public void sendMail(String from, String to, String cc, String subject, String content) {
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setFrom(from);
simpleMailMessage.setTo(to);
simpleMailMessage.setCc(cc);
simpleMailMessage.setSubject(subject);
simpleMailMessage.setText(content);
javaMailSender.send(simpleMailMessage);
}
}
4.发送验证码
由于要设置发送一个6位纯数字的验证码,因此需要生成随机数。本项目中使用Hutool的RandomUtil类的randomInt方法生成对应的随机数,并将随机数组织为邮件,调用sendMail方法进行发送
public String getValidCode(@PathVariable("userMailAddress") String userMailAddress){
//生成验证码
int validCodeNumber = RandomUtil.randomInt(100000,999999);
String validCode = Convert.toStr(validCodeNumber);
mailService.sendMail("xxx@163.com",userMailAddress,"xxx@163.com","注册验证码","欢迎注册,您的验证码为:" + validCode);
return validCode;
}
2.3 发送带附件的邮件
在老年健康管理系统中,除了发送简单的,仅仅包含文字信息的邮件,还发送了包含附件的邮件,而发送带附件的邮件比发送简单邮件略微复杂一些
发送带附件邮件的方法
该方法同样在MailService类中
- 使用MimeMessage进行邮件配置,构造方法第二个参数true表示构造了一个multipart message类型的邮件,multipart message表示包含多个正文,附件和资源的信息
- 使用addAttachment添加对应的附件(附件即为计算机的文件)
@Override
public void sendFileMail(String from, String to, String subject, String content,File file){
try{
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setFrom(from);
mimeMessageHelper.setTo(to);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(content);
mimeMessageHelper.addAttachment(file.getName(),file);
javaMailSender.send(mimeMessage);
}
catch (MessagingException e){
e.printStackTrace();
}
}
三、总结
本篇博客主要阅读量项目中关于邮件发送这部分的代码,在阅读这部分代码之前,我首先对SMTP协议进行了一定的了解。在目前企业开发中,发送邮件的功能还是很常用的,因此通过阅读这一部分的代码,可以加深对邮件发送功能实现的理解,也为后续开发和实现相关的功能打好基础。
以上是关于软件工程应用与实践——邮件发送的主要内容,如果未能解决你的问题,请参考以下文章