项目中经常使用邮件发送提醒功能,比如说更新安全机制,发送邮件通知用户等

一、简单邮件发送

导入依赖:

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

application配置信息

#邮件发送
#邮箱服务器地址
spring.mail.host=smtp.163.com
# 设置用户名
spring.mail.username=xxxxxx@qq.com
# 设置密码
spring.mail.password=XXXXXXX
spring.mail.default-encoding=UTF-8
mail.from=${spring.mail.username}
mail.to=xxxxxx@qq.com

163的服务器信息如下:需要登录163设置个人邮箱配置打开SMTP

接收服务器pop3.163.com
发送服务器smtp.163.com

简单邮件发送:

@Slf4j
@Component
public class JavaSimpleEmailSend { @Autowired
private JavaMailSender javaMailSender; @Value("${mail.from}")
private String from; @Value("${mail.to}")
private String to; public void sendSimpleMail(String subject, String content) {
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setFrom(from);
mailMessage.setTo(to);
mailMessage.setSubject(subject);
mailMessage.setText(content);
javaMailSender.send(mailMessage);
log.info("sendSimpleMail 已发送!");
}

Test:

@RunWith(SpringRunner.class)
@SpringBootTest
public class EmailTest { @Autowired
JavaSimpleEmailSend simpleEmailSend; @Test
public void simpleEmailSend(){
simpleEmailSend.sendSimpleMail("Springboot test sendSimpleMail","hello! myselef!");
}

带HTMl邮件发送

public void sendHtmlMail(String subject, String content) {
MimeMessage message = javaMailSender.createMimeMessage();
try {
//true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
javaMailSender.send(message);
log.info("html邮件发送成功");
} catch (MessagingException e) {
log.error("sendHtmlMail发送html邮件时发生异常!", e);
}
}

test:

@Test
public void sendHtmlMail(){
String context = "<html>\n" +
"<body>\n" +
"<h3>hello! myselef!</h3>\n" +
"</body>\n" +
"</html>";
simpleEmailSend.sendHtmlMail("Springboot test sendHtmlMail",context);
}

带附件的邮件发送

public void sendAttachmentsMail(String subject, String content,String filePath) {
MimeMessage message = javaMailSender.createMimeMessage();
try {
//true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
//根据文件路径获取文件
FileSystemResource file = new FileSystemResource(new File(filePath));
//获取文件名
String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
helper.addAttachment(fileName, file);//添加附件
//添加附件2
String fileName2 = filePath.substring(filePath.lastIndexOf(File.separator));
helper.addAttachment(fileName2, file);//添加附件2
javaMailSender.send(message);
log.info("带附件的邮件已经发送成功");
} catch (MessagingException e) {
log.error("sendAttachmentsMail发送带附件的邮件时发生异常!", e);
}
}

test:

@Test
public void sendAttachmentsMail(){
String context = "<html>\n" +
"<body>\n" +
"<h3>hello! myselef!</h3>\n" +
"</body>\n" +
"</html>";
String filePath = "D:\\img\\D0145151.img";
simpleEmailSend.sendAttachmentsMail("Springboot test sendAttachmentsMail",context,filePath);
}

带静态资源的邮件发送

public void sendInlineResourceMail(String subject, String content,String filePath,String contentId) {
MimeMessage message = javaMailSender.createMimeMessage();
try {
//true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
//根据文件路径获取文件
FileSystemResource file = new FileSystemResource(new File(filePath));
helper.addInline(contentId,file);//添加静态资源 //添加多个静态资源
FileSystemResource file2 = new FileSystemResource(new File(filePath));
helper.addInline(contentId,file2);//添加静态资源 javaMailSender.send(message);
log.info("嵌入静态资源的邮件已经发送成功");
} catch (MessagingException e) {
log.error("sendInlineResourceMail发送嵌入静态资源的邮件时发生异常!", e);
}
}

test:

@Test
public void sendInlineResourceMail(){
String context = "<html>\n" +
"<body>\n" +
"<h3>hello! myselef!</h3>\n" +
"</body>\n" +
"</html>";
String filePath = "D:\\img\\D0145151.img";
String contentId= "D0145151";
simpleEmailSend.sendInlineResourceMail("Springboot test sendInlineResourceMail",context,filePath,contentId);
}

邮件系统

上面发送邮件的基础服务就这些了,但是如果我们要做成一个邮件系统的话还需要考虑以下几个问题:

邮件模板

我们会经常收到这样的邮件:

尊敬的XXX用户:

