Spring Boot实战系列(6)邮件发送

栏目: Java · 发布时间: 5年前

内容简介:本篇主要介绍了Spring Boot中邮件发送,分别讲解了简单的文本邮件、HTML邮件、附件邮件、图片邮件、模板邮件。在模版邮件需要引入

本篇主要介绍了Spring Boot中邮件发送,分别讲解了简单的文本邮件、HTML邮件、附件邮件、图片邮件、模板邮件。

快速导航

添加maven依赖

Spring Boot 项目的 pom.xml 文件中引入 spring-boot-starter-email 依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-email</artifactId>
    <scope>email</scope>
</dependency>
复制代码

模版邮件需要引入 spring-boot-starter-thymeleaf 插件

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
复制代码

配置文件增加邮箱相关配置

163邮箱配置,注意要替换自己的账户信息,password为授权码。

application.yml

spring: 
    mail:
        host: smtp.163.com
        username: your163account@163.com
        password: your163password
        default-encoding: utf-8
复制代码

QQ邮箱发送邮件配置,以下password为授权码

spring:
    mail:
        host: smtp.qq.com
        username: yourqqaccount@qq.com
        password: yourQQpassword
复制代码

项目构建

基于上节单元测试 chapter5-1 代码示例基础之上编写

业务层代码

service目录下创建MailService.java文件,负责业务层邮件发送功能编写

让我们利用Spring提供的 JavaMailSender 接口实现邮件发送,在项目中使用到地方用 @Autowired 注入邮件发送对象

MailService.java

package com.angelo.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;

@Service
public class MailService {

    @Value("${spring.mail.username}")
    private String from;

    @Autowired // 项目启动时将mailSender注入
    private JavaMailSender javaMailSender;

    // ... 下面会一一介绍 ...
}
复制代码

单元测试层代码

test测试目录下创建 MailServiceTest.java 测试类,对业务层代码进行单元测试

MailServiceTest.java

package com.angelo.service;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import javax.annotation.Resource;
import javax.mail.MessagingException;

import java.lang.reflect.Array;

import static org.junit.Assert.*;

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

    @Autowired
    private MailService mailService;

    @Resource
    TemplateEngine templateEngine;

    String to = "your163password@163.com";

    // ... 下面为一一介绍 ...
}
复制代码

五种邮件发送类型讲解

文本邮件

SimpleMailMessage 封装了简单邮件的发送、接收功能、监测异常模块功能,这也是最简单的一种邮件发送,创建一个邮件消息对象,设置邮件的发送者、发送对象、邮件主题、邮件内容。

  • 业务层 MailService.java
/**
 * 发送文本邮件
 * @param to
 * @param subject
 * @param content
 */
public void sendTextMail(String to, String subject, String content) {
    SimpleMailMessage message = new SimpleMailMessage();
    message.setTo(to); // 发送对象
    message.setSubject(subject); // 邮件主题
    message.setText(content); // 邮件内容
    message.setFrom(from); // 邮件的发起者

    javaMailSender.send(message);
}
复制代码

对以上业务代码进行单元测试,查看下效果

  • 单元测试层 MailServiceTest.java
@Test
public void sendTextEmailTest() {
    mailService.sendTextMail(to, "发送文本邮件", "hello,这是Spring Boot发送的一封文本邮件!");
}
复制代码
  • 测试结果
Spring Boot实战系列(6)邮件发送

html邮件

基于 MimeMessageHelper 创建 helper 对象,设置setText第二个参数为true,将会使用html格式打印邮件。

  • 业务层 MailService.java
/**
 * 发送HTMl邮件
 * @param to
 * @param subject
 * @param content
 * @throws MessagingException
 */
public void sendHtmlMail(String to, String subject, String content) throws MessagingException {
    MimeMessage message = javaMailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message, true);
    helper.setFrom(from);
    helper.setTo(to);
    helper.setSubject(subject);
    helper.setText(content, true);

    javaMailSender.send(message);
}
复制代码
  • 单元测试层 MailServiceTest.java
@Test
public void sendHtmlEmailTest() throws MessagingException {
    String content = "<html>" +
            "<body>" +
                "<h1 style=\"" + "color:red;" + "\">hello,这是Spring Boot发送的一封HTML邮件</h1>" +
            "</body></html>";

    mailService.sendHtmlMail(to, "发送HTML邮件", content);
}
复制代码
  • 测试结果

可以看到邮件结果使用了例子中预先设置好的邮件格式

Spring Boot实战系列(6)邮件发送

附件邮件

  • 业务层 MailService.java
