前言

SpringBoot实现邮件功能是非常的方便快捷的,因为SpringBoot默认有starter实现了Mail。
发送邮件应该是网站的必备功能之一,什么注册验证,忘记密码或者是给用户发送营销信息。
最早期的时候我们会使用JavaMail相关api来写发送邮件的相关代码,后来spring退出了
JavaMailSender更加简化了邮件发送的过程,在之后springboot对此进行了封装就有了
现在的spring-boot-starter-mail。

一、基础配置

1.1 引入依赖

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

1.2 获取QQ邮箱授权码

QQ邮箱->设置->账户->POP3/SMTP服务:开启服务后会获得QQ的授权码.

1.3 Mail配置文件

1)qq邮箱的配置

# JavaMailSender 邮件发送的配置
spring.mail.host=smtp.qq.com
spring.mail.username=用户qq邮箱
#QQ邮箱的授权码
spring.mail.password=授权码
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.default-encoding=UTF-8

2)163邮箱配置

spring.mail.host=smtp.163.com
spring.mail.username=用户163邮箱
spring.mail.password=邮箱密码
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.default-encoding=UTF-8

二、实现过程

2.1 配置文件

spring:#邮箱配置mail:host: smtp.qq.comusername: 917484312@qq.com#QQ邮箱的授权码password: 自己申请default-encoding: UTF-8properties:mail:smtp:auth: truestarttls:enable: truerequired: truefreemarker:content-type: text/html#后缀名suffix: .ftltemplate-loader-path: classpath:/templatescharset: UTF-8check-template-location: true#freemarker配置#设置一个邮件发送人
lance:mail:sender: 917484312@qq.com

2.2 实体Bean

/*** @author lance(ZYH)* @function  发送邮件-封装接受者信息* @date 2018-07-07 13:11*/
@Data
public class MailBean implements Serializable {private String recipient;   //邮件接收人private String subject; //邮件主题private String content; //邮件内容}

2.3 发送一个简单格式的邮件

    public void sendSimpleMail(MailBean mailBean) {try {SimpleMailMessage simpleMailMessage = new SimpleMailMessage();//邮件发送人simpleMailMessage.setFrom(MAIL_SENDER);//邮件接收人simpleMailMessage.setTo(mailBean.getRecipient());//邮件主题simpleMailMessage.setSubject(mailBean.getSubject());//邮件内容simpleMailMessage.setText(mailBean.getContent());javaMailSender.send(simpleMailMessage);} catch (Exception e) {logger.error("邮件发送失败", e.getMessage());}}

2.4 发送一个HTML格式的邮件

    public void sendHTMLMail(MailBean mailBean) {MimeMessage mimeMailMessage = null;try {mimeMailMessage = javaMailSender.createMimeMessage();MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);mimeMessageHelper.setFrom(MAIL_SENDER);mimeMessageHelper.setTo(mailBean.getRecipient());mimeMessageHelper.setSubject(mailBean.getSubject());StringBuilder sb = new StringBuilder();sb.append("<h1>SpirngBoot测试邮件HTML</h1>").append("\"<p style='color:#F00'>你是真的太棒了!</p>").append("<p style='text-align:right'>右对齐</p>");mimeMessageHelper.setText(sb.toString(), true);javaMailSender.send(mimeMailMessage);} catch (Exception e) {logger.error("邮件发送失败", e.getMessage());}}

2.5 发送带附件格式的邮件

    public void sendAttachmentMail(MailBean mailBean) {MimeMessage mimeMailMessage = null;try {mimeMailMessage = javaMailSender.createMimeMessage();MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);mimeMessageHelper.setFrom(MAIL_SENDER);mimeMessageHelper.setTo(mailBean.getRecipient());mimeMessageHelper.setSubject(mailBean.getSubject());mimeMessageHelper.setText(mailBean.getContent());//文件路径FileSystemResource file = new FileSystemResource(new File("src/main/resources/static/image/mail.png"));mimeMessageHelper.addAttachment("mail.png", file);javaMailSender.send(mimeMailMessage);} catch (Exception e) {logger.error("邮件发送失败", e.getMessage());}}

效果:

2.6 发送带静态资源的邮件

    public void sendInlineMail(MailBean mailBean) {MimeMessage mimeMailMessage = null;try {mimeMailMessage = javaMailSender.createMimeMessage();MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);mimeMessageHelper.setFrom(MAIL_SENDER);mimeMessageHelper.setTo(mailBean.getRecipient());mimeMessageHelper.setSubject(mailBean.getSubject());mimeMessageHelper.setText("<html><body>带静态资源的邮件内容,这个一张IDEA配置的照片:<img src='cid:picture' /></body></html>", true);//文件路径FileSystemResource file = new FileSystemResource(new File("src/main/resources/static/image/mail.png"));mimeMessageHelper.addInline("picture", file);javaMailSender.send(mimeMailMessage);} catch (Exception e) {logger.error("邮件发送失败", e.getMessage());}}

2.7 发送基于Freemarker模板的邮件

    public void sendTemplateMail(MailBean mailBean) {MimeMessage mimeMailMessage = null;try {mimeMailMessage = javaMailSender.createMimeMessage();MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);mimeMessageHelper.setFrom(MAIL_SENDER);mimeMessageHelper.setTo(mailBean.getRecipient());mimeMessageHelper.setSubject(mailBean.getSubject());Map<String, Object> model = new HashMap<String, Object>();model.put("content", mailBean.getContent());model.put("title", "标题Mail中使用了FreeMarker");Template template = configuration.getTemplate("mail.ftl");String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);mimeMessageHelper.setText(text, true);javaMailSender.send(mimeMailMessage);} catch (Exception e) {logger.error("邮件发送失败", e.getMessage());}}

效果:

2.8 发送基于 thymeleaf为模板的邮件

1)pom中导入thymeleaf的包

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

2)在resorces/templates下创建emailTemplate.html

