Springboot 系列(十三)使用邮件服务

1202902-20190806115330401-1468070015.png

在我们这个时代,邮件服务不管是对于工作上的交流,还是平时的各种邮件通知,都是一个十分重要的存在。Java 从很早时候就可以通过 Java mail 支持邮件服务。Spring 更是对 Java mail 进行了进一步的封装,抽象出了 JavaMailSender. 后来随着 Springboot 的出现,理所当然的出现了 spring-boot-starter-mail. 不管怎么说,每次的封装都让使用变得越来越简单。

Springboot mail 依赖

创建 Springboot 项目不提,先看一下总体目录结构。
1202902-20190806115336433-34773762.png

直接引入 Springboot 邮件服务所需的依赖。

   <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 邮件服务 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><!-- Thymeleaf 模版,用于发送模版邮件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

Springboot mail 配置

使用邮件服务需要配置自己可以使用的邮箱信息,一般需要配置发送协议 SMTP、邮箱帐号(本次以126邮箱为例)、邮箱密码以及编码格式。

spring.mail.host=smtp.126.com
spring.mail.port=25
# 你的邮箱地址
spring.mail.username=youremail@126.com 
# 你的授权码(126 和 163 以及 qq 邮箱 都需要授权码登录,没有授权码的直接登录网页版邮箱设置里设置)
spring.mail.password=password
spring.mail.default-encoding=UTF-8

Springboot mail 文本邮件

文本邮件是最简单也是最基础的一种邮件,使用 Spring 封装的 JavaMailSender 直接发送就可以了。

创建 MailService 类,注入 JavaMailSender 用于发送邮件,使用 @Value("${spring.mail.username}") 绑定配置文件中的参数用于设置邮件发送的来邮箱。使用 @Service 注解把 MailService 注入到 Spring 容器,使用 Lombok@Slf4j 引入日志。

/*** <p>* 邮件服务** @Author niujinpeng* @Date 2019/3/10 21:45*/
@Service
@Slf4j
public class MailService {@Value("${spring.mail.username}")private String from;@Autowiredprivate JavaMailSender mailSender;/*** 发送简单文本邮件* * @param to* @param subject* @param content*/public void sendSimpleTextMail(String to, String subject, String content) {SimpleMailMessage message = new SimpleMailMessage();message.setTo(to);message.setSubject(subject);message.setText(content);message.setFrom(from);mailSender.send(message);log.info("【文本邮件】成功发送!to={}", to);}
}

创建 Springboot 的单元测试类测试文本邮件,实验中的收信人为了方便,都设置成了自己的邮箱。

@RunWith(SpringRunner.class)
@SpringBootTest
public class MailServiceTest {@Autowiredprivate MailService mailService;@Autowiredprivate TemplateEngine templateEngine;@Testpublic void sendSimpleTextMailTest() {String to = "youemail@126.com";String subject = "Springboot 发送简单文本邮件";String content = "<p>第一封 Springboot 简单文本邮件</p>";mailService.sendSimpleTextMail(to, subject, content);}
}

运行单元测试,测试文本邮件的发送。

PS:如果运行报出异常 AuthenticationFailedException: 535 Error. 一般都是用户名和密码有误。

Caused by: javax.mail.AuthenticationFailedException: 535 Error: authentication failedat com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:965)at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:876)at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:780)at javax.mail.Service.connect(Service.java:366)at org.springframework.mail.javamail.JavaMailSenderImpl.connectTransport(JavaMailSenderImpl.java:517)at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:436)... 34 more

正常运行输出成功发送的日志。

2019-03-11 23:35:14.743  INFO 13608 --- [           main] n.codingme.boot.service.MailServiceTest  : Started MailServiceTest in 3.964 seconds (JVM running for 5.749)
2019-03-11 23:35:24.718  INFO 13608 --- [           main] net.codingme.boot.service.MailService    : 【文本邮件】成功发送!to=youemail@126.com

查看邮箱中的收信。

1202902-20190806115405177-12609591.png

文本邮件正常收到,同时可见文本邮件中的 HTML 标签也不会被解析。

Springboot mail HTML 邮件

在上面的 MailService 类里新加一个方法 sendHtmlMail,用于测试 HTML 邮件。

    /*** 发送 HTML 邮件* * @param to* @param subject* @param content* @throws MessagingException*/public void sendHtmlMail(String to, String subject, String content) throws MessagingException {MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);messageHelper.setFrom(from);messageHelper.setTo(to);messageHelper.setSubject(subject);// true 为 HTML 邮件messageHelper.setText(content, true);mailSender.send(message);log.info("【HTML 邮件】成功发送!to={}", to);}

