springBoot集成郵件服務發送郵件包含附件圖片富文本或Thymeleaf模板發送郵件


在實際開發中,需要有很多地方用到關聯郵件發送消息,比如注冊成功信息,找回密碼信息,或者通過郵件發送即將過期信息等等,所使用的應用場景很多很多,下面調用JavaMailSender發送郵件,

一、郵箱配置

首先需要我們注冊郵箱,並開啟二級密碼設置,最主要的是開啟郵箱的POP3/SMTP服務,這里以網易雲郵箱舉例,點擊設置——POP3/SMTP/IMAP

 

 並開啟授權碼,類似下圖,這個授權碼要牢記,后面會用到

 1.配置完成,新建項目,在spirngBoot工程的pom.xml中導入郵件所需依賴及其他項目所需依賴

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

2.配置application.properties

spring.mail.host=smtp.163.com
spring.mail.username=xxxxxxxxxxx@163.com
spring.mail.password=IPRWWISBDJIYVSYV
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

host qq郵箱為smtp.qq.com 網易郵箱為smtp.163.com

username為郵箱賬號

password 特別注意這里password不代表郵箱的登錄密碼, 而是在剛開始生成的授權碼

auth 開啟權限驗證

starttls.enable 是否開啟加密通訊

starttls.required 是否必須開啟加密通訊

3.新建郵件格式實體類,以自己內容為主 發送人,主題,內容

public class EmailBean implements Serializable {

    private String[] receiver;

    private String subject;

    private String content;
 
    public String[] getReceiver() {
  return receiver;
   }

   public void setReceiver(String receiver) {
  this.receiver = new String[] {receiver};
   }

   public void setReceiver(String... receiver) {
  this.receiver = receiver;
   }
    ..getter and setter
    
}

4.新建郵件發送工具類

(1)、純文本格式郵件

@Component
public class EmailUtil {

    @Value("${spring.mail.username}")
    private String sender;

    @Autowired
    JavaMailSender javaMailSender;

    public void sendPlainTextMail(EmailBean emailBean){
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        simpleMailMessage.setFrom(sender);
        simpleMailMessage.setTo(emailBean.getReceiver());
        simpleMailMessage.setSubject(emailBean.getSubject());
        simpleMailMessage.setText(emailBean.getContent());
        javaMailSender.send(simpleMailMessage);
    }

}

測試類調用

@Autowired
EmailUtil emailUtil;

    @Test
    public void sendMail(){
        EmailBean emailBean = new EmailBean();
        emailBean.setReceiver("xxxx@qq.com");
        emailBean.setSubject("springBoot發送純文本郵件測試");
        emailBean.setContent("這是一段純文本格式的郵件");
        emailUtil.sendPlainTextMail(emailBean);
    }

測試執行,最終執行結果

 

發送郵件給多人,當然這個可以用的地方不是很多,在實體類我們將接收者receiver設成數組格式,方便群發郵件

替換上一步emailBean.setReceiver()

@Test
    public void sendMail(){
        EmailBean emailBean = new EmailBean();
        String[] arrReceivers = new String[] {"xxxxx1@qq.com", "xxxxx2@qq.com"};
        emailBean.setReceiver(arrReceivers);
        emailBean.setSubject("springBoot發送純文本郵件測試");
        emailBean.setContent("這是一段春純文本格式的郵件,當前時間" + new Date());
        emailUtil.sendPlainTextMail(emailBean);
        logger.warn(String.format("發送郵件給%s成功", Arrays.toString(arrReceivers)));
    }

結果

 

(2)發送帶有HTML代碼的郵件發送

可以看到我們使用的JavaMailSender繼承了MailSender,發送純文本格式的使用SimpleMailMessage

 而發送帶有附件信息或者富文本格式的郵件我們需要使用MimeMessage

 在上一步EmailUtils.java里添加方法

 public void sendMimeMail(EmailBean emailBean) throws MessagingException {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
        mimeMessageHelper.setFrom(sender);
        mimeMessageHelper.setTo(emailBean.getReceiver());
        mimeMessageHelper.setSubject(emailBean.getSubject());
        mimeMessageHelper.setText(emailBean.getContent(), true);
        javaMailSender.send(mimeMessage);
    }

進行測試

@Test
public void sendMimeEmail() throws MessagingException {
EmailBean emailBean = new EmailBean();
emailBean.setReceiver("xxxxxx@qq.com");
emailBean.setSubject("springBoot發送HTML格式郵件測試");
emailBean.setContent("<h1 style='color:red'>springBoot集成郵件發送html格式郵件測試</h1>");
emailUtil.sendMimeMail(emailBean);
logger.warn("發送郵件給成功");
}

 (3)html中含有圖片或者將圖片以正文發送郵件