<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org"><head><meta charset="UTF-8"/><title>Title</title></head><body>您好,这是验证邮件,请点击下面的链接完成验证,<br/><a href="#" th:href="@{ http://www.ityouknow.com/neo/{id}(id=${id}) }">激活账号</a></body>
</html>

3)解析模板并发送

@Test
public void sendTemplateMail() {//创建邮件正文Context context = new Context();context.setVariable("id", "006");String emailContent = templateEngine.process("emailTemplate", context);mailService.sendHtmlMail("ityouknow@126.com","主题:这是模板邮件",emailContent);
}

三、邮件服务的问题

3.1 邮件发送失败

因为各种原因,总会有邮件发送失败的情况,比如:邮件发送过于频繁、网络异常等。在出现这种情况的时候,
我们一般会考虑重新重试发送邮件,会分为以下几个步骤来实现:

  • 接收到发送邮件请求,首先记录请求并且入库。
  • 调用邮件发送接口发送邮件,并且将发送结果记录入库。
  • 启动定时系统扫描时间段内,未发送成功并且重试次数小于3次的邮件,进行再次发送。

3.2 邮件异步发送

很多时候邮件发送并不是我们主业务必须关注的结果,比如通知类、提醒类的业务可以允许延时或者失败。
这个时候可以采用异步的方式来发送邮件,加快主交易执行速度,在实际项目中可以采用MQ发送邮件相关
参数,监听到消息队列之后启动发送邮件。

四、项目代码地址

https://github.com/LanceToBigData/SpringBootLearning/tree/develop/SpringBoot-Mail
个人觉得不错的邮件项目:
https://gitee.com/52itstyle/spring-boot-mail?spm=a2c4e.11153940.blogcont136451.12.523260361fBGiL

