2021SC@SDUSC
- 一、概述
- 二、代码分析
- 2.1 SMTP协议
- 2.2 邮件发送
- 2.3 发送带附件的邮件
- 三、总结
在的老年健康管理系统中,在注册和多权限验证时,需要向用户发送邮件验证码。此外,该系统实现了邮件发送附件的功能,经过小组成员讨论,决定由我负责这一部分源代码的阅读和解释
二、代码分析 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作为发送邮件的工具
org.springframework.boot spring-boot-starter-mail
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 { 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协议进行了一定的了解。在目前企业开发中,发送邮件的功能还是很常用的,因此通过阅读这一部分的代码,可以加深对邮件发送功能实现的理解,也为后续开发和实现相关的功能打好基础。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)