使用SpringBoot发送邮件附件

半城伤御伤魂 提交于 2020-03-12 14:11:15

现在发送邮件是一个网站必备的功能,比如注册激活,或者忘记密码等等都需要发送邮件。正常我们会用JavaMail相关api来写发送邮件的相关代码,但现在springboot提供了一套更简易使用的封装。也就是我们使用SpringBoot来发送邮件的话,代码就简单许多,毕竟SpringBoot是开箱即用的 ,它提供了什么,我们了解之后觉得可行,就使用它,自己没必要再写原生的。

发送邮件流程图

在这里插入图片描述
现在的Java项目大多都是按照MVC架构模型来开发的,但是这里不使用Controller层,是直接在测试中发送邮件,假如测试中发送邮件成功,那么改为用户发送请求来发送邮件也会成功。发送邮件,也就是要有发送方和接收方,我们需要在系统中配置发送方的信息,而接受方的信息我们需要根据从客户端发来的请求决定。作为发送方的我们,需要被授权,被谁授权?

  1. 假如我使用QQ邮箱发送邮件,那么我就需要开启QQ邮箱授权码。
  2. 假如我使用网易邮箱发送邮件,那我就需要开启网易邮箱授权码。

我们接下来就一 一开启这两个邮箱的授权码

  1. 开启QQ邮箱授权码
    在这里插入图片描述
  2. 开启网易邮箱授权码
    在这里插入图片描述

上图的步骤都会生成授权码,我们需要记住它,可以选择保存在本地电脑上,因为我们接下来配置发送方信息需要授权码。
接下来我们就开始编写代码发送邮件,我们使用IDEA创建SpringBoot项目,下篇博客可以快速了解如何在IDEA中创建SpringBoot项目。
SpringBoot快速入门

导入依赖

spring-boot-starter-mail:这个启动器内部封装了发送邮件的代码,必须引入的。
spring-boot-starter-web:这个启动器整合了JavaWeb常用的功能,如果只是简单在测试中发送邮件,那么就不需要引入它。
spring-boot-starter-thymeleaf:模板引擎依赖,如果需要将数据渲染到页面上,就需要引入它。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

配置发送方信息

我们需要在SpringBoot配置文件(application.yml)中配置发送方的信息,包括以下信息:

  1. 用户名:也就是我们的邮箱账号
  2. 密码:我们刚刚生成的授权码
  3. 邮箱主机:配置使用哪个邮箱服务器发送邮件
    还有等等其他可选配置,在下面配置代码中,大家需要填写自己的用户名、密码、from(和用户名一样)。

QQ邮箱配置

spring:
  mail:
    host: smtp.qq.com #发送邮件服务器
    username:  #发送邮件的邮箱地址
    password:   #客户端授权码,不是邮箱密码,这个在qq邮箱设置里面自动生成的
    properties.mail.smtp.port: 465 #端口号465或587
    from:  # 发送邮件的地址,和上面username一致
    properties.mail.smtp.starttls.enable: true
    properties.mail.smtp.starttls.required: true
    properties.mail.smtp.ssl.enable: true
    default-encoding: utf-8

网易邮箱配置

spring:
  mail:
    host: smtp.163.com #发送邮件服务器
    username:  #发送邮件的邮箱地址
    password: #客户端授权码,不是邮箱密码,网易的是自己设置的
    properties.mail.smtp.port: 994 #465或者994
    from:  # 发送邮件的地址,和上面username一致
    properties.mail.smtp.starttls.enable: true
    properties.mail.smtp.starttls.required: true
    properties.mail.smtp.ssl.enable: true
    default-encoding: utf-8

EmailService

我们需要自己封装邮件服务,这个服务只是便于Controller层调用,也就是根据客户端发送的请求来调用,封装三种邮件服务

  1. 发送普通文本邮件
  2. 发送HTML邮件:一般在注册激活时使用
  3. 发送带附件的邮件:可以发送图片等等附件
public interface EmailService {

/**
 * 发送文本邮件
 * @param to 收件人
 * @param subject 主题
 * @param content 内容
 */
void sendSimpleMail(String to, String subject, String content);

/**
 * 发送HTML邮件
 * @param to 收件人
 * @param subject 主题
 * @param content 内容
 */
void sendHtmlMail(String to, String subject, String content);

/**
 * 发送带附件的邮件
 * @param to 收件人
 * @param subject 主题
 * @param content 内容
 * @param filePath 附件
 */
public void sendAttachmentsMail(String to, String subject, String content, String filePath);
}

EmailServiceImpl

我们需要实现上面的邮件服务,在具体的实现里面,则是调用了SpringBoot提供的JavaMailSender(封装了发送邮件的代码)。

@Service
public class EmailServiceImpl implements EmailService {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private JavaMailSender javaMailSender;
	
	//注入配置文件中配置的信息——>from
    @Value("${spring.mail.from}")
    private String from;

    @Override
    public void sendSimpleMail(String to, String subject, String content) {
        SimpleMailMessage message = new SimpleMailMessage();
        //发件人
        message.setFrom(from);
        //收件人
        message.setTo(to);
        //邮件主题
        message.setSubject(subject);
        //邮件内容
        message.setText(content);
        //发送邮件
        javaMailSender.send(message);
    }

    @Override
    public void sendHtmlMail(String to, String subject, String content) {
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper messageHelper;
        try {
            messageHelper = new MimeMessageHelper(message,true);
            messageHelper.setFrom(from);
            messageHelper.setTo(to);
            message.setSubject(subject);
            messageHelper.setText(content,true);
            javaMailSender.send(message);
            logger.info("邮件已经发送!");
        } catch (MessagingException e) {
            logger.error("发送邮件时发生异常:"+e);
        }
    }

    @Override
    public void sendAttachmentsMail(String to, String subject, String content, String filePath) {
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper messageHelper;
        try {
            messageHelper = new MimeMessageHelper(message,true);
            messageHelper.setFrom(from);
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);
            messageHelper.setText(content,true);
            //携带附件
            FileSystemResource file = new FileSystemResource(filePath);
            String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
            messageHelper.addAttachment(fileName,file);

            javaMailSender.send(message);
            logger.info("邮件加附件发送成功!");
        } catch (MessagingException e) {
            logger.error("发送失败:"+e);
        }
    }

}

EmailServiceTest

我们直接在测试中发送邮件,如果测试中发送邮件没问题,那么转为用户请求发送邮件也没有问题的。

@RunWith(SpringRunner.class)
@SpringBootTest
public class EmailServiceTest{

    @Autowired
    private EmailService emailService;

    @Test
    public void sendSimpleEmail(){
        String content = "你好,恭喜你...";
        emailService.sendSimpleMail("XXX@qq.com","祝福邮件",content);
    }

    @Test
    public void sendMimeEmail(){
        String content = "<a href='https://blog.csdn.net/'>你好,欢迎注册网站,请点击链接激活</a>";
        emailService.sendHtmlMail("XXX@163.com","激活邮件",content);
    }

    @Test
    public void sendAttachment(){
        emailService.sendAttachmentsMail("XX@qq.com","发送附件","这是Java体系图","F:/图片/爱旅行.jpg");
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样我们就实现了提供Java代码来发送邮件。发送附件功能其实就是读取我们本地电脑的文件,然后添加到发送流中即可。
发送邮件附件的源代码

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!