在日常的工作中,我们经常会用到邮件服务,比如发送验证码,找回密码确认,注册时邮件验证等,所以今天在这里进行邮件服务的一些操作。
我们要做的其实就是把Java程序作为一个客户端,然后通过配置SMTP协议去连接我们所使用的发送邮箱(from)对应的SMTP服务器,然后通过SMTP协议,将邮件转投到目标邮箱(to)对应的SMTP服务器,最后将该邮件分发到目标邮箱
Spring Boot给我们集成了邮件的相关服务,并给出了对应的starter,这里我们来实战学习一下邮件服务是怎么玩的。
万年不变的第一步:引入所需要的starter依赖, 这里我采用的是和我的Spring Boot对应的版本2.1.4,其余版本的话应该是相差不大,可以同样作为借鉴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> <version>2.1.4.RELEASE</version> </dependency> 复制代码
这里由于国内有几大邮箱运营商,所以分为四种不同的情况来说明
QQ邮箱
QQ邮箱是比较麻烦的一种,需要登录到邮箱中找到对应的配置,并验证密码后开启STMP服务
点击这里可以去获取对应的授权码,后面的配置中我们会用到~
个人QQ邮箱的SMTP服务器的host是: smtp.qq.com
163邮箱
对应的授权码就是我们邮箱的密码~
SMTP服务器的host是: smtp.163.com
腾讯企业邮箱
对应的授权码也是我们邮箱的密码
企业的和个人的host略有不同: smtp.exmail.qq.com
阿里企业邮箱
对应的授权码也是我们邮箱的密码
阿里的企业邮箱host是: smtp.mxhichina.com
得到对应的信息之后,我们就可以去完善我们的配置信息了 ~
# 这里的host对应是上面的几大运营商的STMP服务器的host spring.mail.host=smtp.163.com spring.mail.username=****@163.com # 这里的password对应的就是上面的授权码 spring.mail.password=*** spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true spring.mail.default-encoding=UTF-8 复制代码
/** * 邮件实体类 * @author vi * @since 2019/07/17 */ @Data @NoArgsConstructor @AllArgsConstructor public class Mail { /** * 邮件发送人 */ private String from; /** * 邮件接收人 */ private String to; /** * 邮件主题 */ private String subject; /** * 邮件内容 */ private String content; /** * 邮件主题 */ private String type; /** * 发送邮件模板时的模板文件名 */ private String templateName; /** * 模板参数 */ private Map<String,Object> variables; /** * 附件地址 */ private String attachPath; } 复制代码
在这里,我将发送邮件分为了两种情况:
/** * 发送普通邮件 * @param email 邮件对象 */ private static void sendSimpleMail(Mail email) { SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); // 邮件发送人 simpleMailMessage.setFrom(email.getFrom()); // 邮件接收人 simpleMailMessage.setTo(email.getTo()); // 邮件主题 simpleMailMessage.setSubject(email.getSubject()); // 邮件内容 simpleMailMessage.setText(email.getContent()); // 发送邮件 javaMailSender.send(simpleMailMessage); } 复制代码
/** * 发送MIME类型的邮件 * @param email 邮件对象 */ private static void sendMimeMail(Mail email) { // 生成邮件字符串 String content = email.getContent(); if (email.getVariables() != null) { content = generate(email); } // 基于这个对象可以发送HTML,或者携带附件的二进制邮件 MimeMessage message= javaMailSender.createMimeMessage(); try { // 构建发送模板邮件的对象 MimeMessageHelper helper = new MimeMessageHelper(message,true); // 设置发送邮箱 helper.setFrom(email.getFrom()); // 设置接收邮箱 helper.setTo(email.getTo()); // 设置邮件名(主题) helper.setSubject(email.getSubject()); // 设置邮件内容 helper.setText(content,true); // 这里可以发送带有附件的邮件,如果没有附件可以省略,就不在多做描述 if (!StringUtils.isNullOrEmpty(email.getAttachPath())) { FileSystemResource file = new FileSystemResource(new File(email.getAttachPath())); helper.addAttachment(file.getFilename(), file); } // 发送邮件 javaMailSender.send(message); } catch (MessagingException e) { } } /** * 生成模板字符串 * @param email 邮件对象 * @return */ private static String generate(Mail email) { Context context = new Context(); // 设置模板参数 context.setVariables(email.getVariables()); // 加载模板后的内容字符串 return templateEngine.process(email.getTemplateName(), context); } 复制代码
最后可以把这两个方法统一接口,通过Mail类中的类型来判断调用哪一个方法即可~
/** * 对外开放的统一发送邮件方法 * @param mail */ public static void sendEmail(Mail mail) { String type = mail.getType(); switch (type) { case "1": sendSimpleMail(mail); case "2": sendMimeMail(mail); } } 复制代码
如果我们需要发送模板邮件的话,需要使用到模板引擎freemaker或thymeleaf,这里我拿thymeleaf来说一下~
第一步,可以引入pom文件
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> 复制代码
第二步,需要在配置文件中进行配置
spring.thymeleaf.check-template-location=true spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html spring.thymeleaf.mode=HTML5 spring.thymeleaf.encoding=UTF-8 复制代码
第三步,通过我们获取到的模板参数对Mail类进行set方法
mail.setVariables(email.getVariables()); 复制代码
第四步,我们需要在模板中去使用参数
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h3 style="color: red;" th:text="${username}"></h3> </body> </html> 复制代码
注意,这里的thymeleaf的用法,使用标签 th:text
来赋值,更多的模板用法,可以去
查阅thymeleaf的用法~
邮件在这里就告一段落了,下篇预告:JVM系列(一):JVM简介,敬请期待,谢谢大家一直以来的支持!