整合營銷服務商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          springboot(二十四)使用springboot發(fā)送郵件

          面記錄使用springboot發(fā)送四種郵件的方法:普通文本、html、附件、模板html

          1、引入springboot依賴包

          gradle:

           compile group: 'org.springframework.boot', name: 'spring-boot-starter-mail'
           compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf'
          

          maven:

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

          spring-boot-starter-mail實現(xiàn)郵件發(fā)送
          spring-boot-starter-thymeleaf實現(xiàn)模板的創(chuàng)建

          2、 在resources/templates中創(chuàng)建一個模板html:emailTemplate.html

          <!DOCTYPE html>
          <html lang="en" xmlns:th="http://www.thymeleaf.org">
          <head>
              <meta charset="UTF-8">
              <title>這是一個測試的模板</title>
          </head>
          <body>
          您的賬號存在異常,請點擊下面鏈接進行安全驗證<br/>
          <a href="#" th:href="@{http://www.lalalala.com/{userid}(userid=${userid})}">安全驗證</a>
          </body>
          </html>
          

          3、 四種郵件發(fā)送測試代碼

          package com.iscas.biz.test.controller;
          
          import com.iscas.templet.common.BaseController;
          import com.iscas.templet.common.ResponseEntity;
          import lombok.extern.slf4j.Slf4j;
          import org.springframework.beans.factory.annotation.Autowired;
          import org.springframework.core.io.FileSystemResource;
          import org.springframework.mail.SimpleMailMessage;
          import org.springframework.mail.javamail.JavaMailSender;
          import org.springframework.mail.javamail.MimeMessageHelper;
          import org.springframework.web.bind.annotation.GetMapping;
          import org.springframework.web.bind.annotation.RequestMapping;
          import org.springframework.web.bind.annotation.RestController;
          import org.thymeleaf.TemplateEngine;
          import org.thymeleaf.context.Context;
          
          import javax.mail.MessagingException;
          import javax.mail.internet.MimeMessage;
          
          /**
           * 郵件發(fā)送測試
           *
           * @author zhuquanwen
           * @vesion 1.0
           * @date 2020/8/12 21:16
           * @since jdk1.8
           */
          @RestController
          @RequestMapping("/send/email/test")
          @Slf4j
          public class SendEmailController extends BaseController {
              @Autowired
              private JavaMailSender javaMailSender;
              @Autowired
              private TemplateEngine templateEngine;
          
              /**
               * 測試發(fā)送普通文本郵件
               * */
              @GetMapping("/text")
              public ResponseEntity testText() {
          
                  SimpleMailMessage message = new SimpleMailMessage();
                  // 發(fā)件人地址
                  message.setFrom("461402005@qq.com");
                  // 收件人地址
                  message.setTo("76775081@qq.com");
                  // 郵件標題
                  message.setSubject("這是一個測試");
                  // 郵件正文
                  message.setText("這是測試正文");
          
                  javaMailSender.send(message);
                  log.debug("發(fā)送成功!");
          
                  return getResponse();
              }
          
              /**
               * 測試發(fā)送HTML郵件
               * */
              @GetMapping("/html")
              public ResponseEntity testHtml() throws MessagingException {
          
                  MimeMessage message = javaMailSender.createMimeMessage();
                  // 這里與發(fā)送文本郵件有所不同
                  MimeMessageHelper helper = new MimeMessageHelper(message, true);
                  // 發(fā)件人地址
                  helper.setFrom("461402005@qq.com");
                  // 收件人地址
                  helper.setTo("76775081@qq.com");
                  helper.setSubject("這是html測試");
                  // 發(fā)送HTML郵件
                  String html = "<html><body><h1>這是測試測試</h1></body></html>";
                  helper.setText(html, true);
          
                  javaMailSender.send(message);
                  log.debug("發(fā)送成功");
          
                  return getResponse();
              }
          
              /**
               * 測試發(fā)送附件
               * */
              @GetMapping("/attachment")
              public ResponseEntity testAttachment() throws MessagingException {
          
                  MimeMessage message = javaMailSender.createMimeMessage();
                  // 這里與發(fā)送文本郵件有所不同
                  MimeMessageHelper helper = new MimeMessageHelper(message, true);
                  // 發(fā)件人地址
                  helper.setFrom("461402005@qq.com");
                  // 收件人地址
                  helper.setTo("76775081@qq.com");
                  helper.setSubject("這是附件測試");
                  // 發(fā)送HTML
                  String html = "<html><body><h1>這是測試測試</h1></body></html>";
                  helper.setText(html, true);
          
                  //發(fā)送附件
                  FileSystemResource file = new FileSystemResource("E:\\test\\repo1\\a.txt");
                  // 發(fā)送文件名
                  String fileName = file.getFilename();
                  helper.addAttachment(fileName, file);
          
                  javaMailSender.send(message);
                  log.debug("發(fā)送成功");
          
                  return getResponse();
              }
          
              /**
               * 測試發(fā)送thymeleaf模板郵件
               * */
              @GetMapping("/template")
              public ResponseEntity testTemplate() throws MessagingException {
          
                  MimeMessage message = javaMailSender.createMimeMessage();
                  // 這里與發(fā)送文本郵件有所不同
                  MimeMessageHelper helper = new MimeMessageHelper(message, true);
                  // 發(fā)件人地址
                  helper.setFrom("461402005@qq.com");
                  // 收件人地址
                  helper.setTo("76775081@qq.com");
                  helper.setSubject("這是模板測試");
          
                  //獲取模板生成html
                  Context context = new Context();
                  // 這里的id與resources/templates下的模板文件中的${userid}必須對應
                  context.setVariable("userid", 1);
                  // 這里的"emailTemplate"與resources/templates下的模板文件一直
                  String html = templateEngine.process("emailTemplate", context);
                  helper.setText(html, true);
          
                  //發(fā)送附件
                  FileSystemResource file = new FileSystemResource("E:\\test\\repo1\\a.txt");
                  // 發(fā)送文件名
                  String fileName = file.getFilename();
                  helper.addAttachment(fileName, file);
          
                  javaMailSender.send(message);
                  log.debug("發(fā)送成功");
          
                  return getResponse();
              }
          }

          4、 將郵件發(fā)送封裝為工具類

          package com.iscas.base.biz.service.common;
          
          import cn.hutool.core.io.IoUtil;
          import com.iscas.templet.common.ResponseEntity;
          import lombok.Cleanup;
          import lombok.extern.slf4j.Slf4j;
          import org.springframework.beans.factory.annotation.Autowired;
          import org.springframework.core.io.ByteArrayResource;
          import org.springframework.core.io.FileSystemResource;
          import org.springframework.core.io.InputStreamResource;
          import org.springframework.mail.SimpleMailMessage;
          import org.springframework.mail.javamail.JavaMailSender;
          import org.springframework.mail.javamail.MimeMessageHelper;
          import org.springframework.stereotype.Service;
          import org.springframework.web.bind.annotation.GetMapping;
          import org.thymeleaf.TemplateEngine;
          import org.thymeleaf.context.Context;
          
          import javax.mail.MessagingException;
          import javax.mail.internet.MimeMessage;
          import java.io.ByteArrayOutputStream;
          import java.io.IOException;
          import java.io.InputStream;
          
          /**
           * 發(fā)送郵件工具
           *
           * @author zhuquanwen
           * @vesion 1.0
           * @date 2020/8/12 21:52
           * @since jdk1.8
           */
          @Service
          @Slf4j
          public class SendEmailService {
              @Autowired
              private JavaMailSender javaMailSender;
              @Autowired
              private TemplateEngine templateEngine;
          
              /**
               * 發(fā)送普通文本郵件
               *
               * @version 1.0
               * @since jdk1.8
               * @date 2020/8/12
               * @param from 發(fā)送郵件地址
               * @param to 接收郵件地址
               * @param title 郵件主題
               * @param content 郵件正文文本
               * */
              public void sendText(String from, String to, String title, String content) {
          
          
                  SimpleMailMessage message = new SimpleMailMessage();
                  // 發(fā)件人地址
                  message.setFrom(from);
                  // 收件人地址
                  message.setTo(to);
                  // 郵件標題
                  message.setSubject(title);
                  // 郵件正文
                  message.setText(content);
          
                  javaMailSender.send(message);
                  log.debug("郵件發(fā)送成功!");
              }
          
              /**
               * 發(fā)送HTML郵件
               * @version 1.0
               * @since jdk1.8
               * @date 2020/8/12
               * @param from 發(fā)送郵件地址
               * @param to 接收郵件地址
               * @param title 郵件主題
               * @param html 郵件正文html
               * */
              public void sendHtml(String from, String to, String title, String html) throws MessagingException {
          
                  MimeMessage message = javaMailSender.createMimeMessage();
                  // 這里與發(fā)送文本郵件有所不同
                  MimeMessageHelper helper = new MimeMessageHelper(message, true);
                  // 發(fā)件人地址
                  helper.setFrom(from);
                  // 收件人地址
                  helper.setTo(to);
                  helper.setSubject(title);
                  // 發(fā)送HTML郵件
                  helper.setText(html, true);
          
                  javaMailSender.send(message);
                  log.debug("郵件發(fā)送成功");
          
              }
          
              /**
               * 發(fā)送附件
               *
               *
               * @version 1.0
               * @since jdk1.8
               * @date 2020/8/12
               * @param from 發(fā)送郵件地址
               * @param to 接收郵件地址
               * @param title 郵件主題
               * @param html 郵件正文html
               * @param inputStream 附件輸入流
               * @param fileName 文件名稱
               *
               * */
              public void sendAttachment(String from, String to, String title, String html, InputStream inputStream, String fileName) throws MessagingException {
          
                  MimeMessage message = javaMailSender.createMimeMessage();
                  // 這里與發(fā)送文本郵件有所不同
                  MimeMessageHelper helper = new MimeMessageHelper(message, true);
                  // 發(fā)件人地址
                  helper.setFrom(from);
                  // 收件人地址
                  helper.setTo(to);
                  helper.setSubject(title);
                  // 發(fā)送HTML
                  helper.setText(html, true);
          
                  //發(fā)送附件
          
                  ByteArrayOutputStream baos = new ByteArrayOutputStream();
                  IoUtil.copy(inputStream, baos);
          
                  ByteArrayResource byteArrayResource = new ByteArrayResource(baos.toByteArray());
                  // 發(fā)送文件名
                  helper.addAttachment(fileName, byteArrayResource);
          
                  javaMailSender.send(message);
                  log.debug("發(fā)送成功");
          
              }
          
              /**
               * 測試發(fā)送thymeleaf模板郵件
               * templateName必須在resources/templates下
               *
               * @version 1.0
               * @since jdk1.8
               * @date 2020/8/12
               * @param from 發(fā)送郵件地址
               * @param to 接收郵件地址
               * @param title 郵件主題
               * @param templateName 模板名稱,templateName必須在resources/templates下
               * @param context 構(gòu)建模板的上下文,構(gòu)建方式參見單元測試
               * */
              @GetMapping("/template")
              public void sendTemplate(String from, String to, String title, String templateName, Context context) throws MessagingException {
          
                  MimeMessage message = javaMailSender.createMimeMessage();
                  // 這里與發(fā)送文本郵件有所不同
                  MimeMessageHelper helper = new MimeMessageHelper(message, true);
                  // 發(fā)件人地址
                  helper.setFrom(from);
                  // 收件人地址
                  helper.setTo(to);
                  helper.setSubject(title);
          
                  //獲取模板生成html
                  String html = templateEngine.process(templateName, context);
                  helper.setText(html, true);
          
                  javaMailSender.send(message);
                  log.debug("郵件發(fā)送成功");
          
              }
          
              /**
               * 測試發(fā)送thymeleaf模板郵件,并攜帶附件
               * templateName必須在resources/templates下
               * @version 1.0
               * @since jdk1.8
               * @date 2020/8/12
               * @param from 發(fā)送郵件地址
               * @param to 接收郵件地址
               * @param title 郵件主題
               * @param templateName 模板名稱,templateName必須在resources/templates下
               * @param context 構(gòu)建模板的上下文,構(gòu)建方式參見單元測試
               * @param inputStream 附件輸入流
               * @param fileName 文件名稱
               * */
              public void sendTemplateWithAttachment(String from, String to, String title, String templateName, Context context, InputStream inputStream, String fileName) throws MessagingException {
                  //獲取模板生成html
                  String html = templateEngine.process(templateName, context);
                  sendAttachment(from, to, title, html, inputStream, fileName);
              }
          }
          

          5、單元測試 


          子郵件服務器

          電子郵件服務器類比于現(xiàn)實中的郵局。用戶發(fā)郵件時,會將郵件發(fā)送到郵件服務器,郵件服務器將郵件再發(fā)送到接收方的電子郵箱中。

          郵件服務器又可以分為兩種類型:

          “SMTP郵件服務器:替用戶發(fā)送郵件和接收外面發(fā)送給本地用戶的郵件。POP3/IMAP郵件服務器:幫助用戶讀取SMTP郵件服務器接收進來的郵件。”

          郵件傳輸協(xié)議

          郵件傳輸協(xié)議有如下幾種

          • SMTP協(xié)議:全稱為 Simple Mail Transfer Protocol,簡單郵件傳輸協(xié)議。它定義了郵件客戶端軟件和SMTP郵件服務器之間,以及兩臺SMTP郵件服務器之間的通信規(guī)則。
          • POP3協(xié)議:全稱為 Post Office Protocol,郵局協(xié)議。它定義了郵件客戶端軟件和POP3郵件服務器的通信規(guī)則。
          • IMAP協(xié)議:全稱為 Internet Message Access Protocol,Internet消息訪問協(xié)議,它是對POP3協(xié)議的一種擴展,也是定義了郵件客戶端軟件和IMAP郵件服務器的通信規(guī)則。

          郵箱開啟SMTP/IMAP服務

          以QQ郵箱為例

          開啟后需要生成授權(quán)碼。

          我為什么選擇SpringBoot框架來發(fā)送郵件

          我們來看看純Java代碼發(fā)郵件。

          send方法就如此之長,而SpringBoot將發(fā)送功能封裝好了。接下來你將看到用SpringBoot發(fā)送郵件是如何的簡單。

          SpringBoot發(fā)送郵

          導入Maven jar包

          <!--郵件-->
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-mail</artifactId>
          </dependency>
          
          <!--模板引擎-->
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-thymeleaf</artifactId>
          </dependency>
          

          這里的模板引擎后面需要,這里先導入進來。

          application.properties文件配置

          #郵件配置
          spring.mail.host=smtp.qq.com
          spring.mail.port=587
          spring.mail.username=1587xx3453@qq.com
          spring.mail.password=yurzjzmreurpgfdghalouke
          spring.mail.default-encoding=UTF-8
          spring.mail.properties.mail.smtp.socketFactoryClass=javax.net.ssl.SSLSocketFactory
          spring.mail.properties.mail.debug=true
          

          如果是QQ郵箱發(fā)送,你只需要修改username和password。password為上面生成的授權(quán)碼,不是你郵箱的登錄密碼哦。

          編寫郵件發(fā)送方法

          發(fā)送結(jié)果

          如果我們要發(fā)送附件

          發(fā)送結(jié)果如下圖

          如果需要在正文插入圖片

          發(fā)送結(jié)果如下

          當然我們也可以使用模板引擎

          在resources/templates目錄下創(chuàng)建文件thymeleaf-mail.html文件。

          thymeleaf-mail.html內(nèi)容如下

          <!DOCTYPE html>
          <html lang="en" xmlns:th="http://www.thymeleaf.org">
          <head>
              <meta charset="UTF-8">
              <title>Title</title>
          </head>
          <body>
          <p>嗨!歡迎關(guān)注我的博客:Lvshen的技術(shù)小屋:</p>
          <table border="1">
              <tr>
                  <td>姓名</td>
                  <td th:text="${username}"></td>
              </tr>
              <tr>
                  <td>性別</td>
                  <td th:text="${sex}"></td>
              </tr>
              <tr>
                  <td>愛好</td>
                  <td th:text="${hobby}"></td>
              </tr>
          </table>
          <div style="color: #ff1a0e">關(guān)注我獲取Java學習資料哦</div>
          </body>
          </html>
          

          編寫發(fā)送代碼

          測試結(jié)果如下

          如果你沒有開發(fā)過郵件發(fā)送或正在開發(fā)郵件發(fā)送的功能,希望這篇文章可以幫到你。

          、要使用JavaMailSender發(fā)送郵件,首先需要在pom.xml文件中引入spring-boot-starter-mail依賴:

          spring-boot-starter-mail依賴

          2、引入依賴包后需要在application.properties文件中配置屬性:

          屬性配置

          password為客戶端授權(quán)碼,而不是我們平常登錄郵箱的密碼,我這里使用的是163郵箱作為發(fā)送方(客戶端授權(quán)碼需要進入郵箱里面設(shè)置獲取,這里就不介紹了)。

          3、引入依賴包,寫好配置文件后,接下來就是寫業(yè)務代碼了,代碼很簡單,想要深究原理就得去閱讀源碼了,這里只介紹如何實現(xiàn),廢話不多說,業(yè)務代碼如下:(截圖無法顯示,只能貼代碼了)

          @Service

          public class MailService {

          private final Logger logger = LoggerFactory.getLogger(this.getClass());

          @Autowired

          private JavaMailSender sender;

          //發(fā)送者

          @Value("${spring.mail.username}")

          private String from;

          /**

          * 發(fā)送純文本的簡單郵件

          * @param sendTo 接收者

          * @param Subject 郵件主題

          * @param mailContent 郵件內(nèi)容

          * @return

          */

          public String sendSimpleMail(String sendTo, String Subject, String mailContent){

          //建立郵件消息

          SimpleMailMessage message = new SimpleMailMessage();

          message.setFrom(from);

          message.setTo(sendTo);

          message.setSubject(Subject);

          message.setText(mailContent);

          try {

          sender.send(message);

          logger.info("");

          } catch (Exception e) {

          logger.error("發(fā)送簡單郵件時發(fā)生異常!", e);

          }

          return "";

          }

          /**

          * 發(fā)送HTML格式郵件

          * @param sendTo

          * @param Subject

          * @param mailContent

          */

          public void sendHtmlMail(String sendTo, String Subject, String mailContent){

          MimeMessage message = sender.createMimeMessage();

          try {

          //true表示需要創(chuàng)建一個multipart message

          MimeMessageHelper helper = new MimeMessageHelper(message, true);

          helper.setFrom(from);

          helper.setTo(sendTo);

          helper.setSubject(Subject);

          //HTML格式郵件需先進行Base64加密,取數(shù)據(jù)時再解碼

          helper.setText(mailContent, true);

          sender.send(message);

          logger.info("HTML郵件已經(jīng)發(fā)送。");

          } catch (MessagingException e) {

          logger.error("發(fā)送HTML郵件時發(fā)生異常!", e);

          }

          }

          /**

          * 帶附件的郵件

          * @param sendTo

          * @param Subject

          * @param mailContent

          * @param filePath

          */

          public void sendAttachmentsMail(String sendTo, String Subject, String mailContent, String filePath){

          MimeMessage message = sender.createMimeMessage();

          try {

          //true表示需要創(chuàng)建一個multipart message

          MimeMessageHelper helper = new MimeMessageHelper(message, true);

          helper.setFrom(from);

          helper.setTo(sendTo);

          helper.setSubject(Subject);

          helper.setText(mailContent, true);

          FileSystemResource file = new FileSystemResource(new File(filePath));

          String fileName = filePath.substring(filePath.lastIndexOf(File.separator));

          helper.addAttachment(fileName, file);

          sender.send(message);

          logger.info("帶附件的郵件已經(jīng)發(fā)送。");

          } catch (MessagingException e) {

          logger.error("發(fā)送帶附件的郵件時發(fā)生異常!", e);

          }

          }

          /**

          * 發(fā)送帶圖片(靜態(tài)資源)的郵件

          * @param sendTo

          * @param Subject

          * @param mailContent 郵件內(nèi)容,需要包含一個靜態(tài)資源的id

          * @param rscPath 靜態(tài)資源路徑和文件名

          * @param rscId 靜態(tài)資源id

          */

          public void sendInlineResourceMail(String sendTo, String Subject, String mailContent, String rscPath, String rscId){

          MimeMessage message = sender.createMimeMessage();

          try {

          //true表示需要創(chuàng)建一個multipart message

          MimeMessageHelper helper = new MimeMessageHelper(message, true);

          helper.setFrom(from);

          helper.setTo(sendTo);

          helper.setSubject(Subject);

          helper.setText(mailContent, true);

          FileSystemResource res = new FileSystemResource(new File(rscPath));

          helper.addInline(rscId, res);

          sender.send(message);

          logger.info("帶圖片的郵件已經(jīng)發(fā)送。");

          } catch (MessagingException e) {

          logger.error("發(fā)送帶圖片的郵件時發(fā)生異常!", e);

          }

          }

          }

          4、寫完業(yè)務代碼就可以寫測試代碼進行測試了,我是寫了個controller進行調(diào)用,用Junit也可以,方式不限,測試代碼如下下

          @RestController

          @RequestMapping("/mail")

          public class MailController {

          @Autowired

          private MailService mailService;

          @RequestMapping("/sendmail")

          public String sendMail(){

          //接收者郵箱(隨意什么郵箱)

          String to = "123456@qq.com";

          return mailService.sendSimpleMail(to, "主題:測試發(fā)送郵件功能", "測試發(fā)送郵件功能");

          }

          }

          到了這里,在瀏覽器地址欄輸入127.0.0.1:8080/mail/sendmail并回車,郵件便可以發(fā)送成功了。


          主站蜘蛛池模板: 午夜精品一区二区三区免费视频| 日本一区二区三区免费高清在线 | 福利一区二区在线| 精品人妻码一区二区三区| 无码乱人伦一区二区亚洲| 丰满少妇内射一区| 国产日韩精品一区二区三区在线| 国产在线一区二区在线视频| 中文字幕一区二区三区免费视频 | 亚洲av福利无码无一区二区| 国产精品熟女一区二区| 久久国产精品亚洲一区二区| 亚洲午夜精品一区二区| 久久伊人精品一区二区三区 | 无码人妻一区二区三区免费n鬼沢 无码人妻一区二区三区免费看 | 秋霞午夜一区二区| 无码人妻AⅤ一区二区三区| 国产高清在线精品一区| 九九无码人妻一区二区三区 | 国产AV天堂无码一区二区三区| 白丝爆浆18禁一区二区三区| 国产成人精品a视频一区| 日韩AV无码一区二区三区不卡毛片| 最美女人体内射精一区二区| 在线播放一区二区| 国产精品久久无码一区二区三区网 | 国产另类TS人妖一区二区| 日韩免费无码一区二区三区| 美女视频一区三区网站在线观看| 国产精品久久亚洲一区二区 | 日产精品久久久一区二区| 中文字幕人妻AV一区二区| 福利国产微拍广场一区视频在线 | 人妻久久久一区二区三区| 亚洲熟妇AV一区二区三区宅男| 国产精品无码一区二区三区在| 国产精品污WWW一区二区三区| 国产AV午夜精品一区二区三区| 色噜噜狠狠一区二区| 成人一区二区免费视频| 国产精品一区二区久久精品涩爱|