博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Boot 2.x 图文教程 | 集成邮件发送功能
阅读量:7219 次
发布时间:2019-06-29

本文共 9380 字,大约阅读时间需要 31 分钟。

文章首发自个人微信公众号: 小哈学Java

个人网站:

大家好,后续会间断地奉上一些 Spring Boot 2.x 相关的博文,包括 Spring Boot 2.x 教程和 Spring Boot 2.x 新特性教程相关,如 WebFlux 等。还有自定义 Starter 组件的进阶教程,比如:如何手撸一个自定义图床 Starter 启动器(支持上传到服务器内部,阿里 OSS 和七牛云等), 仅仅需要配置相关参数,就可以将图片上传功能集成到现有的项目中。

好吧,这些都是后话。今天主要来讲讲如何在 Spring Boot 2.x 版本中集成发送邮件功能。

可以说,邮件发送在企业级应用中是比较常见的服务了,如运维报警,用户激活,广告推广等场景,均会使用到它。废话少说,开干!

目录

一、添加依赖

二、添加邮件相关配置

三、关于授权码

  • 3.1 什么是 QQ 邮箱授权码
  • 3.2 如何获取

四、开始编码

  • 4.1 定义功能类
  • 4.2 项目结构
  • 4.3 单元测试,验证效果

五、总结

六、GitHub 源码地址

一、添加依赖

pom.xml 文件中添加 spring-boot-starter-mail 依赖:

org.springframework.boot
spring-boot-starter-mail
复制代码

二、添加邮件相关配置

application.properties 配置文件中添加下面内容:

# 发送邮件的服务器,笔者这里使用的 QQ 邮件spring.mail.host=smtp.qq.comspring.mail.username=你的邮箱地址spring.mail.password=授权码,或邮箱密码spring.mail.properties.mail.smtp.auth=truespring.mail.properties.mail.smtp.starttls.enable=truespring.mail.properties.mail.smtp.starttls.required=true复制代码

yml 格式的配置文件,添加如下:

spring:  mail:    host: smtp.qq.com #发送邮件的服务器,笔者这里使用的 QQ 邮件    username: 你的邮箱地址    password: 授权码,或邮箱密码    properties.mail.smtp.auth: true    properties.mail.smtp.starttls.enable: true    default-encoding: utf-8复制代码

三、关于授权码

对于上面的配置,您肯定对密码配置那块还抱有疑问,如果您使用的是 163 邮箱,或者 Gmail 邮箱,直接使用密码就可以了,如果您使用的是 QQ 邮箱,则需要先获取授权码。

到底什么事授权码? :

3.1 什么是 QQ 邮箱授权码

下图截自 QQ 邮箱官方文档:

什么是授权码

3.2 如何获取

登录 QQ 邮箱:

设置

点击设置:

账户

跳转页面后,点击账户,将页面往下拖动,您会看到:

开启 smtp 服务

验证成功过后,即可获取授权码:

获取授权码

四、开始编码

4.1 定义功能类

先定义一个邮件服务的接口类, MailService.java:

package site.exception.springbootmail.service;/** * @author 犬小哈(微信号: 小哈学Java) * @site 个人网站: www.exception.site * @date 2019/4/10 * @time 下午4:19 * @discription **/public interface MailService {    /**     * 发送简单文本的邮件     * @param to     * @param subject     * @param content     * @return     */    boolean send(String to, String subject, String content);    /**     * 发送 html 的邮件     * @param to     * @param subject     * @param html     * @return     */    boolean sendWithHtml(String to, String subject, String html);    /**     * 发送带有图片的 html 的邮件     * @param to     * @param subject     * @param html     * @param cids     * @param filePaths     * @return     */    boolean sendWithImageHtml(String to, String subject, String html, String[] cids, String[] filePaths);    /**     * 发送带有附件的邮件     * @param to     * @param subject     * @param content     * @param filePaths     * @return     */    boolean sendWithWithEnclosure(String to, String subject, String content, String[] filePaths);}复制代码

接口内定义了四个方法:

  1. send(): 发送简单文本的邮件;
  2. sendWithHtml(): 发送 html 的邮件;
  3. sendWithImageHtml(): 发送带有图片的 html 的邮件;
  4. sendWithWithEnclosure: 发送带有附件的邮件;

