软件工程应用与实践(7)——邮件发送

软件工程应用与实践(7)——邮件发送,第1张

软件工程应用与实践(7)——邮件发送

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协议进行了一定的了解。在目前企业开发中,发送邮件的功能还是很常用的,因此通过阅读这一部分的代码,可以加深对邮件发送功能实现的理解,也为后续开发和实现相关的功能打好基础。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5435072.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存