              恭喜您注册成为xxx网的用户,,同时感谢您对xxx的关注与支持并欢迎您使用xxX的产品与服务。
        ...

其中只有XXX这个用户名在变化,其它邮件内容均不变,如果每次发送邮件都需要手动拼接的话会不够优雅,并且每次模板的修改都需要改动代码的话也很不方便,因此对于这类邮件需求,都建议做成邮件模板来处理。模板的本质很简单,就是在模板中替换变化的参数,转换为html字符串即可,这里以 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="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
您好,这是验证邮件,请点击下面的链接完成验证,<br/>
<a href="#" th:href="@{https://www.cnblogs.com/flgb/p/{id}(id=${id}).html }">验证账号</a>
</body>
</html>

3、解析模板并发送

@Autowired
private TemplateEngine templateEngine;
@Test
public void sendTemplateMail()
{
//创建邮件正文
Context context = new Context();
context.setVariable ("id", "12866522");
String emailContent = templateEngine.process("emailTemplate", context);
simpleEmailSend.sendHtmlMail("Springboot test sendTemplateMail", emailContent);
}

发送失败

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

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

异步发送

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

sendTemplateMail

springboot(六)Email demo的更多相关文章

  1. springboot(六):如何优雅的使用mybatis

    这两天启动了一个新项目因为项目组成员一直都使用的是mybatis,虽然个人比较喜欢jpa这种极简的模式,但是为了项目保持统一性技术选型还是定了 mybatis.到网上找了一下关于spring boot ...

  2. SpringBoot (六) :如何优雅的使用 mybatis

    原文出处: 纯洁的微笑 这两天启动了一个新项目因为项目组成员一直都使用的是mybatis,虽然个人比较喜欢jpa这种极简的模式,但是为了项目保持统一性技术选型还是定了 mybatis.到网上找了一下关 ...

  3. springBoot+mybatisPlus小demo

    项目介绍:采用restful api进行接口规范 / 项目框架SpringBoot+mybatis Plus / 采用mysql进行数据存储 / 采用swaggerUI进行前后端业务分离式开发. 开发 ...

  4. Java学习之SpringBoot整合SSM Demo

    背景:在Java Web中Spring家族有着很重要的地位,之前JAVA开发需要做很多的配置,一堆的配置文件和部署调试一直是JavaWeb开发中的一大诟病,但现在Spring推出了SpringBoot ...

  5. 第2章 构建springboot工程 2-1 构建SpringBoot第一个demo

    以后的趋势肯定是以一个微服务为主导的, Spring-Boot的指导 Maven整个环境构建之前的整个项目其实是一个很普通的J2SE项目,它构建完之后会进行重构,重构为Maven的一个项目路径.可以看 ...

  6. (十三)SpringBoot 发送E-mail

    一:添加mail依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId ...

  7. SpringBoot(六) SpirngBoot与Mysql关系型数据库

    pom.xml文件的配置 <dependency> <groupId>org.springframework.boot</groupId> <artifact ...

  8. SpringBoot整合Swagger2(Demo示例)

    写在前面 由于公司项目采用前后端分离,维护接口文档基本上是必不可少的工作.一个理想的状态是设计好后,接口文档发给前端和后端,大伙按照既定的规则各自开发,开发好了对接上了就可以上线了.当然这是一种非常理 ...

  9. spring-boot(六) 邮件服务

    学习文章来自:springboot(十):邮件服务 简单使用 1.pom包配置 pom包里面添加spring-boot-starter-mail包引用 <dependencies> < ...

随机推荐

  1. ichartjs测试dome分享

    效果如下: 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> ...

  2. 对于两个输入文件,即文件A 和文件B ,请编写MapReduce程序,对两个文件进行合并排除其中重复的内容,得到一个新的输出文件C。

    package org.apache.hadoop.examples; import java.util.HashMap; import java.io.IOException; import jav ...

  3. 正则re高级用法

    search 需求:匹配出文章阅读的次数 #coding=utf-8 import re ret = re.search(r"\d+", "阅读次数为 9999" ...

  4. 慕课网金职位 Java工程师2020 百度网盘下载

    百度网盘链接:https://pan.baidu.com/s/1xshLRO3ru0LAsQQ0pE67Qg 提取码:bh9f 如果失效加我微信:610060008[视频不加密,资料代码齐全,超清一手 ...

  5. FFT,NTT 笔记

    FFT 简介 FFT是干啥的?它是用来加速多项式乘法的.我们平时经常求多项式乘法,比如\((x+1)(x+3)=(x^2+4x+3)\).假设两个式子都是\(n\)项(不足的补0),那朴素的算法是\( ...

  6. dp - 斜率优化笔记

    (原来的题解没得了,只好重写一份) 斜率优化一般是,\(dp\) 是枚举一个 \(i\),然后前面找一个 \(j\),式子中有些和 \(j\) 有关,有些和 \(i\) 有关,有些和俩都有关. 过程中 ...

  7. loj10157

    太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状,某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候看守,在不 ...

  8. poj2631

    求一棵树的直径,所谓直径就是树上距离最远的两个点! 树形动归,每个点的为根的子树的最长向下链和次长链的和! 当然也可以二次深搜! ----------------------------------- ...

  9. synchronized的底层探索

    其实没看懂,但是提供了不同的思路,先记下 https://www.cnblogs.com/yuhangwang/p/11256476.html https://www.cnblogs.com/yuha ...

  10. 基于navicat的数据库导入导出

    1.右键当前数据库,选择转储SQL文件 选择导出sql的存放路径 2.新建统一命名的数据库,右键运行SQL文件 3,.选择要导入的SQL文件后如图