完成接口的定义以后,我们再定义一个具体实现类,MailServiceImpl.java:

package site.exception.springbootmail.service.impl;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.autoconfigure.mail.MailProperties;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 org.springframework.util.Assert;import site.exception.springbootmail.service.MailService;import javax.mail.internet.MimeMessage;/** * @author 犬小哈(微信号: 小哈学Java) * @site 个人网站: www.exception.site * @date 2019/4/10 * @time 下午4:19 * @discription **/@Servicepublic class MailServiceImpl implements MailService {    private final static Logger logger = LoggerFactory.getLogger(MailServiceImpl.class);    @Autowired    private MailProperties mailProperties;    @Autowired    private JavaMailSender javaMailSender;    /**     * 发送简单文本的邮件     * @param to     * @param subject     * @param content     * @return     */    @Override    public boolean send(String to, String subject, String content) {        logger.info("## Ready to send mail ...");        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();        // 邮件发送来源        simpleMailMessage.setFrom(mailProperties.getUsername());        // 邮件发送目标        simpleMailMessage.setTo(to);        // 设置标题        simpleMailMessage.setSubject(subject);        // 设置内容        simpleMailMessage.setText(content);        try {            // 发送            javaMailSender.send(simpleMailMessage);            logger.info("## Send the mail success ...");        } catch (Exception e) {            logger.error("Send mail error: ", e);            return false;        }        return true;    }    /**     * 发送 html 的邮件     * @param to     * @param subject     * @param html     * @return     */    @Override    public boolean sendWithHtml(String to, String subject, String html) {        logger.info("## Ready to send mail ...");        MimeMessage mimeMessage = javaMailSender.createMimeMessage();        MimeMessageHelper mimeMessageHelper = null;        try {            mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);            // 邮件发送来源            mimeMessageHelper.setFrom(mailProperties.getUsername());            // 邮件发送目标            mimeMessageHelper.setTo(to);            // 设置标题            mimeMessageHelper.setSubject(subject);            // 设置内容,并设置内容 html 格式为 true            mimeMessageHelper.setText(html, true);            javaMailSender.send(mimeMessage);            logger.info("## Send the mail with html success ...");        } catch (Exception e) {            e.printStackTrace();            logger.error("Send html mail error: ", e);            return false;        }        return true;    }    /**     * 发送带有图片的 html 的邮件     * @param to     * @param subject     * @param html     * @param cids     * @param filePaths     * @return     */    @Override    public boolean sendWithImageHtml(String to, String subject, String html, String[] cids, String[] filePaths) {        logger.info("## Ready to send mail ...");        MimeMessage mimeMessage = javaMailSender.createMimeMessage();        MimeMessageHelper mimeMessageHelper = null;        try {            mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);            // 邮件发送来源            mimeMessageHelper.setFrom(mailProperties.getUsername());            // 邮件发送目标            mimeMessageHelper.setTo(to);            // 设置标题            mimeMessageHelper.setSubject(subject);            // 设置内容,并设置内容 html 格式为 true            mimeMessageHelper.setText(html, true);            // 设置 html 中内联的图片            for (int i = 0; i < cids.length; i++) {                FileSystemResource file = new FileSystemResource(filePaths[i]);                // addInline() 方法 cid 需要 html 中的 cid (Content ID) 对应,才能设置图片成功,                // 具体可以参见,下面 4.3.3 单元测试的参数设置                mimeMessageHelper.addInline(cids[i], file);            }            javaMailSender.send(mimeMessage);            logger.info("## Send the mail with image success ...");        } catch (Exception e) {            e.printStackTrace();            logger.error("Send html mail error: ", e);            return false;        }        return true;    }    /**     * 发送带有附件的邮件     * @param to     * @param subject     * @param content     * @param filePaths     * @return     */    @Override    public boolean sendWithWithEnclosure(String to, String subject, String content, String[] filePaths) {        logger.info("## Ready to send mail ...");        MimeMessage mimeMessage = javaMailSender.createMimeMessage();        MimeMessageHelper mimeMessageHelper = null;        try {            mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);            // 邮件发送来源            mimeMessageHelper.setFrom(mailProperties.getUsername());            // 邮件发送目标            mimeMessageHelper.setTo(to);            // 设置标题            mimeMessageHelper.setSubject(subject);            // 设置内容            mimeMessageHelper.setText(content);            // 添加附件            for (int i = 0; i < filePaths.length; i++) {                FileSystemResource file = new FileSystemResource(filePaths[i]);                String attachementFileName = "附件" + (i + 1);                mimeMessageHelper.addAttachment(attachementFileName, file);            }            javaMailSender.send(mimeMessage);            logger.info("## Send the mail with enclosure success ...");        } catch (Exception e) {            logger.error("Send html mail error: ", e);            return false;        }        return true;    }}复制代码

4.2 项目结构

完成上面功能类的编码后,看下项目结构如下:

项目结构

4.3 单元测试,验证效果

4.3.1 简单文本发送

简单文本发送

填写相关测试参数,包括目标邮箱地址,标题,内容,运行单元测试:

单元测试通过

单元测试通过,再看下实际效果:

简单文本发送效果

邮件正常发送。

4.3.2 发送 Html

发送 html

填写相关测试参数,包括目标邮箱地址,标题,html 内容,运行单元测试通过,直接看效果:

发送 html 效果

可以看到,邮件发送成功!

4.3.3 发送带有图片的 Html

发送带图片的html

填写相关测试参数,包括目标邮箱地址,标题,html 内容,html 中包含了两张图片,并且 src 中的内容是 cid:{flag}的格式,前缀 cid:是固定的,您需要改变是后面的标志位,通过 addInline(cid, file) 来将 cid 和具体的图片文件对应起来。

运行单元测试通过,看看效果如何:

发送带图片的html效果

可以看到 html 中图片也是 OK 的。

PS: 这里笔者在测试发送给 QQ 邮箱的时候,图片显示不成功,暂时还没找到问题在哪,如果有哪位读者知道,不妨后台发个消息告诉一下笔者哈。

4.3.4 发送带有附件的邮件

发送带有附件的邮件
填写相关测试参数,包括目标邮箱地址,标题,内容,并添加了两个附件,运行单元测试,看看实际效果:

发送带有附件的邮件效果

发送成功,到此所有的单元测试全部运行通过。

五、总结

本文中,我们学习如何在 Spring Boot 2.x 版本中集成发送邮件功能,包括发送简单文本,Html 内容,带有图片的 Html 内容,以及带有的附加的邮件,希望对您有所帮助!

六、GitHub 源码地址

七、赠送 | 面试&学习福利资源

最近在网上发现一个不错的 PDF 资源《Java 核心面试知识.pdf》分享给大家,不光是面试,学习,你都值得拥有!!!

获取方式: 关注公众号: 小哈学Java, 后台回复 资源,既可获取资源链接,下面是目录以及部分截图:

福利资源截图

福利资源截图

福利资源截图

福利资源截图

福利资源截图

福利资源截图

福利资源截图

重要的事情说两遍,获取方式: 关注公众号: 小哈学Java, 后台回复 资源,既可获取资源链接 !!!

欢迎关注微信公众号: 小哈学Java

小哈学Java

转载于:https://juejin.im/post/5cb2bb45e51d456e3428c0d7

你可能感兴趣的文章
java主函数的含义
查看>>
中国大学MOOC —— 学习笔记(四)
查看>>
访问,ringbtn,
查看>>
致橡树
查看>>
一段测试代码,哦哦哦,
查看>>
uiimagepickercontroller,中文,--》摘
查看>>
第四次作业
查看>>
在python中调用js或者nodejs
查看>>
【年终总结】2年计划还是要有的,万一实现了呢?(转自叶小钗)
查看>>
数字图像处理学习笔记(1.1)---位图的读写、几何变换、傅里叶变换、直方图均衡...
查看>>
javascript数组顺序-----1冒泡的另一种比较好理解的写法
查看>>
数据结构-栈的实现之行编译器核心实现
查看>>
C++ Project 积累(2)
查看>>
(1)用VisualSvn Server,Tortoise Svn,AnkhSvn搭建Svn版本控制
查看>>
Mysql索引
查看>>
格式化输出
查看>>
hdu 3804 Query on a tree (树链剖分+线段树)
查看>>
定位、指南针、地理编码
查看>>
Kafka 简介
查看>>
MySQL 用户连接与用户线程
查看>>