在测试方法中增加 HTML 邮件测试方法。

    @Testpublic void sendHtmlMailTest() throws MessagingException {String to = "youremail@126.com";String subject = "Springboot 发送 HTML 邮件";String content = "<h2>Hi~</h2><p>第一封 Springboot HTML 邮件</p>";mailService.sendHtmlMail(to, subject, content);}

运行单元测试,查看收信情况。

1202902-20190806115439646-500237113.png

HTML 邮件正常收到,HTML 标签也被解析成对应的样式。

Springboot mail 附件邮件

在上面的 MailService 类里新加一个方法 sendAttachmentMail,用于测试 附件邮件。

    /*** 发送带附件的邮件* * @param to* @param subject* @param content* @param fileArr*/public void sendAttachmentMail(String to, String subject, String content, String... fileArr)throws MessagingException {MimeMessage mimeMessage = mailSender.createMimeMessage();MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);messageHelper.setFrom(from);messageHelper.setTo(to);messageHelper.setSubject(subject);messageHelper.setText(content, true);// 添加附件for (String filePath : fileArr) {FileSystemResource fileResource = new FileSystemResource(new File(filePath));if (fileResource.exists()) {String filename = fileResource.getFilename();messageHelper.addAttachment(filename, fileResource);}}mailSender.send(mimeMessage);log.info("【附件邮件】成功发送!to={}", to);}

在测试方法中增加附件邮件测试方法。

    @Testpublic void sendAttachmentTest() throws MessagingException {String to = "youremail@126.com";String subject = "Springboot 发送 HTML 附件邮件";String content = "<h2>Hi~</h2><p>第一封 Springboot HTML 附件邮件</p>";String filePath = "pom.xml";mailService.sendAttachmentMail(to, subject, content, filePath, filePath);}

运行单元测试,查看收信情况。

1202902-20190806115450480-1007391272.png

带附件的邮件正常收到,多个附件的实现方式同理。

Springboot mail 图片邮件

图片邮件和其他的邮件方式略有不同,图片邮件需要先在内容中定义好图片的位置并出给一个记录 ID ,然后在把图片加到邮件中的对于的 ID 位置。

在上面的 MailService 类里新加一个方法 sendImgMail,用于测试 附件邮件。

   /*** 发送带图片的邮件** @param to* @param subject* @param content* @param imgMap*/public void sendImgMail(String to, String subject, String content, Map<String, String> imgMap)throws MessagingException {MimeMessage mimeMessage = mailSender.createMimeMessage();MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);messageHelper.setFrom(from);messageHelper.setTo(to);messageHelper.setSubject(subject);messageHelper.setText(content, true);// 添加图片for (Map.Entry<String, String> entry : imgMap.entrySet()) {FileSystemResource fileResource = new FileSystemResource(new File(entry.getValue()));if (fileResource.exists()) {String filename = fileResource.getFilename();messageHelper.addInline(entry.getKey(), fileResource);}}mailSender.send(mimeMessage);log.info("【图片邮件】成功发送!to={}", to);}

在测试方法中增加图片邮件测试方法,测试方法中使用的 apple.png 是项目里的一个图片。可以看上面的项目结构。

    @Testpublic void sendImgTest() throws MessagingException {String to = "youremail@126.com";String subject = "Springboot 发送 HTML 图片邮件";String content ="<h2>Hi~</h2><p>第一封 Springboot HTML 图片邮件</p><br/><img src=\"cid:img01\" /><img src=\"cid:img02\" />";String imgPath = "apple.png";Map<String, String> imgMap = new HashMap<>();imgMap.put("img01", imgPath);imgMap.put("img02", imgPath);mailService.sendImgMail(to, subject, content, imgMap);}

运行单元测试,查看收信情况。

1202902-20190806115503075-940120568.png

两个图片正常显示在邮件里。

Springboot mail 模版邮件

模版邮件的用处很广泛,像经常收到的注册成功邮件或者是操作通知邮件等都是模版邮件,模版邮件往往只需要更改其中的几个变量。Springboot 中的模版邮件首选需要选择一款模版引擎,在引入依赖的时候已经增加了模版引擎 Thymeleaf.

模版邮件首先需要一个邮件模版,我们在 Templates 下新建一个 HTML 文件 RegisterSuccess.html. 其中的 username 是给我们自定义的。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>注册成功通知</title>
</head>
<body>
<p>[[${username}]],您好!
</p>
<p>新的公钥已添加到你的账户:<br/>标题: HP-WIN10 <br/>如果公钥无法使用,你可以在这里重新添加: SSH Keys
</p>
</body>
</html>

