springboot集成邮件服务
一、前言
Spring Email 抽象的核心是 MailSender 接口,MailSender 的实现能够把 Email 发送给邮件服务器,由邮件服务器实现邮件发送的功能。
Spring 自带了一个 MailSender 的实现 JavaMailSenderImpl,它会使用 JavaMail API 来发送 Email。Spring 或 SpringBoot 应用在发送 Email 之前,我们必须要 JavaMailSenderImpl 装配为 Spring应用上下文的一个 bean。
二、配置
1、pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2、application.yml
spring:
mail:
host: smtp.163.com
port: 25
username: 159****2662@163.com
password: ***********
host 属性默认是 JavaMail 会话的主机;port 端口默认监听标准的 SMTP 端口25;如果邮件服务器需要认证的,还需要设置 userrname 和 password。
这里我用的是 163 的邮件服务器,需要在 163 邮箱中开启客户端授权密码,否则会报 550 认证错误。
3、EmailConfig.java
在这里,我们把 JavaMailSenderImpl 装配为 Spring 应用上下文的一个 Bean。同时需要注意的是,这里使用了@ConfigurationProperties 注解,该注解需要属性有 setter 方法并在启动类中使用 @EnableConfigurationProperties 注解使之生效。
@Configuration
@ConfigurationProperties(prefix = "spring.mail")
public class EmailConfig { private String host;
private Integer port;
private String username;
private String password; @Bean
public MailSender javaMailSender() {
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setHost(host);
javaMailSender.setPort(port);
javaMailSender.setUsername(username);
javaMailSender.setPassword(password);
return javaMailSender;
} public void setHost(String host) {
this.host = host;
}
public void setPort(Integer port) {
this.port = port;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
}
三、发送
有了 javaMailSender,那么邮件发送就是一件再简单不过的事情了。我们只需要将 javaMailSender 的 Bean 注入到我们自己的实现类中,然后使用 JavaMail API 来发送 Email。
1、文本邮件发送
public void sendSimpleEmail() {
// 构造Email消息
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom("159****2662@163.com");
message.setTo("****@qianxx.com");
message.setSubject("邮件主题");
message.setText("邮件内容");
javaMailSender.send(message);
}
纯文本的 Email 在于构造 SimpleMailMessage 实例,这个对象可以很便捷地发送Email消息。
2、附件邮件发送
Spring 的 Email 功能并不局限于纯文本的 Email。我们还可以添加附件。如果要发送带有附件的 Email,关键技巧是创建 multipart 类型的消息 ———— Email由多个部分组成,其中一部分是 Email 体,其他部分是附件。为了发送 multipart 类型的 Email,你需要创建一个MIME(Multipurpose Internet Mail Extensions)的消息。
public void mimeEmail() throws MessagingException {
// MimeMessage 本身的 API 有些笨重,我们可以使用 MimeMessageHelper
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
// 第二个参数是 true ,表明这个消息是 multipart类型的/
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setFrom("159****2662@163.com");
mimeMessageHelper.setTo("****@qianxx.com");
mimeMessageHelper.setSubject("附件邮件主题");
mimeMessageHelper.setText("附件邮件内容");
//添加附件,第一个参数表示添加到 Email 中附件的名称,第二个参数是图片资源
mimeMessageHelper.addAttachment("boot.png", new ClassPathResource("public/images/boot.png"));
javaMailSender.send(mimeMessage);
}
3、富文本邮件发送
Spring 的 Email 功能除了可以添加附件外,甚至可以使用 HTML 来美化消息体的内容。发送富文本的 Email 与发送简单文本的 Email 并没有太大区别,关键是将setText() 方法的消息文本设置为 HTML,并将第二个参数设置为 true,表示这是 HTML 的富文本。
public void htmlEmail() throws MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setFrom("159****2662@163.com");
mimeMessageHelper.setTo("****@qianxx.com");
mimeMessageHelper.setSubject("富文本邮件主题");
String html = "<html><body><h4>Hello,SpringBoot</h4><img src='cid:boot' /></body></html>";
mimeMessageHelper.setText(html, true);
// 设置内嵌元素 cid,第一个参数表示内联图片的标识符,第二个参数标识资源引用
mimeMessageHelper.addInline("boot", new ClassPathResource("public/images/boot.png"));
javaMailSender.send(mimeMessage);
}
四、使用 Thymeleaf 模板
HTML 标签的字符串拼接是一件很棘手的事。因为在你的大脑中解析HTML标签并想象它在渲染时会是什么样子是挺困难的。而将HTML混合在Java代码中又会使得这个问题更加复杂。
因此 Spring 给出的解决方案是:使用模板生成 HTML 文本,有多种模板方案可供选择,包括Apache Velocity和Thymeleaf。这里仅介绍 Thymeleaf 模板的用法(假设读者已经熟悉了 Thymeleaf 模板并知道如何在 SpringBoot 中使用它们)。
1、Thymeleaf 模板 — email.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Email</title>
</head>
<body>
<img src='cid:boot'>
<h4><span th:text="${title}">Craig Walls</span> says... </h4>
<i><span th:text="${content}">Hello Boot!</span></i>
</body>
</html>
2、邮件发送
@RunWith(SpringRunner.class)
@SpringBootTest
public class ThymeleafApplicationTests { @Autowired
private JavaMailSender javaMailSender;
@Autowired
private SpringTemplateEngine templateEngine; @Test
public void contextLoads() throws MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setFrom("159****2662@163.com");
mimeMessageHelper.setTo("****@qianxx.com");
mimeMessageHelper.setSubject("ThymeLeaf 模板邮件");
// 利用 Thymeleaf 模板构建 html 文本
Context ctx = new Context();
ctx.setVariable("title", "Craig Walls");
ctx.setVariable("content", "Hello Boot!");
String emailText = templateEngine.process("email/email", ctx);
mimeMessageHelper.setText(emailText, true);
// 设置内嵌元素 cid,第一个参数表示内联图片的标识符,第二个参数标识资源引用
mimeMessageHelper.addInline("boot", new ClassPathResource("/static/img/boot.png"));
javaMailSender.send(mimeMessage);
}
}
springboot集成邮件服务的更多相关文章
- Springboot】Springboot整合邮件服务(HTML/附件/模板-QQ、网易)
介绍 邮件服务是常用的服务之一,作用很多,对外可以给用户发送活动.营销广告等:对内可以发送系统监控报告与告警. 本文将介绍Springboot如何整合邮件服务,并给出不同邮件服务商的整合配置. 如图所 ...
- SpringBoot集成邮件发送
一:简述 在日常中的工作中难免会遇到程序集成邮件发送功能.接收功能:此篇文章我将使用SpringBoot集成邮件发送功能和接收功能:若对邮件一些基本协议和发送流程不懂的请务必参考我之前写的博客或者浏览 ...
- SpringBoot之邮件服务
springboot 邮件服务 今天在看网上学习微服务的时候顺遍看到了一些关于springboot的文章,写的springboot拓展功能就顺遍学习了一下,接下来给大家分享一下springboot封装 ...
- spring-boot(六) 邮件服务
学习文章来自:springboot(十):邮件服务 简单使用 1.pom包配置 pom包里面添加spring-boot-starter-mail包引用 <dependencies> < ...
- springboot系列九,springboot整合邮件服务、整合定时任务调度
一.整合邮件服务 如果要进行邮件的整合处理,那么你一定需要有一个邮件服务器,实际上 java 本身提供有一套 JavaMail 组件以实现邮件服务器的搭建,但是这个搭建的服务器意义不大,因为你现在搭建 ...
- SpringBoot 之集成邮件服务.
一.前言 Spring Email 抽象的核心是 MailSender 接口,MailSender 的实现能够把 Email 发送给邮件服务器,由邮件服务器实现邮件发送的功能. Spring 自带了一 ...
- springboot(七)邮件服务
简单使用 发送邮件应该是网站的必备功能之一,什么注册验证,忘记密码或者是给用户发送营销信息.最早期的时候我们会使用JavaMail相关api来写发送邮件的相关代码,后来spring退出了JavaMai ...
- springboot的邮件服务
作者:纯洁的微笑出处:http://www.ityouknow.com/ 版权归作者所有,转载请注明出处 springboot仍然在狂速发展,才五个多月没有关注,现在看官网已经到1.5.3.RELEA ...
- SpringBoot集成Socket服务后打包(war包)启动时如何启动Socket服务(web应用外部tomcat启动)
1.首先知道SpringBoot打包为jar和war包是不一样的(只讨论SpringBoot环境下web应用打包) 1.1.jar和war包的打开方式不一样,虽然都依赖java环境,但是j ...
随机推荐
- 【转】C#具名参数和可选参数
源地址:https://www.cnblogs.com/similar/p/5006705.html 另:可选参数的一个陷阱 参考:https://www.cnblogs.com/still-wind ...
- PHP 执行系统外部命令的方法 system() exec()
PHP作为一种服务器端的脚本语言,像编写简单.或者是复杂的动态网页这样的任务,它完全能够胜任.但事情不总是如此,有时为了实现某个功能,必须借助于操作系统的外部程序(或者称之为命令),这样可以做到事半功 ...
- Ionic 2 :如何实现列表滑动删除按钮
http://blog.csdn.net/h254532699/article/details/54382123 使用Ionic这种框架伟大的地方在于用户界面元素默认准备好了,意味着你可以设计更好的a ...
- c++ Initialization
c++ 的初始化过程比较复杂:根据对象的storage duration来分类.所谓storage duration是对象而言的,Storage duration is the property of ...
- SQL总结-----触发器
概念 触发器是一种特殊类型的存储过程,不由用户直接调用.创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行. 触发器可以查询其他表,而且可以包含复杂的 SQL 语句. 它们主要用 ...
- PHP用curl远程下载图片
function http_get_data($url){ $ch = curl_init (); curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, 'GET' ); ...
- 如果你创建了类似于下面的 Twitter 元素,那么它相关的类定义是啥样子的?
代码: <Twitter username='tylermcginnis33'> {(user) => user === null ? <Loading /> : < ...
- angular5新增全局的模块
比如新增一个全局的swiper,需要在webpack中配置: 之后在代码中就可以用了
- mysql 5.7 的 /etc/my.cnf
mysql的my.cnf文件纯净版的.随意享用. # Example MySQL config file for medium systems. # # This is for a system wi ...
- 安装vs2013要求重启后安装
解决方案: 卸载360,然后杀毒, 重启电脑就可以直接安装vs了