spring 5.x 系列第20篇 ——spring简单邮件、附件邮件、内嵌资源邮件、模板邮件发送 (代码配置方式)
源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all
一、说明
1.1 项目结构说明
- 邮件发送配置类为com.heibaiying.config下EmailConfig.java;
- 简单邮件发送、附件邮件发送、内嵌资源邮件发送、模板邮件发送的方法封装在SpringMail类中;
- 项目以单元测试的方法进行测试,测试类为SendEmail。
1.2 依赖说明
除了spring的基本依赖外,需要导入邮件发送的支持包spring-context-support
<!--邮件发送依赖包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring-base-version}</version>
</dependency>
<!--模板引擎-->
<!--这里采用的是beetl,beetl性能很卓越并且功能也很全面 官方文档地址 <a href="http://ibeetl.com/guide/#beetl">-->
<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>beetl</artifactId>
<version>2.9.7</version>
</dependency>
二、spring email
2.1 邮件发送配置
/**
* @author : heibaiying
* @description : 邮件发送配置类
*/
@Configuration
@ComponentScan(value = "com.heibaiying.email")
public class EmailConfig {
/***
* 在这里可以声明不同的邮件服务器主机,通常是SMTP主机,而具体的用户名和时授权码则建议在业务中从数据库查询
*/
@Bean(name = "qqMailSender")
JavaMailSenderImpl javaMailSender() {
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setHost("smtp.qq.com");
javaMailSender.setPassword("587");
return javaMailSender;
}
/***
* 配置模板引擎
*/
@Bean
GroupTemplate groupTemplate() throws IOException {
//指定加载模板资源的位置 指定在classpath:beetl下-
ClasspathResourceLoader loader = new ClasspathResourceLoader("beetl");
//beetl配置 这里采用默认的配置-
org.beetl.core.Configuration configuration = org.beetl.core.Configuration.defaultConfiguration();
return new GroupTemplate(loader, configuration);
}
}
2.2 新建邮件发送基本类
/**
* @author : heibaiying
* @description : 邮件发送基本类
*/
@Component
public class SpringMail {
@Autowired
private JavaMailSenderImpl qqMailSender;
@Autowired
private GroupTemplate groupTemplate;
/**
* 发送简单邮件
* 在qq邮件发送的测试中,测试结果表明不管是简单邮件还是复杂邮件都必须指定发送用户,
* 且发送用户已经授权不然都会抛出异常: SMTPSendFailedException 501 mail from address must be same as authorization user
* qq 的授权码 可以在 设置/账户/POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 中开启服务后获取
*/
public void sendTextMessage(String from, String authWord, String to, String subject, String content) {
// 设置发送人邮箱和授权码
qqMailSender.setUsername(from);
qqMailSender.setPassword(authWord);
// 实例化消息对象
SimpleMailMessage msg = new SimpleMailMessage();
msg.setFrom(from);
msg.setTo(to);
msg.setSubject(subject);
msg.setText(content);
try {
// 发送消息
this.qqMailSender.send(msg);
System.out.println("发送邮件成功");
} catch (MailException ex) {
// 消息发送失败可以做对应的处理
System.err.println("发送邮件失败" + ex.getMessage());
}
}
/**
* 发送带附件的邮件
*/
public void sendEmailWithAttachments(String from, String authWord, String to,
String subject, String content, Map<String, File> files) {
try {
// 设置发送人邮箱和授权码
qqMailSender.setUsername(from);
qqMailSender.setPassword(authWord);
// 实例化消息对象
MimeMessage message = qqMailSender.createMimeMessage();
// 需要指定第二个参数为true 代表创建支持可选文本,内联元素和附件的多部分消息
MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8");
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content);
// 传入附件
for (Map.Entry<String, File> entry : files.entrySet()) {
helper.addAttachment(entry.getKey(), entry.getValue());
}
// 发送消息
this.qqMailSender.send(message);
System.out.println("发送邮件成功");
} catch (MessagingException ex) {
// 消息发送失败可以做对应的处理
System.err.println("发送邮件失败" + ex.getMessage());
}
}
/**
* 发送带内嵌资源的邮件
*/
public void sendEmailWithInline(String from, String authWord, String to,
String subject, String content, File file) {
try {
// 设置发送人邮箱和授权码
qqMailSender.setUsername(from);
qqMailSender.setPassword(authWord);
// 实例化消息对象
MimeMessage message = qqMailSender.createMimeMessage();
// 需要指定第二个参数为true 代表创建支持可选文本,内联元素和附件的多部分消息
MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8");
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
// 使用true标志来指示包含的文本是HTML 固定格式资源前缀 cid:
helper.setText("<html><body><img src='cid:image'></body></html>", true);
// 需要先指定文本 再指定资源文件
FileSystemResource res = new FileSystemResource(file);
helper.addInline("image", res);
// 发送消息
this.qqMailSender.send(message);
System.out.println("发送邮件成功");
} catch (MessagingException ex) {
// 消息发送失败可以做对应的处理
System.err.println("发送邮件失败" + ex.getMessage());
}
}
/**
* 使用模板邮件
*/
public void sendEmailByTemplate(String from, String authWord, String to,
String subject, String content) {
try {
Template t = groupTemplate.getTemplate("template.html");
t.binding("subject", subject);
t.binding("content", content);
String text = t.render();
// 设置发送人邮箱和授权码
qqMailSender.setUsername(from);
qqMailSender.setPassword(authWord);
// 实例化消息对象
MimeMessage message = qqMailSender.createMimeMessage();
// 指定 utf-8 防止乱码
MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8");
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
// 为true 时候 表示文本内容以 html 渲染
helper.setText(text, true);
this.qqMailSender.send(message);
System.out.println("发送邮件成功");
} catch (MessagingException ex) {
// 消息发送失败可以做对应的处理
System.err.println("发送邮件失败" + ex.getMessage());
}
}
}
关于模板邮件的说明:
模板引擎最主要的作用是,在对邮件格式有要求的时候,采用拼接字符串不够直观,所以采用模板引擎;
这里我们使用的beetl模板引擎,原因是其性能优异,官网是介绍其性能6倍与freemaker,并有完善的文档支持。当然大家也可以换成任何其他的模板引擎(freemarker,thymeleaf)
一个简单的模板template.html如下:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<h1>邮件主题:<span style="color: chartreuse"> ${subject}</span></h1>
<h4 style="color: blueviolet">${content}</h4>
</body>
</html>
2.3 邮件发送的测试
/**
* @author : heibaiying
* @description : 发送邮件测试类
*/
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = EmailConfig.class)
public class SendEmail {
@Autowired
private SpringMail springMail;
// 发送方邮箱地址
private static final String from = "发送方邮箱地址@qq.com";
// 发送方邮箱地址对应的授权码
private static final String authWord = "授权码";
// 接收方邮箱地址
private static final String to = "接收方邮箱地址@qq.com";
@Test
public void sendMessage() {
springMail.sendTextMessage(from, authWord, to, "spring简单邮件", "Hello Spring Email!");
}
@Test
public void sendComplexMessage() {
Map<String, File> fileMap = new HashMap<>();
fileMap.put("image1.jpg", new File("D:\\LearningNotes\\picture\\msm相关依赖.png"));
fileMap.put("image2.jpg", new File("D:\\LearningNotes\\picture\\RabbitMQ模型架构.png"));
springMail.sendEmailWithAttachments(from, authWord, to, "spring多附件邮件"
, "Hello Spring Email!", fileMap);
}
@Test
public void sendEmailWithInline() {
springMail.sendEmailWithInline(from, authWord, to, "spring内嵌资源邮件"
, "Hello Spring Email!", new File("D:\\LearningNotes\\picture\\RabbitMQ模型架构.png"));
}
@Test
public void sendEmailByTemplate() {
springMail.sendEmailByTemplate(from, authWord, to,
"spring模板邮件", "Hello Spring Email!");
}
}
附:源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all
spring 5.x 系列第20篇 ——spring简单邮件、附件邮件、内嵌资源邮件、模板邮件发送 (代码配置方式)的更多相关文章
- spring 5.x 系列第19篇 ——spring简单邮件、附件邮件、内嵌资源邮件、模板邮件发送 (xml配置方式)
源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 邮件发送配置文件为springApplic ...
- spring 5.x 系列第22篇 —— spring 定时任务 (代码配置方式)
源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 关于任务的调度配置定义在ServletCo ...
- spring 5.x 系列第21篇 —— spring 定时任务 (xml配置方式)
源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 关于任务的调度配置定义在springApp ...
- spring 5.x 系列第4篇 —— spring AOP (代码配置方式)
文章目录 一.说明 1.1 项目结构说明 1.2 依赖说明 二.spring aop 2.1 创建待切入接口及其实现类 2.2 创建自定义切面类 2.3 配置切面 2.4 测试切面 2.5 切面执行顺 ...
- spring 5.x 系列第3篇 —— spring AOP (xml配置方式)
文章目录 一.说明 1.1 项目结构说明 1.2 依赖说明 二.spring aop 2.1 创建待切入接口及其实现类 2.2 创建自定义切面类 2.3 配置切面 2.4 测试切面 附: 关于切面表达 ...
- Mysql高手系列 - 第20篇:异常捕获及处理详解(实战经验)
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第20篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符 ...
- spring 5.x 系列第2篇 —— springmvc基础 (代码配置方式)
文章目录 一.搭建hello spring工程 1.1 项目搭建 1.2 相关注解说明 二.配置自定义拦截器 三.全局异常处理 四.参数绑定 4.1 参数绑定 4.2 关于日期格式转换的三种方法 五. ...
- spring cloud 入门系列一:初识spring cloud
最近看到微服务很火,也是未来的趋势, 所以就去学习下,在dubbo和spring cloud之间我选择了从spring cloud,主要有如下几种原因: dubbo主要专注于微服务中的一个环节--服务 ...
- Spring Boot 学习系列(序)—Spring Boot
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Spring Boot? Spring Boot 是由pivotal团队提供的一个基于Spring的全新框架 ...
随机推荐
- rabbitmq集群 + Mirror Queue + 使用C#
搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接 我们知道rabbitmq是一个专业的MQ产品,而且它也是一个严格遵守AMQP协议的玩意,但是要想骚,一定需要拿出高 ...
- 从DOS bat启动停止SQL Server (MSSQLSERVER)服务
由于机器上装了SQL Server2008,导致机器开机变慢,没办法只能让SQL Server (MSSQLSERVER) 服务默认不启动.但是每次要使用SQL Server时就必须从控制面板-管理 ...
- WPF应用程序顶级标签一定是Window吗?
原文:WPF应用程序顶级标签一定是Window吗? WPF应用程序顶级标签一定是Window吗? 很多人误以为是.可是,答案却是否定的.我们不妨来测试一下. 首先使用顶级标签为Window,这是最普通 ...
- PYC文件简介
PYC文件简介¶ 不说废话,这里说的pyc文件就是 Python 程序编译后得到的字节码文件 (py->pyc). 基本格式¶ pyc文件一般由3个部分组成: 最开始4个字节是一个Maigc i ...
- c语言指针详细解释
指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最基本的风格之中的一个.利用指针变量能够表示各种数据结构: 能非常方便地使用数组和字符串: 并能象汇编语言一样处理内存地址,从而编出精练而高 ...
- WPF多点触摸放大缩小旋转
原文:WPF多点触摸放大缩小旋转 版权声明:本文为博主原创文章,需要转载尽管转载. https://blog.csdn.net/z5976749/article/details/40118437 如果 ...
- cross-compile-openssl-windows.sh,cross-compile-curl-windows.sh,cross-compile-zlib-windows.sh,build-zlib-visual-studio-2015-cli.bat
https://gist.github.com/artynet build zlib with Visual Studio CLI toolhttps://gist.github.com/artyne ...
- 【 D3.js 入门系列 --- 6 】 如何使移动图表
我的个人博客是: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. [5.1]节中制作了一个比較完好的图表.但它是静态的.想做出它的动 ...
- jquery通过索引获取元素
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- 根据数据库记录动态生成C#类及其公共属性并动态执行的解决方案
原文:根据数据库记录动态生成C#类及其公共属性并动态执行的解决方案 问题: C#中,想动态产生这么一个类: public class StatisticsData { public ...