47. Spring Boot发送邮件【从零开始学Spring Boot】
(提供源代码)
Spring提供了非常好用的JavaMailSender
接口实现邮件发送。在Spring Boot的Starter模块中也为此提供了自动化配置。下面通过实例看看如何在Spring Boot中使用JavaMailSender
发送邮件。
快速入门:
那么如何进行使用呢?很简单最核心的就两个步骤:
在Spring Boot的工程中的pom.xml
中引入spring-boot-starter-mail
依赖:
<!-- 发送邮件. -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
如其他自动化配置模块一样,在完成了依赖引入之后,只需要在application.properties
中配置相应的属性内容。
下面我们以QQ邮箱为例,在application.properties
中加入如下配置(注意替换自己的用户名和密码):
########################################################
###mail setting
########################################################
# 设置邮箱主机
spring.mail.host=smtp.qq.com
# 设置用户名
spring.mail.username=用户名
# 设置密码
spring.mail.password=密码
# 设置是否需要认证,如果为true,那么用户名和密码就必须的,
#如果设置false,可以不设置用户名和密码,当然也得看你的对接的平台是否支持无密码进行访问的。
spring.mail.properties.mail.smtp.auth=true
# STARTTLS[1] 是对纯文本通信协议的扩展。它提供一种方式将纯文本连接升级为加密连接(TLS或SSL),而不是另外使用一个端口作加密通信。
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
接下来我们通过单元测试来测试简单邮件的发送:
(如何在spring boot进行单元测试可以参看文章:
http://412887952-qq-com.iteye.com/blog/2292739
)
package com.kfit;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
*
* @author Angel(QQ:412887952)
* @version v.0.1
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = App.class)
public class AppTest {
@Autowired
private JavaMailSender mailSender;
/**
* 修改application.properties的用户,才能发送。
*/
@Test
public void sendSimpleEmail(){
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom("412887952@qq.com");//发送者.
message.setTo("1473773560@qq.com");//接收者.
message.setSubject("测试邮件(邮件主题)");//邮件主题.
message.setText("这是邮件内容");//邮件内容.
mailSender.send(message);//发送邮件
}
}
一个简单的邮件发送就完成了,运行一下该单元测试,看看效果如何?
由于Spring Boot的starter模块提供了自动化配置,所以在引入了spring-boot-starter-mail
依赖之后,会根据配置文件中的内容去创建JavaMailSender
实例,因此我们可以直接在需要使用的地方直接@Autowired
来引入邮件发送对象。
进阶使用:
我们通过使用SimpleMailMessage
实现了简单的邮件发送,但是实际使用过程中,我们还可能会带上附件、或是使用邮件模块等。这个时候我们就需要使用MimeMessage
来设置复杂一些的邮件内容,下面我们就来依次实现一下。
发送附件
发送附件主要通过MimeMessageHelper来进行操作的,实际中也很简单。
/**
* 测试发送附件.(这里发送图片.)
* @throws MessagingException
*/
@Test
public void sendAttachmentsEmail() throws MessagingException{
//这个是javax.mail.internet.MimeMessage下的,不要搞错了。
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
//基本设置.
helper.setFrom("412887952@qq.com");//发送者.
helper.setTo("1473773560@qq.com");//接收者.
helper.setSubject("测试附件(邮件主题)");//邮件主题.
helper.setText("这是邮件内容(有附件哦.)");//邮件内容.
//org.springframework.core.io.FileSystemResource下的:
//附件1,获取文件对象.
FileSystemResource file1 = new FileSystemResource(new File("D:/test/head/head1.jpg"));
//添加附件,这里第一个参数是在邮件中显示的名称,也可以直接是head.jpg,但是一定要有文件后缀,不然就无法显示图片了。
helper.addAttachment("头像1.jpg", file1);
//附件2
FileSystemResource file2 = new FileSystemResource(new File("D:/test/head/head2.jpg"));
helper.addAttachment("头像2.jpg", file2);
mailSender.send(mimeMessage);
}
嵌入静态资源:
除了发送附件之外,我们在邮件内容中可能希望通过嵌入图片等静态资源,让邮件获得更好的阅读体验,而不是从附件中查看具体图片,下面的测试用例演示了如何通过MimeMessageHelper
实现在邮件正文中嵌入静态资源。
内嵌图片,给定一个CID值即可,增加附件,使用MimeMessageHelper的addAttachment即可现在一般不会做内嵌图片,因为这样邮件会很大,容易对服务器造成压力,一般做法是使用图片链接另外,如果要做内嵌或发送图片,你应该使用信用较高的邮箱帐户,否则会报错:554 DT:SPM 发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。请检查是否有用户发送病毒或者垃圾邮件
对于163邮箱服务器会产生的其他问题,参见:http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html
以下是发送静态资源的核心代码:
/**
* 邮件中使用静态资源.
* @throws Exception
*/
@Test
public void sendInlineMail() throws Exception {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
//基本设置.
helper.setFrom("412887952@qq.com");//发送者.
helper.setTo("1473773560@qq.com");//接收者.
helper.setSubject("测试静态资源(邮件主题)");//邮件主题.
// 邮件内容,第二个参数指定发送的是HTML格式
//说明:嵌入图片<img src='cid:head'/>,其中cid:是固定的写法,而aaa是一个contentId。
helper.setText("<body>这是图片:<img src='cid:head' /></body>", true);
FileSystemResource file = new FileSystemResource(new File("D:/test/head/head1.jpg"));
helper.addInline("head",file);
mailSender.send(mimeMessage);
}
这里需要注意的是addInline
函数中资源名称head
需要与正文中cid:head
对应起来
嵌入图片<img src='cid:head'/>,其中cid:是固定的写法,而aaa是一个contentId。
模板邮件:
通常我们使用邮件发送服务的时候,都会有一些固定的场景,比如重置密码、注册确认等,给每个用户发送的内容可能只有小部分是变化的。所以,很多时候我们会使用模板引擎来为各类邮件设置成模板,这样我们只需要在发送时去替换变化部分的参数即可。
在Spring Boot中使用模板引擎来实现模板化的邮件发送也是非常容易的,下面我们以freemarker为例实现一下。
引入freemarker模块的依赖:
<!-- 引入模板引擎. -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
加入配置信息:
########################################################
###FREEMARKER (FreeMarkerAutoConfiguration)
########################################################
spring.freemarker.allow-request-override=false
spring.freemarker.cache=true
spring.freemarker.check-template-location=true
spring.freemarker.charset=UTF-8
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=false
spring.freemarker.expose-session-attributes=false
spring.freemarker.expose-spring-macro-helpers=false
#spring.freemarker.prefix=
#spring.freemarker.request-context-attribute=
#spring.freemarker.settings.*=
#spring.freemarker.suffix=.ftl
#spring.freemarker.template-loader-path=classpath:/templates/ #comma-separated list
在resources/templates/
下,创建一个模板页面email.ftl
:
<html>
<body>
<h3>你好, ${username}, 这是一封模板邮件!</h3>
</body>
</html>
最后,我们在单元测试中加入发送模板邮件的测试用例,具体如下:
/**
* 模板邮件;
* @throws Exception
*/
@Test
public void sendTemplateMail() throws Exception {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
//基本设置.
helper.setFrom("412887952@qq.com");//发送者.
helper.setTo("1473773560@qq.com");//接收者.
helper.setSubject("模板邮件(邮件主题)");//邮件主题.
Map<String, Object> model = new HashMap<String, Object>();
model.put("username", "林峰");
Configuration cfg = new Configuration(Configuration.VERSION_2_3_23);
// 设定去哪里读取相应的ftl模板
cfg.setClassForTemplateLoading(this.getClass(), "/templates");
// 在模板文件目录中寻找名称为name的模板文件
Template template = cfg.getTemplate("email.ftl");
String html = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
helper.setText(html, true);
mailSender.send(mimeMessage);
}
运行一下,就可以收到内容为你好,
林峰
,
这是一封模板邮件
!
的邮件。这里,我们通过传入username的参数,在邮件内容中替换了模板中的${username}
变量。
【Spring Boot 系列博客】
54. spring boot日志升级篇—logback【从零开始学Spring Boot】
52. spring boot日志升级篇—log4j多环境不同日志级别的控制【从零开始学Spring Boot】
51. spring boot属性文件之多环境配置【从零开始学Spring Boot】
50. Spring Boot日志升级篇—log4j【从零开始学Spring Boot】
49. spring boot日志升级篇—理论【从零开始学Spring Boot】
48. spring boot单元测试restfull API【从零开始学Spring Boot】
47. Spring Boot发送邮件【从零开始学Spring Boot】
46. Spring Boot中使用AOP统一处理Web请求日志
45. Spring Boot MyBatis连接Mysql数据库【从零开始学Spring Boot】
44. Spring Boot日志记录SLF4J【从零开始学Spring Boot】
43. Spring Boot动态数据源(多数据源自动切换)【从零开始学Spring Boot】
42. Spring Boot多数据源【从零开始学Spring Boot】
41. Spring Boot 使用Java代码创建Bean并注册到Spring中【从零开始学Spring Boot】
40. springboot + devtools(热部署)【从零开始学Spring Boot】
39.4 Spring Boot Shiro权限管理【从零开始学Spring Boot】
39.3 Spring Boot Shiro权限管理【从零开始学Spring Boot】
39.2. Spring Boot Shiro权限管理【从零开始学Spring Boot】
39.1 Spring Boot Shiro权限管理【从零开始学Spring Boot】
38 Spring Boot分布式Session状态保存Redis【从零开始学Spring Boot】
37 Spring Boot集成EHCache实现缓存机制【从零开始学Spring Boot】
36 Spring Boot Cache理论篇【从零开始学Spring Boot】
35 Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】
34Spring Boot的启动器Starter详解【从零开始学Spring Boot】
33 Spring Boot 监控和管理生产环境【从零开始学Spring Boot】
32 Spring Boot使用@SpringBootApplication注解【从零开始学Spring Boot】
31 Spring Boot导入XML配置【从零开始学Spring Boot】
更多查看博客: http://412887952-qq-com.iteye.com/