讲解了日志相关的知识点后。今天来点相对简单的,通常上,咱们在开发一些注册功能、发送验证码或者订单服务时,都会经过短信或者邮件的方式通知消费者,注册或者订单的相关信息。并且基本上邮件的内容都是模版,一些差别化的可根据实际状况来进行替换。好比12306购票成功后,会发送一封购票信息邮件;在京东下单成功后,也会收到一封包含订单的邮件。因此,今天就来说讲如何利用
Spring
提供的JavaMailSender
接口,实现邮件发送功能。html
讲解前,咱们先来简单了解下相关邮件知识。java
JavaMail介绍 JavaMail
是由Sun
定义的一套收发电子邮件的API
,不一样的厂商能够提供本身的实现类。但它并无包含在JDK中,而是做为JavaEE
的一部分。而JavaMailSender
底层也是基于JavaMail
jar包的,官网介绍时就说了依赖关系: git
邮件通讯协议github
这三种协议都有对应SSL加密传输的协议,分别是SMTPS
,POP3S
和IMAPS
。除JavaMail
服务提供程序以外,JavaMail
还须要JAF(JavaBeans Activation Framework)
来处理不是纯文本的邮件内容,这包括MIME(多用途互联网邮件扩展)、URL页面和文件附件等内容。web
JavaMail关键对象spring
这个不要混淆了,和web
中的session
不同的,简单来讲,它就是配置的集合。 Session的主要做用包括两个方面:apache
Transport和Store:传输和存储 邮件操做只有发送或接收两种处理方式,JavaMail
将这两种不一样操做描述为传输(javax.mail.Transport)
和存储(javax.mail.Store)
,传输对应邮件的发送,而存储对应邮件的接收。api
Message:消息对象 一旦得到Session
对象,就能够继续建立要发送的消息。Message
是个抽象类,经常使用的实现类为:javax.mail.internet.MimeMessage
(下文中使用它来实现附件发送)。缓存
Address:地址 建立了Session
和Message
,并将内容填入消息后,就能够用Address
肯定信件地址了。Address
也是个抽象类。对应经常使用实现类:javax.mail.internet.InternetAddress
。springboot
其余相关信息,可点击查看:https://blog.csdn.net/a2241076850/article/details/52856863讲解的比较清楚。这里就不阐述了(本人也是不甚了解,只是写这篇文章时,有搜索了些相关资料) Spring
封装后,使用起来基本上都不须要去关心这些对象值了,简单了解下便可。固然了,有兴趣,能够搜索下相关资料。也能够去官网查看:https://java.net/projects/javamail/pages/Home
SpringBoot
中,集成邮件发送功能,是很简单的。只需引入spring-boot-starter-mail
便可,如下就简单的介绍下如何发送不一样格式的邮件,已知足不一样的业务需求。
前提条件 0.加入pom
依赖
<!-- 加入mail pom --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
1.配置文件加入相关配置信息,如发送方邮箱信息等。
# 邮件相关 # SMTP服务器地址 spring.mail.host=smtp.qq.com # SMTP服务器端口号 # spring.mail.port=25 # 发送方账号 spring.mail.username=邮箱 # 发送方密码(受权码) spring.mail.password=邮箱密码 #javaMailProperties 配置 # 开启用户身份验证 spring.mail.properties.mail.smtp.auth=true # STARTTLS:一种通讯协议,具体能够搜索下 #spring.mail.properties.mail.smtp.starttls.enable=true #spring.mail.properties.mail.smtp.starttls.required=true
**这里须要注意:**使用QQ邮箱
发送时,须要开通POP3/SMTP
服务,邮箱密码是填写受权码
的,而不是邮箱密码,这个须要注意下。具体网站说明:在设置
-->帐户
-->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务
有说明,你们可自行获取受权码。
关于JavaMailSender
使用文档,能够查看官网指南:https://docs.spring.io/spring/docs/4.3.18.RELEASE/spring-framework-reference/htmlsingle/#mail。
3.引入JavaMailSender
接口对象,已经自动注入了,只需引入便可。
@Autowired private JavaMailSender mailSender;
具体可查看spring-boot-autoconfigure
jar包下的org.springframework.boot.autoconfigure.mail
类,里面已经引入了JavaMailSenderImpl
实现类了。
纯文本格式,比较简单,使用
SimpleMailMessage
便可。
/** * 纯文本格式 * @return */ @GetMapping("/simple") public String simpleSend() { SimpleMailMessage message = new SimpleMailMessage(); message.setFrom("499452441@qq.com"); message.setTo("499452441@qq.com"); message.setSubject("主题:来自oKong邮件"); message.setText("公众号:一枚趔趄的猿(lqdevOps),做者:oKong"); mailSender.send(message); return "发送成功!"; }
启动后,发送,一切正常状况下,能够看见邮件发送成功了。
上文有提到,建立附件时,可以使用
MimeMessage
消息对象。使用也很简单,以下:
@GetMapping("/attach") public String attachSend() throws MessagingException { MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); helper.setFrom("499452441@qq.com"); helper.setTo("499452441@qq.com"); helper.setSubject("主题:来自oKong邮件(带附件)"); helper.setText("(含附件)公众号:一枚趔趄的猿(lqdevOps),做者:oKong"); //添加附件 File qrCode = new File("wxgzh8cm.jpg"); //建议文件带上后缀,可支持在线预览 helper.addAttachment("公众号二维码.jpg", qrCode); mailSender.send(mimeMessage); return "附件邮件发送成功!"; }
说明:主要就是利用addAttachment
方法进行附件添加,可添加多个。附件名称建议带上后缀。
运行后,便可看见邮件已发送成功:
以上的格式,基本都是纯文本格式。咱们知道,在发送邮件时,通常上可使用
html
格式进行发送,可嵌入静态资源,如图片等等。而JavaMailSender
中使用也很简单,主要就是利用MimeMessageHelper
类的setText(String text, boolean html)
方法。
/** * html格式 * @return * @throws MessagingException */ @GetMapping("/html") public String htmlSend() throws MessagingException { MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); helper.setFrom("499452441@qq.com"); helper.setTo("499452441@qq.com"); helper.setSubject("主题:来自oKong邮件(带附件)"); helper.setText("<html><body><div>(含附件)公众号:一枚趔趄的猿(lqdevOps),做者:oKong</div><div><img src='cid:winxinQr'></div></body></html>",true); //抄送人 // helper.setCc(""); //密送人 // helper.setBcc(""); //添加附件 File qrCode = new File("wxgzh8cm.jpg"); //建议文件带上后缀,可支持在线预览 helper.addAttachment("公众号二维码.jpg", qrCode); helper.addInline("winxinQr", qrCode); mailSender.send(mimeMessage); return "附件邮件发送成功!"; }
注意:这里的cid(Content-ID)
是固定写法,冒号后面的值即为须要替换资源的contentId
值,就是对应addInline
的资源id。 并且注意官网的一句话:Be sure to first add the text and after that the resources. If you are doing it the other way around, it won’t work! 顺序不能颠倒了,须要先设置text
,以后添加资源信息!
启动后,一切正常便可看见邮件内容以下:
业务开发时,通常上发送的邮件格式都是固定的,而是替换部分参数便可,如用户信息、订单信息等。因此,咱们能够利用以前讲解过的
模版引擎
进行管理各种模版邮件,同时在发送时替换对应的参数值。如下以freemarker
模版引擎为例子。
关于模版引擎的使用,可点击查看文章:第十六章:web应用开发
0.引入pom依赖
<!-- 加入模版引擎 freemarker --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency>
1.加入配置信息,指定模版目录、后缀名等:
# 缓存配置 开发阶段应该配置为false 由于常常会改 spring.freemarker.cache=false # 模版后缀名 默认为ftl spring.freemarker.suffix=.ftl # 文件编码 spring.freemarker.charset=UTF-8 # 模版加载的目录 spring.freemarker.template-loader-path=classpath:/templates/
2.编写模版文件(放在resources\templates
目录下),主要就是替换userName
变量:
mail.ftl
<html> <body> <div> 尊敬的${userName}: </div> <div > 您好! </div> <div > 多谢关注公众号:一枚趔趄的猿(ledevOps),分享程序猿平常,不按期发布关于SpringBoot、SpringCloud、Java及其余相关教程,记录工做中碰到的问题。欢迎关注~ </div> <div > 一块儿学习,共同进步! </div> <div > <img src="cid:winxinQr"> </div> </body> </html>
3.编写具体实现类:
//自动注入 @Autowired freemarker.template.Configuration freemarkerConfig; @GetMapping("/template") public String template(String userName) throws Exception { MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); helper.setFrom("499452441@qq.com"); helper.setTo("499452441@qq.com"); helper.setSubject("主题:" + userName + ",你有一封来自oKong邮件(From模版)"); //设置替换的参数对象 Map<String, Object> model = new HashMap<String, Object>(); model.put("userName", StringUtils.isEmpty(userName) ? "oKong" : userName); String templateString = FreeMarkerTemplateUtils.processTemplateIntoString(freemarkerConfig.getTemplate("mail.ftl"), model); helper.setText(templateString,true); //抄送人 // helper.setCc(""); //密送人 // helper.setBcc(""); //添加附件 File qrCode = new File("wxgzh8cm.jpg"); //建议文件带上后缀,可支持在线预览 helper.addAttachment("公众号二维码.jpg", qrCode); helper.addInline("winxinQr", qrCode); mailSender.send(mimeMessage); return "模版文件发送成功!"; }
这里说明下:
使用FreeMarker
模版时,可直接使用Spring
提供的工具类FreeMarkerTemplateUtils
的processTemplateIntoString
方法进行模版文件的替换。而freemarker.template.Template
类,熟悉FreeMarker
的同窗应该知道,能够直接从配置类freemarker.template.Configuration
中获取,此类直接注入便可,SpringBoot
在启动时,已经注入这个bean
了。具体的自动配置可查看:org.springframework.boot.autoconfigure.freemarker
类。
关于一些Freemarker
的语法这里就不说明了,你们可到官网查看下:https://freemarker.apache.org/docs/index.html或者,中文参考(可能版本不是最新):http://freemarker.foofun.cn/toc.html
启动后,一切正常状况下能够看见以下:邮件内容已被替换了:
本注解主要简单的讲解了如何利用
JavaMailSender
发送各种格式的邮件。这里只是演示了以JavaMailSender
发送邮件时,使用是很简单的,只须要调用相应的api方法便可。想了解底层如何实现的同窗,建议搜索下相关JavaMail
的知识,加深印象。
目前互联网上不少大佬都有
SpringBoot
系列教程,若有雷同,请多多包涵了。原创不易,码字不易,还但愿你们多多支持。若文中有所错误之处,还望提出,谢谢。
499452441
lqdevOps
我的博客:http://blog.lqdev.cn
完整示例:https://github.com/xie19900123/spring-boot-learning/tree/master/chapter-26
原文地址:http://blog.lqdev.cn/2018/08/29/springboot/chapter-twenty-six