最简单的 springboot 发送邮件,使用thymeleaf模板
1,导入需要的包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
2,添加配置
添加配置前先要到邮箱设置里开启SMTP服务
application.yml
spring: mail: host: smtp.qq.com username: xxxxxxx@qq.com #发送邮件人的邮箱 password: xxxxx #这个密码是邮箱设置里SMTP服务生成的授权码 default-encoding: UTF-8
3,编写发送邮箱的类
接收类MailDO.java
package com.bootdo.oa.domain; import java.util.Map; /** * 邮件接收参数 */ public class MailDO { //标题 private String title; //内容 private String content; //接收人邮件地址 private String email; //附加,value 文件的绝对地址/动态模板数据 private Map<String, Object> attachment; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Map<String, Object> getAttachment() { return attachment; } public void setAttachment(Map<String, Object> attachment) { this.attachment = attachment; } }
MailService.java
package com.bootdo.oa.service; import com.bootdo.oa.domain.MailDO; public interface MailService { void sendTextMail(MailDO mailDO); void sendHtmlMail(MailDO mailDO,boolean isShowHtml); void sendTemplateMail(MailDO mailDO); }
MailServiceImpl.java
package com.bootdo.oa.service.impl; import com.bootdo.common.exception.SystemException; import com.bootdo.oa.domain.MailDO; import com.bootdo.oa.service.MailService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.FileSystemResource; import org.springframework.mail.MailException; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.io.File; /** * 发送邮件 */ @Service public class MailServiceImpl implements MailService { private final static Logger log = LoggerFactory.getLogger(MailServiceImpl.class); //template模板引擎 @Autowired private TemplateEngine templateEngine; @Autowired private JavaMailSender javaMailSender; @Value("${spring.mail.username}") private String from; /** * 纯文本邮件 * @param mail */ @Async //不解释不懂自行百度,友情提示:有坑 @Override public void sendTextMail(MailDO mail){ //建立邮件消息 SimpleMailMessage message = new SimpleMailMessage(); message.setFrom(from); // 发送人的邮箱 message.setSubject(mail.getTitle()); //标题 message.setTo(mail.getEmail()); //发给谁 对方邮箱 message.setText(mail.getContent()); //内容 try { javaMailSender.send(message); //发送 } catch (MailException e) { log.error("纯文本邮件发送失败->message:{}",e.getMessage()); throw new SystemException("邮件发送失败"); } } /** * 发送的邮件是富文本(附件,图片,html等) * @param mailDO * @param isShowHtml 是否解析html */ @Async @Override public void sendHtmlMail(MailDO mailDO, boolean isShowHtml) { try { MimeMessage mimeMessage = javaMailSender.createMimeMessage(); //是否发送的邮件是富文本(附件,图片,html等) MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage,true); messageHelper.setFrom(from);// 发送人的邮箱 messageHelper.setTo(mailDO.getEmail());//发给谁 对方邮箱 messageHelper.setSubject(mailDO.getTitle());//标题 messageHelper.setText(mailDO.getContent(),isShowHtml);//false,显示原始html代码,无效果 //判断是否有附加图片等 if(mailDO.getAttachment() != null && mailDO.getAttachment().size() > 0){ mailDO.getAttachment().entrySet().stream().forEach(entrySet -> { try { File file = new File(String.valueOf(entrySet.getValue())); if(file.exists()){ messageHelper.addAttachment(entrySet.getKey(), new FileSystemResource(file)); } } catch (MessagingException e) { log.error("附件发送失败->message:{}",e.getMessage()); throw new SystemException("附件发送失败"); } }); } //发送 javaMailSender.send(mimeMessage); } catch (MessagingException e) { log.error("富文本邮件发送失败->message:{}",e.getMessage()); throw new SystemException("邮件发送失败"); } } /** * 发送模板邮件 使用thymeleaf模板 * 若果使用freemarker模板 * Configuration configuration = new Configuration(Configuration.VERSION_2_3_28); * configuration.setClassForTemplateLoading(this.getClass(), "/templates"); * String emailContent = FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate("mail.ftl"), params); * @param mailDO */ @Async @Override public void sendTemplateMail(MailDO mailDO) { try { MimeMessage mimeMessage = javaMailSender.createMimeMessage(); MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage,true); messageHelper.setFrom(from);// 发送人的邮箱 messageHelper.setTo(mailDO.getEmail());//发给谁 对方邮箱 messageHelper.setSubject(mailDO.getTitle()); //标题 //使用模板thymeleaf //Context是导这个包import org.thymeleaf.context.Context; Context context = new Context(); //定义模板数据 context.setVariables(mailDO.getAttachment()); //获取thymeleaf的html模板 String emailContent = templateEngine.process("/mail/mail",context); //指定模板路径 messageHelper.setText(emailContent,true); //发送邮件 javaMailSender.send(mimeMessage); } catch (MessagingException e) { log.error("模板邮件发送失败->message:{}",e.getMessage()); throw new SystemException("邮件发送失败"); } } }
差点忘了还有个模板 mail.html
放在templates/mail目录下
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>title</title> </head> <body> <h3>你看我<span style="font-size: 35px" th:text="${username}"></span>, 哈哈哈!</h3> </body> </html>
4,测试
单元测试启动太慢了,直接写controller测试
@GetMapping("/testMail") public R mail(MailDO mailDO){ try { mailService.sendTextMail(mailDO); } catch (Exception e) { return R.error(e.getMessage()); } return R.ok(); } @GetMapping("/htmlMail") public R mail(MailDO mailDO){ try { Map<String,Object> map = new HashMap<>(); map.put("附件名","附件的绝对路径"); mailDO.setAttachment(map); mailService.sendHtmlMail(mailDO,false); } catch (Exception e) { return R.error(e.getMessage()); } return R.ok(); } @GetMapping("/templateMail") public R mail(MailDO mailDO){ try { Map<String,Object> map = new HashMap<>(); map.put("username","我变大了"); mailDO.setAttachment(map); mailService.sendTemplateMail(mailDO); } catch (Exception e) { return R.error(e.getMessage()); } return R.ok(); }
5,测试结果
收工。
(转载请注明花儿为何那样红博客)