SpringBoot使⽤Thymeleaf如何发送带模板的Email邮件SpringBoot+Thymeleaf发送模板邮件
如何在Spring Boot 应⽤中发送邮件以及使⽤简单强⼤的Thymeleaf模板引擎来制作邮件内容。
⼀、授权码
常⽤的电⼦协议有POP3,SMTP,IMAP,协议的具体区别就不进⾏详细介绍了。这⾥选择smtp协议进⾏演⽰。
登录邮箱,在设置中到协议地址,点击开启。授权码只会显⽰⼀次,需要保存好。
下⾯是126邮箱对应的三种协议主机地址:
smtp.126
pop.126
imap.126
⼆、导⼊pom依赖
<!-- 发送邮件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!-- thymeleaf -->
thymeleaf用法
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
三、邮件服务器属性配置
通常情况下,如果所需要的依赖在 class path 中都是可⽤的话,这时候Spring会⾃动帮你注册⼀个默
认实现的邮件发送服务 (default mail sender service)。 spring.mail.host 属性已经被⾃动定义了, 所有我们所需要做的事情就是把这个属性添加到我们应⽤的application.properties 配置⽂件中。
为了防⽌springboot项⽬打包成jar⽂件之后,读取不到⽂件,我们把图⽚和附件都放在服务器指定路径上,直接读取该⽂件。
注意:password不是邮箱登录密码,⽽是第⼀步中获取的授权码。
#mail
spring.mail.host=smtp.126
spring.mail.username=xxx@126
spring.mail.password=********
spring.mail.properties.mail.smtp.auth=false
spring.mail.properties.mail.able=false
spring.mail.properties.mail.quired=false
#html template path (resources/templates/email/template.html)
templatePath=email/template
#mail image path
imagePath=D:\\image\\logo.jpg
#imagePath=/neworiental/web/cpbm/image/logo.jpg
⼀、默认端⼝号:25
25端⼝为SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)服务所开放的,是⽤于发送邮件。
⼆、使⽤465端⼝发送邮件
465端⼝是为SMTPS(SMTP-over-SSL)协议服务开放的,这是SMTP协议基于SSL安全协议之上的⼀种变种它继承了SSL安全协议的⾮对称加密的⾼度安全可靠性,可防⽌邮件泄露。SMTPS和SMTP协议⼀样,也是⽤来发送邮件(最重要的⼀点是阿⾥云服务器上不能使⽤25端⼝发送)
有坑:Could not connect to SMTP host: smtp.qq, port: 465, response: -1
需要配置 SSL 如下:
spring:
mail:
host: smtp.126 #发送邮件服务器
username: xxx@126 #⽹易邮箱
password: ********** #客户端授权码
protocol: smtp #发送邮件协议
properties.mail.smtp.auth:true
properties.mail.smtp.port:465
properties.mail.able:true
properties.mail.quired:true
properties.mail.able:true #开启SSL
default-encoding: utf-8
from: xx@126
properties.mail.debug:true #开启邮件debug    (有打印⽇志 -- 特详细太多)
三、邮件发送的⼯具类
@Component
public class SendEmailUtils {
private final static Logger logger = Logger(SendEmailUtils.class);
@Autowired
private JavaMailSender javaMailSender;
@Autowired
private TemplateEngine templateEngine;
/**
* html模板邮件
* @param from 发件⼈
* @param to 收件⼈
* @param subject 邮件主题
* @param emailParam 给模板的参数
* @param template html模板路径(相对路径)  Thymeleaf的默认配置期望所有HTML⽂件都放在 **resources/templates ** ⽬录下,以.html扩展名结尾。  * @param imagePath 图⽚/⽂件路径(绝对路径)
* @throws MessagingException
*/
public void thymeleafEmail(String from,String[] to, String subject,EmailParam emailParam,String template,String imgPath)throws MessagingException {    MimeMessage mimeMessage =ateMimeMessage();
MimeMessageHelper mimeMessageHelper =new MimeMessageHelper(mimeMessage,true);
mimeMessageHelper.setFrom(from);
mimeMessageHelper.setTo(to);
mimeMessageHelper.setSubject(subject);
// 利⽤ Thymeleaf 模板构建 html ⽂本
Context ctx =new Context();
// 给模板的参数的上下⽂
ctx.setVariable("emailParam", emailParam);
// 执⾏模板引擎,执⾏模板引擎需要传⼊模板名、上下⽂对象
// Thymeleaf的默认配置期望所有HTML⽂件都放在 **resources/templates ** ⽬录下,以.html扩展名结尾。
// String emailText = templateEngine.process("email/templates", ctx);
String emailText = templateEngine.process(template, ctx);
mimeMessageHelper.setText(emailText,true);
// FileSystemResource logoImage= new FileSystemResource("D:\\image\\logo.jpg");
//绝对路径
FileSystemResource logoImage =new FileSystemResource(imgPath);
//相对路径,项⽬的resources路径下
//ClassPathResource logoImage = new ClassPathResource("static/image/logonew.png");
// 添加附件,第⼀个参数表⽰添加到 Email 中附件的名称,第⼆个参数是图⽚资源
//⼀般图⽚调⽤这个⽅法
mimeMessageHelper.addInline("logoImage", logoImage);
//⼀般⽂件附件调⽤这个⽅法
//  mimeMessageHelper.addAttachment("logoImage", resource);
javaMailSender.send(mimeMessage);
}
}
四、邮件参数实体类EmailParam.java
public class EmailParam {
private String itemName;//产品名称
private String stuName;//学⽣姓名
private String updateContent;//变更操作
private String updatePerson;//操作⼈员
private String updateDate;//操作时间
private String remarks;//备注
//省略get、set⽅法
}
五、Controller调⽤邮件⼯具类发送邮件
@RestController
@RequestMapping("/test")
public class ItemController {
private final Logger log = Logger(ItemController.class);
@Value("${spring.mail.username}")
private String from;
@Value("${templatePath}")
private String templatePath;
@Value("${imagePath}")
private String imagePath;
@Autowired
private SendEmailUtils sendEmailUtils;
/**
* email
* @param itemIds
* @param response
*/
@PostMapping(value ="/email", produces ="text/plain;charset=UTF-8")
public void testEmaili(String itemIds,HttpServletResponse response/*,
HttpServletRequest request, HttpSession session,
@RequestHeader("Authorization") String authToken, Principal puser*/){
try{
EmailParam emailParam =new EmailParam();
emailParam.setStuName("张阿⽜");
emailParam.setItemName("亚太银⾏账⽬统计");
emailParam.setUpdateContent("付款到账");
emailParam.setUpdatePerson("盖茨");
emailParam.setRemarks("成功到账");
//此处to数组输⼊多个值,即可实现批量发送
String [] to={"**********@163"};
sendEmailUtils.thymeleafEmail(from, to,"这是⼀封测试邮件主题", emailParam, templatePath, imagePath); }catch(Exception e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
六、通过事件监听注册事件并发送邮件
通过⾃动发送邮件
UserRegisterEvent 事件
import com.ity.BaseUser;
import lombok.Getter;
import t.ApplicationEvent;
/**
* ⽤户注册事件
*
* @author arjun
* @date 2020/12/15
*/
@Getter
public class UserRegisterEvent extends ApplicationEvent {
/**
* 发送内容
*/
private BaseUser user;
public UserRegisterEvent(Object source, BaseUser user){ super(source);
this.user = user;
}
}
RegisterSentMailListener

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。