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

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

以上是关于软件工程应用与实践——邮件发送的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何使用 Outlook 发送代码片段?

超实用的php代码片段

Javascript - 使用 HTML 片段通过电子邮件发送 JSON 输出

用python实现自动发邮件的功能

20155227《网络对抗》Exp2 后门原理与实践

向大量收件人发送电子邮件的最佳实践 (Rails + SendGrid)