在邮件服务 MailService 中注入模版引擎,然后编写邮件模版发送代码。

    @Autowiredprivate TemplateEngine templateEngine;/*** 发送模版邮件* * @param to* @param subject* @param paramMap* @param template* @throws MessagingException*/public void sendTemplateMail(String to, String subject, Map<String, Object> paramMap, String template)throws MessagingException {Context context = new Context();// 设置变量的值context.setVariables(paramMap);String emailContent = templateEngine.process(template, context);sendHtmlMail(to, subject, emailContent);log.info("【模版邮件】成功发送!paramsMap={},template={}", paramMap, template);}

在单元单元测试中增加模版邮件测试方法,然后发送邮件测试。

    @Testpublic void sendTemplateMailTest() throws MessagingException {String to = "youremail@126.com";String subject = "Springboot 发送 模版邮件";Map<String, Object> paramMap = new HashMap();paramMap.put("username", "Darcy");mailService.sendTemplateMail(to, subject, paramMap, "RegisterSuccess");}

查看收信情况。

1202902-20190806115513236-935148542.png

可以发现模版邮件已经正常发送了。

Springboot mail 补充

上面的例子中,是 Springboot 邮件服务的基本用法,代码也有很多重复,和实际的使用情况相比还有很多不足,比如缺少异常处理机制,在发送失败时的重试机制也没有,实际情况中邮件服务往往对实时性不高,多说情况下会用于异步请求

文章相关代码已经上传 Github Spring Boot 相关整合 - 邮件服务。

本文作者:雪漫士兵
我的微信:wn8398
原文出处:www.codingme.net
本片文章是博主原创文章,欢迎转载,转载时在明显位置注明原文链接即可。
如果觉得这篇内容有趣好玩有帮助,不妨关注公众号点个好看推荐。

转载于:https://www.cnblogs.com/niumoo/p/10514191.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器能否只做c盘系统,我的云服务器只有一个c盘

我的云服务器只有一个c盘 内容精选换一换检查Pkey是否一致。查看弹性云服务器内部分配到的Pkey&#xff1a;cat /sys/class/infiniband/mlx5_0/ports/1/pkeys/* | grep -v "0x0000"检查Pkey是否一致如果环境中查出来的Pkey只有一个&#xff0c;请联系技术支持人员。如…

单例模式(C++实现)

RAII运用 只能在栈上创建对象 只能在堆上创建的对象 单例模式 设计模式 懒汉模式 解决线程安全 优化 饿汉模式 饿汉和懒汉的区别

Flume:使用Apache Flume收集客户产品搜索点击数据

这篇文章涵盖了使用Apache flume收集客户产品搜索点击并使用hadoop和elasticsearch接收器存储信息。 数据可能包含不同的产品搜索事件&#xff0c;例如基于不同方面的过滤&#xff0c;排序信息&#xff0c;分页信息&#xff0c;以及进一步查看的产品以及某些被客户标记为喜欢的…

vue-cli使用swiper4在ie以及safari报错

vue-cli项目中&#xff0c;通过npm run swiper --save-dev安装的是swiper4版本的插件&#xff0c;这样安装以后在谷歌火狐等浏览器都可以正常运行&#xff0c;但是在safari浏览器&#xff08;可能是版本太低&#xff09;还有ie&#xff08;9,10,11&#xff09;打开会报错&#…

电脑内部,小贴士:电脑内部连接标准

小贴士&#xff1a;电脑内部连接标准在介绍电脑内部连接标准之前&#xff0c;首先应该了解一下电脑内部接线的种类&#xff0c;以便分类处置。电脑内部尽管五颜六色的导线&#xff0c;其中导线的种类可以分为3 类&#xff0c;即电源线、信号线和控制线&#xff0c;而控制线又常…

太快了,太变态了:什么会影响Java中的方法调用性能?

那么这是怎么回事&#xff1f; 让我们从一个简短的故事开始。 几周前&#xff0c;我提议对Java核心libs邮件列表进行更改 &#xff0c;以覆盖当前final一些方法。 这刺激了一些讨论主题-其中之一是其中一个性能回归通过采取这是一个方法被引入的程度final免遭停止它final 。 我…

1、dubbo的概念

Dubbo是什么&#xff1f; Dubbo是阿里巴巴SOA服务化治理方案的核心框架&#xff0c;每天为2,000个服务提供3,000,000,000次访问量支持&#xff0c;并被广泛应用于阿里巴巴集团的各成员站点。Dubbo[]是一个分布式服务框架&#xff0c;致力于提供高性能和透明化的RPC远程服务调用…

轻云服务器的性能,腾讯云轻量应用服务器性能评测(以香港地域为例)

腾讯云轻量应用服务器香港节点24元/月&#xff0c;价格很不错&#xff0c;ForeignServer来说说腾讯云轻量服务器香港地域性能评测&#xff0c;包括腾讯云轻量应用服务器CPU型号配置、网络延迟速度测试&#xff1a;腾讯云香港轻量应用服务器性能评测腾讯云轻量应用服务器地域可选…

vue2.5.2版本 :MAC设置应用在127.0.0.1:80端口访问; 并将127.0.0.1指向www.yours.com ;问题“ Invalid Host header”

0.设置自己的host文件&#xff0c;将127.0.0.1指向自己想要访问的域名 127.0.0.1 www.yours.com 1.MAC设置应用在127.0.0.1&#xff1a;80端口访问&#xff1a; config/index.js目录下修改host和port 然后sudo运行npm run dev:(mac的80端口是被自身分享应用占用的&#xff0c…

Google Android 平台正式开源

Google 推出移动设备软件平台 Android 之时&#xff0c;曾向开发者开放 SDK 包&#xff0c;并许诺将在开源许可模式下开放其全部代码&#xff0c;今天&#xff0c;Google 与其合作伙伴&#xff0c;在 Open Handset Alliance 兑现了其承诺&#xff0c;用户现在可以正式下载 Andr…

JSP彩色验证码

产生验证码图片的文件-----image.jsp <% page contentType"image/jpeg" import"java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %><%!Color getRandColor(int fc,int bc){//给定范围获得随机颜色 Random random new Random()…

自定义Windows右击菜单调用Winform程序

U9_Git中ignore文件处理 背景 U9代码中有许多自动生成的文件&#xff0c;不需要上传Git必须BE Entity中的.target文件 .bak 文件 Enum.cs结尾的文件&#xff0c;还有许多 extand文件。 这些文件都不需要上传Git。 但是这些文件太多了&#xff0c;不可能手动加入到ignore文件中。…

Gradle Introduction

目录 Compileing development ProcessOld compile MothedModern compile MothedWhat is GradleGradle EffectWhat is GroovyGroovy syntax relesStructure ScriptPeojectAttributeTaskExample #1applyExample #1Example #2Dependency ManagementExample #1Example #2Multiple P…

u8系统怎么连接服务器,用友U8 怎么连接远程服务器

用友U8 怎么连接远程服务器 内容精选换一换配置应用系统的跨云热备容灾方案如图1所示。在如图1所示的方案中&#xff0c;用户的生产数据中心的应用系统使用MySQL作为数据库&#xff0c;应用系统与MySQL均热备容灾到华为云上。用户的生产数据中心与华为云之间使用专线进行网络连…

[导入]商业智能2.0?(BI 2.0 from Timo Elliott)

译者注: 关于BI2.0的说法很多&#xff0c;不尽一致&#xff0c;目的只是想多了解一些&#xff1b;译文并不代表译者认可原文观点&#xff0c;只是顺便译了以方便不喜欢E文的朋友。本文是一篇充满探讨及疑问的文章&#xff0c;来自Timo Elliott(Business Objects历史上的第8号员…

angularjs封装bootstrap官网的时间插件datetimepicker

背景:angular与jquery类库的协作 第三方类库中&#xff0c;不得不提的是大名鼎鼎的jquery,现在基本上已经是国内web开发的必修工具了。它灵活的dom操作&#xff0c;让很多web开发人员欲罢不能。再加上已经很成熟的jquery UI 库和大量jquery 插件&#xff0c;几乎是一个取之不尽…

Java中的得墨meter耳定律–最少知识原理–实际示例

得墨meter耳定律&#xff08;也称为最少知识定律&#xff09;是一种编码原理&#xff0c;它表示模块不应该知道其操作的对象的内部细节。 如果代码依赖于特定对象的内部细节&#xff0c;则很有可能一旦该对象的内部发生更改&#xff0c;它就会被破坏。 由于封装是关于隐藏对象的…

课后作业1

自我介绍 我叫张阔&#xff0c;我的爱好是旅行&#xff0c;游览世界的美好风光&#xff1b; 我的码云个人主页是&#xff1a;https://gitee.com/ZkTt0428&#xff1b; 我的第一个项目地址是&#xff1a;https://gitee.com/ZkTt0428/Frist&#xff1b; 目前代码量有10000行了&am…

针对新手的Java EE7和Maven项目-第4部分-定义Ear模块

从前面的部分恢复 第1部分 第2部分 第3部分 我们正在恢复第四部分&#xff0c;目前我们的简单项目有 Web Maven模块&#xff08;战争&#xff09; 一个ejb模块&#xff08;ejb&#xff09;&#xff0c;其中包含我们的无状态会话bean&#xff08;EJB 3.1&#xff09; 第二…

最大公因数和最小公倍数

一丶 最大公因数求法&#xff1a;辗转相除法(也称欧几里得算法)原理: 二丶最小公倍数求法&#xff1a;两个整数的最小公倍数等于两整数之积除以最大公约数1 #include <iostream>2 3 using namespace std;4 5 //辗转相除法(欧几里得算法)6 7 int gcd(int a, int b)8 {9…