html代碼中的圖片需要在MimeMessageHelper中添加

    public void sendMimeMail(EmailBean emailBean) throws MessagingException {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
        mimeMessageHelper.setFrom(sender);
        mimeMessageHelper.setTo(emailBean.getReceiver());
        mimeMessageHelper.setSubject(emailBean.getSubject());
        mimeMessageHelper.setText(emailBean.getContent(), true);
        FileSystemResource fileSystemResource = new FileSystemResource(new File("C:\\Users\\ThinkPad\\Desktop\\image.png"));
        mimeMessageHelper.addInline("image", fileSystemResource);
        javaMailSender.send(mimeMessage);
    }

這里mimeMessageHelper.addInline()中的參數表示獲取資源的id和Resource

@Test
    public void sendMimeEmail() throws MessagingException {
        EmailBean emailBean = new EmailBean();
        emailBean.setReceiver("xxxxxx@qq.com");
        emailBean.setSubject("springBoot發送HTML包含圖片郵件測試");
        emailBean.setContent("<h5 style='color:red'>springBoot集成郵件發送html格式郵件測試</h5>" +
                "<img src='cid:image");
        emailUtil.sendMimeMail(emailBean);
        logger.warn("發送郵件給成功");
    }

點擊測試

 

 可以看到圖片正常顯示

(4)帶有附件的郵件發送

在EmailUtil.java中添加方法

    public void sendAppendMimeMail(EmailBean emailBean) throws MessagingException {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
        mimeMessageHelper.setFrom(sender);
        mimeMessageHelper.setTo(emailBean.getReceiver());
        mimeMessageHelper.setSubject(emailBean.getSubject());
        mimeMessageHelper.setText(emailBean.getContent(), true);
        String filePath = "C:\\Users\\ThinkPad\\Desktop\\賬號密碼.xls";
        FileSystemResource fileSystemResource = new FileSystemResource(new File(filePath));
        mimeMessageHelper.addAttachment("11.xls", fileSystemResource);
        javaMailSender.send(mimeMessage);
    }

  

@Test
    public void sendAppendMimeEmail() throws MessagingException {
        EmailBean emailBean = new EmailBean();
        emailBean.setReceiver("xxxxxx@qq.com");
        emailBean.setSubject("springBoot集成郵件發送附件測試");
        emailBean.setContent("<h1 style='color:red'>springBoot集成郵件發送html格式郵件及附件文件測試</h1>");
        emailUtil.sendAppendMimeMail(emailBean);
    logger.warn("含有附件郵件發送成功");
}

  

 

 

 (5)使用Thymeleaf模板發送郵件

上一步我們用html代碼發送郵件,就寫了兩行已經感覺比較麻煩了字符串的拼接和圖片的上傳,較復雜的內容郵件用這種方式會顯得很麻煩,所有我們使用模板,需要改變的值用參數代替來達到個性化的郵件。

繼續在pom.xml文件中導入Thymeleaf依賴

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

z在templates文件夾下新建mailTemp.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body >
<div style="background-color:#222222;">
<img src="http://message-center-cbc-cn.obs.cn-north-1.myhuaweicloud.com/BSS/templateImg/2019411_zh_logo.png" />
</div>
<h4 th:text="|尊敬的華為雲客戶${username}|"></h4>
    您好!
<p style="text-indent:2em">您的賬戶余額不足50.00元,為了保證您的業務正常運行,請及時進行<a href="https://cnblogs.com/LiuFqiang">充值</a></p>
    <p style="text-indent:2em">感謝您對華為雲的支持!</p>

<hr style="margin-left: initial;width: 100%; border:1px dashed #987cb9 ">
<p style="color: #999;font-size: 14px;margin-top:10px;margin-bottom:40px">
    本郵件由系統自動發送,請勿直接回復!
</p>
<br >
<p>官方網站:<a href="https://cnblogs.com/LiuFqiang">https://cnblogs.com/LiuFqiang</a></p>
<p>Wechat:15641483049</p>
</body>
</html>

在測試類測試:

@Autowired
    private TemplateEngine templateEngine;

@Test
    public void sendHtmlEmail() throws MessagingException {
        Context context = new Context();
        context.setVariable("username", "劉**");
        String emailContent = templateEngine.process("mailTemp", context);
        EmailBean emailBean = new EmailBean();
        emailBean.setReceiver("xxxxx@qq.com");
        emailBean.setSubject("springBoot集成郵件服務");
        emailBean.setContent(emailContent);
        emailUtil.sendMimeMail(emailBean);
        logger.warn("模板郵件發送成功!");
    }

這里需要注意templateEmgine.process的模板路徑名字一個要與template靜態文件的相對應,並且模板的參數名與context.setVariable的一一對應

 

 

 

 完結!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM