整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

「Springboot」Springboot整合邮件服务(HTML/附件/模板-QQ网易)

邮件服务是常用的服务之一,作用很多,对外可以给用户发送活动、营销广告等;对内可以发送系统监控报告与告警。

本文将介绍Springboot如何整合邮件服务,并给出不同邮件服务商的整合配置。

如图所示:

开发过程

Springboot搭建

Springboot的搭建非常简单,我们使用 https://start.spring.io/来构建,十分方便,选择需要用到的模块,就能快速完成项目的搭建:

引入依赖

为了使用邮件服务,我们需要引入相关的依赖,对于Springboot加入下面的依赖即可:

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

配置文件

需要配置邮件服务提供商的相关参数,如服务地址、用户名及密码等。下面的例子是QQ的配置,其中密码并不是QQ密码,而是QQ授权码,后续我们再讲怎么获得。

Springboot的配置文件application.yml如下:

server:
 port: 8080
spring:
 profiles:
 active: qq
---
spring:
 profiles: qq
 mail:
 host: smtp.qq.com
 username: xxx@qq.com
 password: xxx
 properties:
 mail:
 smtp:
 auth: true
 starttls:
 enable: true
 required: true
---
spring:
 profiles: netEase
 mail:
 host: smtp.163.com
 username: xxx@163.com
 password: xxx
 properties:
 mail:
 smtp:
 auth: true
 starttls:
 enable: true
 required: true

实现发送服务

JavaMailSender注入,组装Message后,就可以发送最简单的文本邮件了。

@Autowired
private JavaMailSender emailSender;
public void sendNormalText(String from, String to, String subject, String text) {
 SimpleMailMessage message = new SimpleMailMessage();
 message.setFrom(from);
 message.setTo(to);
 message.setSubject(subject);
 message.setText(text);
 emailSender.send(message);
}

调用接口

服务调用实现后,通过Controller对外暴露REST接口,具体代码如下:

@Value("${spring.mail.username}")
private String username;
@Autowired
private MailService mailService;
@GetMapping("/normalText")
public Mono<String> sendNormalText() {
 mailService.sendNormalText(username, username,
 "Springboot Mail(Normal Text)",
 "This is a mail from Springboot!");
 return Mono.just("sent");
}

把实现的MailService注入到Controller里,调用对应的方法即可。本次的邮件发送人和收件人都是同一个帐户,实际实现可以灵活配置。

通过Postman调用接口来测试一下能不能正常发送:

成功返回"sent",并收到了邮件,测试通过。

多种类型邮件

简单文本邮件

简单文本邮件如何发送,刚刚已经讲解,不再赘述。

HTML邮件

纯文本虽然已经能满足很多需求,但很多时候也需要更加丰富的样式来提高邮件的表现力。这时HTML类型的邮件就非常有用。

Service代码如下:

public void sendHtml(String from, String to, String subject, String text) throws MessagingException {
 MimeMessage message = emailSender.createMimeMessage();
 MimeMessageHelper helper = new MimeMessageHelper(message, true);
 helper.setFrom(from);
 helper.setTo(to);
 helper.setSubject(subject);
 helper.setText(text, true);
 emailSender.send(message);
}

与简单的文本不同的是,本次用到了MimeMessage和MimeMessageHelper,这是非常有用的类,后续我们经常会用到,组合使用能大大丰富邮件表现形式。

Controller的代码如下:

@GetMapping("/html")
public Mono<String> sendHtml() throws MessagingException {
 mailService.sendHtml(username, username,
 "Springboot Mail(HTML)",
 "<h1>This is a mail from Springboot!</h1>");
 return Mono.just("sent");
}

带附件邮件

邮件发送文件再正常不过,发送附件需要使用MimeMessageHelper.addAttachment(String attachmentFilename, InputStreamSource inputStreamSource)方法,第一个参数为附件名,第二参数为文件流资源。Service代码如下:

public void sendAttachment(String from, String to, String subject, String text, String filePath) throws MessagingException {
 MimeMessage message = emailSender.createMimeMessage();
 MimeMessageHelper helper = new MimeMessageHelper(message, true);
 helper.setFrom(from);
 helper.setTo(to);
 helper.setSubject(subject);
 helper.setText(text, true);
 FileSystemResource file = new FileSystemResource(new File(filePath));
 helper.addAttachment(filePath, file);
 emailSender.send(message);
}

Controller代码如下:

@GetMapping("/attachment")
public Mono<String> sendAttachment() throws MessagingException {
 mailService.sendAttachment(username, username,
 "Springboot Mail(Attachment)",
 "<h1>Please check the attachment!</h1>",
 "/Pictures/postman.png");
 return Mono.just("sent");
}

带静态资源邮件

我们访问的网页其实也是一个HTML,是可以带很多静态资源的,如图片、视频等。Service代码如下:

public void sendStaticResource(String from, String to, String subject, String text, String filePath, String contentId) throws MessagingException {
 MimeMessage message = emailSender.createMimeMessage();
 MimeMessageHelper helper = new MimeMessageHelper(message, true);
 helper.setFrom(from);
 helper.setTo(to);
 helper.setSubject(subject);
 helper.setText(text, true);
 FileSystemResource file = new FileSystemResource(new File(filePath));
 helper.addInline(contentId, file);
 emailSender.send(message);
}

其中,contentId为HTML里静态资源的ID,需要对应好。

Controller代码如下:

@GetMapping("/inlinePicture")
public Mono<String> sendStaticResource() throws MessagingException {
 mailService.sendStaticResource(username, username,
 "Springboot Mail(Static Resource)",
 "<html><body>With inline picture<img src='cid:picture' /></body></html>",
 "/Pictures/postman.png",
 "picture");
 return Mono.just("sent");
}

模板邮件

Java的模板引擎很多,著名的有Freemarker、Thymeleaf、Velocity等,这不是本点的重点,所以只以Freemarker为例使用。

Service代码如下:

@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer;
public void sendTemplateFreemarker(String from, String to, String subject, Map<String, Object> model, String templateFile) throws Exception {
 MimeMessage message = emailSender.createMimeMessage();
 MimeMessageHelper helper = new MimeMessageHelper(message, true);
 helper.setFrom(from);
 helper.setTo(to);
 helper.setSubject(subject);
 Template template = freeMarkerConfigurer.getConfiguration().getTemplate(templateFile);
 String html = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
 helper.setText(html, true);
 emailSender.send(message);
}

注意需要注入FreeMarkerConfigurer,然后使用FreeMarkerTemplateUtils解析模板,返回String,就可以作为内容发送了。

Controller代码如下:

@GetMapping("/template")
public Mono<String> sendTemplateFreemarker() throws Exception {
 Map<String, Object> model = new HashMap<>();
 model.put("username", username);
 model.put("templateType", "Freemarker");
 mailService.sendTemplateFreemarker(username, username,
 "Springboot Mail(Template)",
 model,
 "template.html");
 return Mono.just("sent");
}

注意模板文件template.html要放在resources/templates/目录下面,这样才能找得到。

模板内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
<h1>Hello ${username}</h1>
<h1>This is a mail from Springboot using ${templateType}</h1>
</body>
</html>

其中${username}和${templateType}为需要替换的变量名,Freemarker提供了很多丰富的变量表达式,这里不展开讲了。

集成不同邮件服务商

邮件服务的提供商很多,国内最常用的应该是QQ邮箱和网易163邮箱了。

QQ

集成QQ邮件需要有必备的账号,还要开通授权码。开通授权码后配置一下就可以使用了,官方的文档如下:

https://service.mail.qq.com/cgi-bin/help?subtype=1&&no=1001256&&id=28

需要注意的是,开通授权码是需要使用绑定的手机号发短信到特定号码的,如果没有绑定手机或者绑定手机不可用,那都会影响开通。

开通之后,授权码就要以作为密码配置到文件中。

163

网易的开通方式与QQ没有太大差别,具体的指导可以看如下官方文档:

http://help.mail.163.com/faqDetail.do?code=d7a5dc8471cd0c0e8b4b8f4f8e49998b374173cfe9171305fa1ce630d7f67ac2cda80145a1742516

同样也是需要绑定手机进行操作。

总结

本次例子发送后收到邮件如图所示:

邮件功能强大,Springboot也非常容易整合。技术利器,善用而不滥用。

文由掘金@天行天忌授权发布,前端晚间课对其内容进行微改。


HTML,超文本标记语言,是一种用于创建网页的标准标记语言。自从引入 HTML 以来,它就一直用于构建互联网。与 JavaScript 和 CSS 一起,HTML 构成前端开发的三剑客。

尽管许多新技术使网站创建过程变得更简单、更高效,但 HTML 始终是核心。随着 HTML5 的普及,在 2014 年,这种标记语言发生了很多变化,变得更加友好,浏览器对新标准的支持热度也越来越高。而HTML并不止于此,还在不断发生变化,并且可能会获得一些特性来证明对 HTML6 的命名更改是合理的。

支持原生模式

该元素<dialog> 将随 HTML6 一起提供。它被认为等同于用 JavaScript 开发的模态,并且已经标准化,但只有少数浏览器完全支持。但这种现象会改变,很快它将在所有浏览器中得到支持。

这个元素在其默认格式下,只会将光标显示在它所在的位置上,但可以使用 JavaScript 打开模式。

<dialog>
  <form method="dialog">
    <input type="submit" value="确定" />
    <input type="submit" value="取消" />
  </form>
</dialog>

在默认形式下,该元素创建一个灰色背景,其下方是非交互式内容。

可以在 <dialog> 其中的表单上使用一种方法,该方法将发送值并将其传递回自身 <dialog>

总的来说,这个标签在用户交互和改进的界面中变得有益。

可以通过更改 <dialog> 标签的 open 属性以控制打开和关闭。

<dialog open>
  <p>组件内容</p>
</dialog>

没有 JavaScript 的单页应用程序

FutureClaw 杂志主编 Bobby Mozumder 建议:

将锚元素链接到 JSON/XML、API 端点,让浏览器在内部将数据加载到新的数据结构中,然后浏览器将 DOM 元素替换为根据需要加载的任何数据。初始数据(以及标准错误响应)可以放在标题装置中,如果需要,可以稍后替换。

据他介绍,这是单页应用程序网页设计模式,可以提高响应速度和加载时间,因为不需要加载 JavaScript。

这个是一个比较有意思的提案,就有点类似我们以前没有做前后端分离之前的混合编程的模式,HTML变成模板语言,通过JSON API请求数据,不一样的是变成浏览器来默认解析,浏览器内部加载数据到新的数据结构中,然后浏览器将按需加载到的数据替换成 DOM 元素

大家可以看一下InfoQ上的这篇文章《针对非正式 HTML6 提案“无需 JavaScript 的单页应用”引发的论战》,了解更多!

https://www.infoq.cn/article/2015/03/html6-without-javascript


自由调整图像大小

HTML6 爱好者相信即将到来的更新将允许浏览器调整图像大小以获得更好的观看体验。

每个浏览器都难以呈现相对于设备和屏幕尺寸的最佳图像尺寸,不幸的是,src 标签 img 在处理这个问题时不是很有效。

这个问题可以通过一个新标签 <srcset> 来解决,它使浏览器在多个图像之间进行选择的工作变得更加容易。

专用库

将可用库引入 HTML6 绝对是提高开发效率的重要一步。

微格式

很多时候,需要在互联网上定义一般信息,而这些一般信息可以是任何公开的信息,例如电话号码、姓名、地址等。微格式是能够定义一般数据的标准。微格式可以增强设计者的能力,并可以减少搜索引擎推断公共信息所需的努力。

自定义菜单

尽管标签<ul>、<ol>非常有用,但在某些情况下仍有一些不足之处。可以处理交互元素的标签将是一个不错的选择。

这就是创建标签 <menu> 的驱动力,它可以处理按钮驱动的列表元素。

<menu type="toolbar">
  <li><button>个人信息</button></li>
  <li><button>系统设置</button></li>
  <li><button>账号注销</button></li>
</menu>

因此 <menu>,除了能够像普通列表一样运行之外,还可以增强 HTML 列表的功能。

增强身份验证

虽然HTML5在安全性方面还不错,浏览器和网络技术也提供了合理的保护。毫无疑问,在身份验证和安全领域还有很多事情可以做。如密钥可以异地存储;这将防止不受欢迎的人访问并支持身份验证。使用嵌入式密钥而不是 cookie,使数字签名更好等。

集成摄像头

HTML6 允许以更好的方式使用设备上的相机和媒体。将能够控制相机、它的效果、模式、全景图像、HDR 和其他属性。

总结

没有什么是完美的,HTML 也不是完美的,所以 HTML 规范可以做很多事情来使它更好。应该对一些有用的规范进行标准化,以增强 HTML 的能力。小的变化已经开始推出。如增强蓝牙支持、p2p 文件传输、恶意软件保护、云存储集成,下一个 HTML 版本可以考虑一下。

个漂亮的警告页面模板,转载自:折影轻梦,用来作为跳转提示或者改一改用作404页面什么的都挺好的,试试看吧!

效果图

下面两张图是我改了改配色,你们看看效果

演示地址

https://www.tiezi.xyz/html/a1/tishi.html

模板下载

关注我的头条号,然后私信回复 1270 ,即可获取下载地址。