SpringBoot整合Mail相关推荐

  1. springboot整合mail邮箱

    sun公司提供了javaMail用来实现邮件发送,但是配置繁琐,spring中提供了javaMailSender用来简化邮件配置,springboot则提供了MailSendAutoConfigura ...

  2. 【springboot】 springboot发送QQ邮件 springboot整合mail教程

    首先需要引入jar包 <!-- 邮件依赖 --><dependency><groupId>org.springframework.boot</groupId& ...

  3. 程序员的浪漫之利用邮件定时表达爱意(SpringBoot整合mail服务)

    获取邮箱安全密码 1.登录qq邮箱 2.点击设置 3.点击账户 4.往下滑找到下图所示位置 点击开启(本人这里开启过了,另外开启过程中会有验证,最后会发给你一个安全密码) 5.建立SpringBoot ...

  4. spring mail 发送html simple,SpringBoot整合Mail邮件发送

    Spring提供了非常好用的JavaMailSender接口实现邮件发送.在Spring Boot的Starter模块中也为此提供了自动化配置. 添加依赖 org.springframework.bo ...

  5. 【SpringBoot】整合mail发送邮件

    大家在平时浏览网页的时候会经常看到这样的功能,在用户注册时需要发送手机验证码,或者邮箱验证码,那么这种功能是如何实现的呢? 验证码一般会有两种: 手机验证码:需要在第三方平台购买,要花钱的 邮箱验证码 ...

  6. SpringBoot中整合Mail实现发送模板邮件

    场景 项目搭建专栏: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/column/info/35688 实现最简单的带标题以及文本内容的邮件发送: https:/ ...

  7. Springboot整合ActiveMQ发送邮件

    虽然ActiveMQ以被其他MQ所替代,但仍有学习的意义,本文采用邮件发送的例子展示ActiveMQ 文章目录 1. 生产者 1.1 引入maven依赖 1.2 application.yml配置 1 ...

  8. SpringBoot整合定时任务和邮件发送(邮箱 信息轰炸 整蛊)

    SpringBoot整合定时任务和邮件发送(邮箱 信息轰炸 整蛊) 目录 SpringBoot整合定时任务和邮件发送(邮箱 信息轰炸 整蛊) 1.概述 2.最佳实践 2.1创建项目引入依赖(mail) ...

  9. SpringBoot整合邮件发送

    本专栏将从基础开始,循序渐进,以实战为线索,逐步深入SpringBoot相关知识相关知识,打造完整的SpringBoot学习步骤,提升工程化编码能力和思维能力,写出高质量代码.希望大家都能够从中有所收 ...

  10. SpringBoot整合JavaMail通过阿里云企业邮箱发送邮件

    JavaMail是Java开发中邮件处理的开源类库,支持常用协议如:SMTP.POP3.IMAP 一.SpringBoot整合 1.需要在pom文件中添加依赖spring-boot-starter-m ...

最新文章

  1. 使用vim打造自己的python编辑器
  2. 视频技术详解:RTMP H5 直播流技术解析
  3. 中文分词算法python_Python FMM算法的中文分词器实现方法源码
  4. 一定要好好学习C语言
  5. Kotlin 1.2 新特性
  6. 杭电4515小Q系列故事——世界上最遥远的距离
  7. 数学分析:函数序列及其一致收敛性
  8. python数据分析与挖掘实战---chapter8中医证型关联规则挖掘
  9. this和that的几点区别
  10. 关于输入阻抗和输出阻抗的理解
  11. 三级等保成标配,互联网医院安全架构报告发布
  12. 幼儿园计算机网络教室工作计划,2017年幼儿园教学工作计划范文
  13. 常用px,pt,em换算表
  14. 设计模式--创建型设计模式
  15. 几何光学类毕业论文文献有哪些?
  16. 大数据入门:Scala大数据黄金语言
  17. NGINX、MongoDB、NPM 开启 Open Core Summit 新篇章
  18. 黑盒测试和白盒测试的优缺点
  19. 使用dot画图的基本方法与模板
  20. 计算机远程控制的好处,如何远程控制电脑 远程控制电脑有什么作用【图解】...

热门文章

  1. Android仿苹果电量显示
  2. 正确使用计算机键盘的方法是,电脑键盘指法练习的方法
  3. Serial Scope——基于QCustomPlot的串口虚拟示波器开发过程
  4. 杭州电子科技大学ACM-1001
  5. SATA协议14种FIS介绍
  6. 海龟编辑器怎么运行html,怎么使用海龟编辑器
  7. Python中使用多个分隔符分隔字符串re.split
  8. Python 转义字符与原字符
  9. Linux电脑怎么接入arm开发板,PC机与ARM开发板之间实现NFS共享
  10. ido 0.5 发布