/**
     * 发送带附件的邮件
     * @param to
     * @param subject
     * @param content
     * @param filePathList
     * @throws MessagingException
     */
    public void sendAttachmentMail(String to, String subject, String content, String[] filePathList) throws MessagingException {
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true);

        helper.setFrom(from);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(content, true);

        for (String filePath: filePathList) {
            System.out.println(filePath);

            FileSystemResource fileSystemResource = new FileSystemResource(new File(filePath));
            String fileName = fileSystemResource.getFilename();
            helper.addAttachment(fileName, fileSystemResource);
        }

        javaMailSender.send(message);
    }
复制代码

filePathList 写上你的附件文件路径,数组格式。

  • 单元测试层 MailServiceTest.java
@Test
    public void sendAttachmentEmailTest() throws MessagingException {
        String[] filePathList = new String[2];
        filePathList[0] = "/SpringBoot-WebApi/chapter4.zip";
        filePathList[1] = "/SpringBoot-WebApi/chapter5.zip";

        mailService.sendAttachmentMail(to, "发送附件邮件", "hello,这是Spring Boot发送的一封附件邮件!", filePathList);
    }
复制代码
  • 测试结果
Spring Boot实战系列(6)邮件发送

html内嵌图片邮件

也是基于html邮件发送,通过内嵌图片等静态资源,可以直接看到图片。

  • 业务层 MailService.java
/**
     * 发送html内嵌图片的邮件
     * @param to
     * @param subject
     * @param content
     * @param srcPath
     * @param srcId
     * @throws MessagingException
     */
    public void sendHtmlInlinePhotoMail(String to, String subject, String content, String srcPath, String srcId) throws MessagingException {
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true);

        helper.setFrom(from);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(content, true);

        FileSystemResource fileSystemResource = new FileSystemResource(new File(srcPath));
        helper.addInline(srcId, fileSystemResource);

        javaMailSender.send(message);
    }
复制代码

以下单元测试中srcPath为您的本地图片路径,srcId要和上面业务层的 helper.addInline(srcId, fileSystemResource) srcId保持一致。

  • 单元测试层 MailServiceTest.java
@Test
    public void sendHtmlInlinePhotoMailTest() throws MessagingException {
        String srcPath = "/SpringBoot-WebApi/chapter6/img/pic18.jpg";
        String srcId = "pic18";
        String content = "<html>" +
                "<body>" +
                "<h2>hello,这是Spring Boot发送的一封HTML内嵌图片的邮件</h2>" +
                "<img src=\'cid:"+ srcId +"\'></img>" +
                "</body></html>";

        mailService.sendHtmlInlinePhotoMail(to, "发送图片邮件", content, srcPath, srcId);
    }
复制代码
  • 测试结果
Spring Boot实战系列(6)邮件发送

模板邮件

邮件内容相对简单的情况下,我们可以选择使用以上几种简单邮件发送方法,在复杂业务中需要用到html结构,且html里的数据还需要动态修改,还是选择模版邮件,可以使用 Freemarkerthymeleaf 等模板引擎,这里主要介绍使用 thymeleaf

  • 邮件模板编写

resources/templates 目录下新建 emailTemplate.html 文件

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>模板邮件</title>
</head>
<body>
您好,<span th:text="${username}"></span>,欢迎访问我的个人博客:
    <a href="https://github.com/Q-Angelo/summarize">Github</a>、
    <a th:href="@{https://www.imooc.com/u/{id}(id=${id})}" href="#">慕课网</a>
</body>
</html>
复制代码

利用上面介绍的发送html邮件即可,在单元测试文件中增加一个方法进行测试。

  • 单元测试层 MailServiceTest.java
@Test
public void testTemplateEmailTest() throws MessagingException {
    Context context = new Context();
    context.setVariable("username", "张三");
    context.setVariable("id", "2667395");

    String emailContent = templateEngine.process("emailTemplate", context);

    mailService.sendHtmlMail(to, "发送模板邮件", emailContent);
}
复制代码
  • 测试结果
Spring Boot实战系列(6)邮件发送

常见问题

出现这个错误的原因是网易将我发送的邮件当成了垃圾邮件,<<发送163文本邮件>>这是我填写的邮件标题,后来发现网易是对标题里面含了 163 导致的,大家遇到类似问题多检查下。

com.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM 163 smtp10,DsCowADH1MxWegtcyxFjDw--.48939S2 1544256086
复制代码

如遇到什么问题可在下方评论区提问

Github查看本文完整示例 chapter6-1

作者:五月君

链接: www.imooc.com/article/267…

来源:慕课网

Github: Spring Boot实战系列


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Haskell

Haskell

Simon Thompson / Addison-Wesley / 1999-3-16 / GBP 40.99

The second edition of Haskell: The Craft of Functional Programming is essential reading for beginners to functional programming and newcomers to the Haskell programming language. The emphasis is on th......一起来看看 《Haskell》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试