整合營銷服務(wù)商

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

          免費咨詢熱線:

          22、springboot集成freemarker

          22、springboot集成freemarker

          pringboot 中自帶的頁面渲染工具為thymeleaf ,freemarker這種模板引擎用的也比較多。

          一、在spring中springMVC代表著view層組件

          二、為什么使用freemarker:簡單容易學(xué)、邏輯分明

          三、freemarker優(yōu)點:不依賴servlet、網(wǎng)絡(luò)或者web環(huán)境

          1、新建maven項目,對應(yīng)的pom.xml文件如下

          <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

          <modelVersion>4.0.0</modelVersion>

          <groupId>spring-cloud</groupId>

          <artifactId>sc-freemarker</artifactId>

          <version>0.0.1-SNAPSHOT</version>

          <packaging>jar</packaging>

          <name>sc-freemarker</name>

          <url>http://maven.apache.org</url>

          <parent>

          <groupId>org.springframework.boot</groupId>

          <artifactId>spring-boot-starter-parent</artifactId>

          <version>2.0.4.RELEASE</version>

          </parent>

          <dependencyManagement>

          <dependencies>

          <dependency>

          <groupId>org.springframework.cloud</groupId>

          <artifactId>spring-cloud-dependencies</artifactId>

          <version>Finchley.RELEASE</version>

          <type>pom</type>

          <scope>import</scope>

          </dependency>

          </dependencies>

          </dependencyManagement>

          <dependencies>

          <dependency>

          <groupId>org.springframework.boot</groupId>

          <artifactId>spring-boot-starter-web</artifactId>

          </dependency>

          <dependency>

          <groupId>org.springframework.boot</groupId>

          <artifactId>spring-boot-starter-freemarker</artifactId>

          </dependency>

          </dependencies>

          </project>

          2、新建配置文件application.yml

          server:

          port: 8081

          spring:

          application:

          name: sc-freemarker

          freemarker:

          allow-request-override: false

          cache: true

          check-template-location: true

          charset: UTF-8

          content-type: text/html

          expose-request-attributes: false

          expose-session-attributes: false

          suffix: .ftl

          templateEncoding: UTF-8

          templateLoaderPath: classpath:/templates/

          expose-spring-macro-helpers: false

          備注:freemarker有哪些配置項可以參考類

          org.springframework.boot.autoconfigure.freemarker.FreeMarkerProperties

          3、新建一個controller

          package sc.freemarker.controller;

          import java.util.ArrayList;

          import java.util.List;

          import org.springframework.stereotype.Controller;

          import org.springframework.ui.Model;

          import org.springframework.web.bind.annotation.RequestMapping;

          import sc.freemarker.model.User;

          @Controller

          public class FreemarkerController {

          @RequestMapping("/getUser")

          public String getUser(Integer id, Model model){

          User u=new User();

          u.setId(1);

          u.setAge(13);

          u.setSex(1);

          u.setUserName("黃金");

          User l=new User();

          l.setId(1);

          l.setAge(23);

          l.setSex(0);

          l.setUserName("白銀");

          List<User> friends=new ArrayList<User>();

          friends.add(l);

          u.setFriends(friends);

          model.addAttribute("user",u);

          return "getUser";

          }

          }

          備注:注意最外層的控制層注解只能用@Controller

          4、新建模板文件getUser.ftl

          <!DOCTYPE html>

          <html xmlns="http://www.w3.org/1999/xhtml"

          xmlns:th="http://www.thymeleaf.org"

          xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">

          <head>

          <title>Hello World!</title>

          </head>

          <body>

          <center>

          <p>welcome ${user.userName} to freemarker!</p>

          <p>

          年齡: ${user.age}</br>

          性別:

          <#if user.sex==0> 女 <#elseif user.sex==1> 男 <#else> 保密

          </#if>

          </p>

          <h4>我的好友:</h4>

          <#list user.friends as f> 姓名:${f.userName} , 年齡${f.age} <br>

          </#list>

          </center>

          </body>

          </html>

          5、其他項目文件如下圖

          6、運行FreemarkerApplication.java類,啟動項目;并檢查啟動信息,確認freemarker配置是否生效

          7、訪問頁面http://127.0.0.1:8081/getUser

          然目前市場上多數(shù)的開發(fā)模式采用前后端分離的技術(shù),視圖層的技術(shù)在小一些的項目中還是非常有用的,所以一直也占有一席之地,如spring官方的spring.io等網(wǎng)站就是使用視圖層技術(shù)實現(xiàn)的。

          目前Spring Boot支持的較好的兩個視圖層模板引擎是Thymeleaf和FreeMarker,其中Thymeleaf是默認的模板引擎。

          一、整合Thymeleaf

          Thymeleaf支持HTML原型,可以直接在瀏覽器中查看頁面樣式,這對于調(diào)試是非常方便的,SpringBoot工程整合Thymeleaf只需要幾個簡單的步驟:

          1、添加依賴

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

          2、配置Thymeleaf

          Springboot中Thymeleaf默認的配置類為:ThymeleafAutoConfiguration,默認的模板以html格式存在于classpath:/templates目錄下,如果要改變這些配置,可以在application.properties中修改,所有的配置以spring.thymeleaf為前綴:

          #是否啟用thymeleaf,默認true
          spring.thymeleaf.enabled=true
          #是否開啟緩存,默認true
          spring.thymeleaf.cache=true
          #檢查模板是否存在,默認為true
          spring.thymeleaf.check-template=true
          #檢查模板位置是否存在,默認為true
          spring.thymeleaf.check-template-location=true
          #開啟EL編譯器,默認為true
          spring.thymeleaf.enable-spring-el-compiler=true
          #配置模版的位置
          spring.thymeleaf.prefix=classpath:/templates/
          #配置模板的編碼
          spring.thymeleaf.encoding=UTF-8
          #配置模版支持的類型,默認為HTML
          spring.thymeleaf.mode=HTML
          #配置模板文件的后綴,默認為.html
          spring.thymeleaf.suffix=.html
          #配置content-type
          spring.thymeleaf.servlet.content-type=text/html

          3、配置ModelAndView

          編寫controller,返回一個ModelAndView,返回到頁面上渲染的數(shù)據(jù)存儲在ModelAndView中。

          @Controller
          @RequestMapping("/thymeleaf")
          public class ThymeleafController {
          
              private class Student{
                  private String name;
          
                  private int age;
          
                  public String getName() {
                      return name;
                  }
          
                  public void setName(String name) {
                      this.name=name;
                  }
          
                  public int getAge() {
                      return age;
                  }
          
                  public void setAge(int age) {
                      this.age=age;
                  }
              }
          
              @GetMapping("/students")
              public ModelAndView students(){
                  List<Student> students=new ArrayList<>();
                  Student student1=new Student();
                  student1.setName("Li Lei");
                  student1.setAge(18);
          
                  Student student2=new Student();
                  student2.setName("Han Meimei");
                  student2.setAge(17);
                  students.add(student1);
                  students.add(student2);
                  ModelAndView modelAndView=new ModelAndView();
                  modelAndView.addObject("students",students);
                  modelAndView.setViewName("test");
                  return modelAndView;
          
              }
          }

          4、編寫template

          在resources目錄下創(chuàng)建templates文件,創(chuàng)建test.html,對應(yīng)上面代碼的viewName,填入以下內(nèi)容:

          <!DOCTYPE html>
          <html lang="en" xmlns:th="http://www.thymeleaf.org">
          <head>
              <meta charset="UTF-8">
              <title>Thymeleaf Testing</title>
          </head>
          <style>
              tr,td,th {border: 2px solid #ff4c6b;width: 200px;}
          </style>
          <body style="text-align:center;">
          <table style="margin:200px auto;border: 2px solid #ff4c6b;">
              <tr>
                  <td>姓名</td>
                  <td>年齡</td>
              </tr>
          
              <tr th:each="student:${students}">
              <td th:text="${student.name}"></td>
                  <td th:text="${student.age}"></td>
              </tr>
          </table>
          </body>
          </html>

          訪問localhost:8080/thymeleaf/students得到以下頁面:

          二、整合FreeMarker

          整合FreeMarker于Thymeleaf非常相似,springboot提供了一致的整合方案,所以你只需要將以上的步驟做一下修改:

          1、添加依賴

          將Thymeleaf依賴替換成FreeMarker依賴

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

          2、修改模板

          將原來建立的html模板改成.ftl模板,其余不變。

          • 1. 什么是 SMTP
          • 2. SMTP Port
            • 2.1 25
            • 2.2 587
            • 2.3 465
            • 2.4 小結(jié)
          • 3. 號外
            • 3.1 郵件基礎(chǔ)
            • 3.2 準(zhǔn)備工作
            • 3.3 項目創(chuàng)建

          Spring Boot 發(fā)送郵件,松哥之前專門寫過文章,這里就不啰嗦了。還不懂 Spring Boot 如何發(fā)送郵件的小伙伴,翻到本文后半部分,有介紹。

          今天想和大家聊一下 SMTP 服務(wù)器的端口問題,這個也是一個小伙伴提的問題,SMTP 服務(wù)器有眾多端口:25、465、587 各自間有什么區(qū)別?可以隨意使用嗎?希望今天這篇文章能給你答案。

          1. 什么是 SMTP

          SMTP 代表簡單郵件傳輸協(xié)議,簡而言之,它是通過 Internet 發(fā)送電子郵件的過程。計算機端口是個人計算機連接到網(wǎng)絡(luò)并完成數(shù)據(jù)傳輸?shù)姆绞健MTP 端口是兩者的組合:設(shè)計用于通過網(wǎng)絡(luò)向其收件人發(fā)送電子郵件的端口。

          下圖展示了 SMTP 協(xié)議在郵件發(fā)送過程的作用:

          當(dāng)然,就像有多個計算機端口一樣,可以使用的 SMTP 端口也有很多。

          2. SMTP Port

          2.1 25

          1982 年,南加州大學(xué)向 Internet 工程任務(wù)組 (IETF) 提交了一份提案,即 Request For Comments (RFC) 821,將端口 25 建立為 Internet 電子郵件的默認傳輸通道。40 年過去了,如今我們依然可以使用 25 這個端口在兩個郵件服務(wù)器之間傳輸郵件。

          不過最初的設(shè)計沒有考慮安全問題,在 1998 年 12 月,R. Gellens 和 J. Klensin 提交了 RFC2476,在這個規(guī)范中,RFC 提議將傳統(tǒng)的消息提交和消息中繼概念分開,RFC 定義消息提交應(yīng)通過端口 587 進行(即我們通過郵件客戶端等工具提交郵件的時候,應(yīng)該使用 587 端口),以確保新的策略和安全要求不會干擾消息中繼端口 25 上的傳統(tǒng)中繼流量。

          這么一拆分,端口 25 就主要用于 SMTP 中繼,也就是將郵件從一個電子郵件服務(wù)器傳輸?shù)搅硪粋€電子郵件服務(wù)器。

          在大多數(shù)情況下,SMTP 電子郵件客戶端(Foxmail、Microsoft Outlook、Mail、Thunderbird 等)不應(yīng)使用 25 端口,以遏制垃圾郵件的數(shù)量,所以這個 25 端口和我們個人使用的關(guān)系就不大。

          2.2 587

          這是默認的郵件提交端口,當(dāng)用戶提交一封電子郵件到郵件服務(wù)器時,可以使用該端口,我們自己通過 Java 代碼發(fā)送郵件,也可以使用該端口。

          端口 587 與 TLS 加密相結(jié)合,可確保安全提交電子郵件并遵循 IETF 制定的指導(dǎo)方針。

          2.3 465

          那按理說我們發(fā)送郵件的時候就該使用 587 端口呀,465 又是干嘛的?

          IETF 從未將端口 465 發(fā)布為官方 SMTP 傳輸或提交端口,然而維護大部分核心互聯(lián)網(wǎng)基礎(chǔ)設(shè)施的 IANA 為 SMTPS 分配了端口 465。目的是為 SMTP 建立一個端口,以便使用安全套接字層 (SSL) 進行操作,這樣使得郵件發(fā)送更加安全。

          所以 465 和 587 其實都是為了郵件安全,但是兩者的思路不一樣,465 是 SSL,587 則是 TLS,SSL 和 TLS 有啥區(qū)別呢?這個就說來話長了,簡單一句話就是:TLS(傳輸層安全)是更為安全的升級版 SSL,TLS 是 SSL 標(biāo)準(zhǔn)化后的產(chǎn)物。

          按理說 465 應(yīng)該被撤銷,大家都用 587,但是由于 465 曾經(jīng)被 IANA 認定為有效,因此可能存在僅能夠使用此端口連接的遺留系統(tǒng),所以該端口并沒有被廢棄,也可以使用。

          2.4 小結(jié)

          好啦,這就是這幾個端口的區(qū)別。一般來說,我們用 Spring Boot 發(fā)送郵件的時候,465 和 587 都能用,但是不建議使用 25。另外在使用 465 或者 587 的時候,有的個別郵箱如 139 郵箱需要配置如下屬性:

          spring.mail.properties.mail.smtp.ssl.enable=true
          

          3. 號外

          可能還有小伙伴不懂 Spring Boot 郵件發(fā)送,再來回顧下。

          郵件發(fā)送其實是一個非常常見的需求,用戶注冊,找回密碼等地方,都會用到,使用 JavaSE 代碼發(fā)送郵件,步驟還是挺繁瑣的,Spring Boot 中對于郵件發(fā)送,提供了相關(guān)的自動化配置類,使得郵件發(fā)送變得非常容易,接下來我們就來一探究竟!看看使用 Spring Boot 發(fā)送郵件的 5 中姿勢。

          3.1 郵件基礎(chǔ)

          我們經(jīng)常會聽到各種各樣的郵件協(xié)議,比如 SMTP、POP3、IMAP ,那么這些協(xié)議有什么作用,有什么區(qū)別?我們先來討論一下這個問題。

          SMTP 是一個基于 TCP/IP 的應(yīng)用層協(xié)議,江湖地位有點類似于 HTTP,SMTP 服務(wù)器默認監(jiān)聽的端口號為 25 。看到這里,小伙伴們可能會想到既然 SMTP 協(xié)議是基于 TCP/IP 的應(yīng)用層協(xié)議,那么我是不是也可以通過 Socket 發(fā)送一封郵件呢?回答是肯定的。

          生活中我們投遞一封郵件要經(jīng)過如下幾個步驟:

          1. 深圳的小王先將郵件投遞到深圳的郵局
          2. 深圳的郵局將郵件運送到上海的郵局
          3. 上海的小張來郵局取郵件

          這是一個縮減版的生活中郵件發(fā)送過程。這三個步驟可以分別對應(yīng)我們的郵件發(fā)送過程,假設(shè)從 aaa@qq.com 發(fā)送郵件到 111@163.com :

          1. aaa@qq.com 先將郵件投遞到騰訊的郵件服務(wù)器
          2. 騰訊的郵件服務(wù)器將我們的郵件投遞到網(wǎng)易的郵件服務(wù)器
          3. 111@163.com 登錄網(wǎng)易的郵件服務(wù)器查看郵件

          郵件投遞大致就是這個過程,這個過程就涉及到了多個協(xié)議,我們來分別看一下。

          SMTP 協(xié)議全稱為 Simple Mail Transfer Protocol,譯作簡單郵件傳輸協(xié)議,它定義了郵件客戶端軟件與 SMTP 服務(wù)器之間,以及 SMTP 服務(wù)器與 SMTP 服務(wù)器之間的通信規(guī)則。

          也就是說 aaa@qq.com 用戶先將郵件投遞到騰訊的 SMTP 服務(wù)器這個過程就使用了 SMTP 協(xié)議,然后騰訊的 SMTP 服務(wù)器將郵件投遞到網(wǎng)易的 SMTP 服務(wù)器這個過程也依然使用了 SMTP 協(xié)議,SMTP 服務(wù)器就是用來收郵件。

          而 POP3 協(xié)議全稱為 Post Office Protocol ,譯作郵局協(xié)議,它定義了郵件客戶端與 POP3 服務(wù)器之間的通信規(guī)則,那么該協(xié)議在什么場景下會用到呢?當(dāng)郵件到達網(wǎng)易的 SMTP 服務(wù)器之后, 111@163.com 用戶需要登錄服務(wù)器查看郵件,這個時候就該協(xié)議就用上了:郵件服務(wù)商都會為每一個用戶提供專門的郵件存儲空間,SMTP 服務(wù)器收到郵件之后,就將郵件保存到相應(yīng)用戶的郵件存儲空間中,如果用戶要讀取郵件,就需要通過郵件服務(wù)商的 POP3 郵件服務(wù)器來完成。

          最后,可能也有小伙伴們聽說過 IMAP 協(xié)議,這個協(xié)議是對 POP3 協(xié)議的擴展,功能更強,作用類似,這里不再贅述。

          3.2 準(zhǔn)備工作

          目前國內(nèi)大部分的郵件服務(wù)商都不允許直接使用用戶名/密碼的方式來在代碼中發(fā)送郵件,都是要先申請授權(quán)碼,這里以 QQ 郵箱為例,向大家演示授權(quán)碼的申請流程:首先我們需要先登錄 QQ 郵箱網(wǎng)頁版,點擊上方的設(shè)置按鈕:

          然后點擊賬戶選項卡:

          在賬戶選項卡中找到開啟POP3/SMTP選項,如下:

          點擊開啟,開啟相關(guān)功能,開啟過程需要手機號碼驗證,按照步驟操作即可,不贅述。開啟成功之后,即可獲取一個授權(quán)碼,將該號碼保存好,一會使用。

          3.3 項目創(chuàng)建

          接下來,我們就可以創(chuàng)建項目了,Spring Boot 中,對于郵件發(fā)送提供了自動配置類,開發(fā)者只需要加入相關(guān)依賴,然后配置一下郵箱的基本信息,就可以發(fā)送郵件了。

          • 首先創(chuàng)建一個 Spring Boot 項目,引入郵件發(fā)送依賴:

          創(chuàng)建完成后,項目依賴如下:

          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-mail</artifactId>
          </dependency>
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
          
          • 配置郵箱基本信息

          項目創(chuàng)建成功后,接下來在 application.properties 中配置郵箱的基本信息:

          spring.mail.host=smtp.qq.com
          spring.mail.port=587
          spring.mail.username=1510161612@qq.com
          spring.mail.password=ubknfzhjkhrbbabe
          spring.mail.default-encoding=UTF-8
          spring.mail.properties.mail.smtp.socketFactoryClass=javax.net.ssl.SSLSocketFactory
          spring.mail.properties.mail.debug=true
          

          配置含義分別如下:

          • 配置 SMTP 服務(wù)器地址
          • SMTP 服務(wù)器的端口
          • 配置郵箱用戶名
          • 配置密碼,注意,不是真正的密碼,而是剛剛申請到的授權(quán)碼
          • 默認的郵件編碼
          • 配飾 SSL 加密工廠
          • 表示開啟 DEBUG 模式,這樣,郵件發(fā)送過程的日志會在控制臺打印出來,方便排查錯誤

          如果不知道 smtp 服務(wù)器的端口或者地址的的話,可以參考 騰訊的郵箱文檔

          • https://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=371

          做完這些之后,Spring Boot 就會自動幫我們配置好郵件發(fā)送類,相關(guān)的配置在 org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration 類中,部分源碼如下:

          @Configuration
          @ConditionalOnClass({ MimeMessage.class, MimeType.class, MailSender.class })
          @ConditionalOnMissingBean(MailSender.class)
          @Conditional(MailSenderCondition.class)
          @EnableConfigurationProperties(MailProperties.class)
          @Import({ MailSenderJndiConfiguration.class, MailSenderPropertiesConfiguration.class })
          public class MailSenderAutoConfiguration {
          }
          

          從這段代碼中,可以看到,導(dǎo)入了另外一個配置 MailSenderPropertiesConfiguration 類,這個類中,提供了郵件發(fā)送相關(guān)的工具類:

          @Configuration
          @ConditionalOnProperty(prefix="spring.mail", name="host")
          class MailSenderPropertiesConfiguration {
                  private final MailProperties properties;
                  MailSenderPropertiesConfiguration(MailProperties properties) {
                          this.properties=properties;
                  }
                  @Bean
                  @ConditionalOnMissingBean
                  public JavaMailSenderImpl mailSender() {
                          JavaMailSenderImpl sender=new JavaMailSenderImpl();
                          applyProperties(sender);
                          return sender;
                  }
          }
          

          可以看到,這里創(chuàng)建了一個 JavaMailSenderImpl 的實例, JavaMailSenderImplJavaMailSender 的一個實現(xiàn),我們將使用 JavaMailSenderImpl 來完成郵件的發(fā)送工作。

          做完如上兩步,郵件發(fā)送的準(zhǔn)備工作就算是完成了,接下來就可以直接發(fā)送郵件了。

          具體的發(fā)送,有 5 種不同的方式,我們一個一個來看。

          3.3.1 發(fā)送簡單郵件

          簡單郵件就是指郵件內(nèi)容是一個普通的文本文檔:

          @Autowired
          JavaMailSender javaMailSender;
          @Test
          public void sendSimpleMail() {
              SimpleMailMessage message=new SimpleMailMessage();
              message.setSubject("這是一封測試郵件");
              message.setFrom("1510161612@qq.com");
              message.setTo("25xxxxx755@qq.com");
              message.setCc("37xxxxx37@qq.com");
              message.setBcc("14xxxxx098@qq.com");
              message.setSentDate(new Date());
              message.setText("這是測試郵件的正文");
              javaMailSender.send(message);
          }
          

          從上往下,代碼含義分別如下:

          1. 構(gòu)建一個郵件對象
          2. 設(shè)置郵件主題
          3. 設(shè)置郵件發(fā)送者
          4. 設(shè)置郵件接收者,可以有多個接收者
          5. 設(shè)置郵件抄送人,可以有多個抄送人
          6. 設(shè)置隱秘抄送人,可以有多個
          7. 設(shè)置郵件發(fā)送日期
          8. 設(shè)置郵件的正文
          9. 發(fā)送郵件

          最后執(zhí)行該方法,就可以實現(xiàn)郵件的發(fā)送,發(fā)送效果圖如下:

          3.3.2 發(fā)送帶附件的郵件

          郵件的附件可以是圖片,也可以是普通文件,都是支持的。

          @Test
          public void sendAttachFileMail() throws MessagingException {
              MimeMessage mimeMessage=javaMailSender.createMimeMessage();
              MimeMessageHelper helper=new MimeMessageHelper(mimeMessage,true);
              helper.setSubject("這是一封測試郵件");
              helper.setFrom("1510161612@qq.com");
              helper.setTo("25xxxxx755@qq.com");
              helper.setCc("37xxxxx37@qq.com");
              helper.setBcc("14xxxxx098@qq.com");
              helper.setSentDate(new Date());
              helper.setText("這是測試郵件的正文");
              helper.addAttachment("javaboy.jpg",new File("C:\\Users\\sang\\Downloads\\javaboy.png"));
              javaMailSender.send(mimeMessage);
          }
          

          注意這里在構(gòu)建郵件對象上和前文有所差異,這里是通過 javaMailSender 來獲取一個復(fù)雜郵件對象,然后再利用 MimeMessageHelper 對郵件進行配置,MimeMessageHelper 是一個郵件配置的輔助工具類,創(chuàng)建時候的 true 表示構(gòu)建一個 multipart message 類型的郵件,有了 MimeMessageHelper 之后,我們針對郵件的配置都是由 MimeMessageHelper 來代勞。

          最后通過 addAttachment 方法來添加一個附件。

          執(zhí)行該方法,郵件發(fā)送效果圖如下:

          3.3.3 發(fā)送帶圖片資源的郵件

          圖片資源和附件有什么區(qū)別呢?圖片資源是放在郵件正文中的,即一打開郵件,就能看到圖片。但是一般來說,不建議使用這種方式,一些公司會對郵件內(nèi)容的大小有限制(因為這種方式是將圖片一起發(fā)送的)。

          @Test
          public void sendImgResMail() throws MessagingException {
              MimeMessage mimeMessage=javaMailSender.createMimeMessage();
              MimeMessageHelper helper=new MimeMessageHelper(mimeMessage, true);
              helper.setSubject("這是一封測試郵件");
              helper.setFrom("1510161612@qq.com");
              helper.setTo("25xxxxx755@qq.com");
              helper.setCc("37xxxxx37@qq.com");
              helper.setBcc("14xxxxx098@qq.com");
              helper.setSentDate(new Date());
              helper.setText("<p>hello 大家好,這是一封測試郵件,這封郵件包含兩種圖片,分別如下</p><p>第一張圖片:</p><img src='cid:p01'/><p>第二張圖片:</p><img src='cid:p02'/>",true);
              helper.addInline("p01",new FileSystemResource(new File("C:\\Users\\sang\\Downloads\\javaboy.png")));
              helper.addInline("p02",new FileSystemResource(new File("C:\\Users\\sang\\Downloads\\javaboy2.png")));
              javaMailSender.send(mimeMessage);
          }
          

          這里的郵件 text 是一個 HTML 文本,里邊涉及到的圖片資源先用一個占位符占著,setText 方法的第二個參數(shù) true 表示第一個參數(shù)是一個 HTML 文本。

          setText 之后,再通過 addInline 方法來添加圖片資源。

          最后執(zhí)行該方法,發(fā)送郵件,效果如下:

          在公司實際開發(fā)中,第一種和第三種都不是使用最多的郵件發(fā)送方案。因為正常來說,郵件的內(nèi)容都是比較的豐富的,所以大部分郵件都是通過 HTML 來呈現(xiàn)的,如果直接拼接 HTML 字符串,這樣以后不好維護,為了解決這個問題,一般郵件發(fā)送,都會有相應(yīng)的郵件模板。最具代表性的兩個模板就是 Freemarker 模板和 Thyemeleaf 模板了。

          3.3.4 使用 Freemarker 作郵件模板

          首先需要引入 Freemarker 依賴:

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

          然后在 resources/templates 目錄下創(chuàng)建一個 mail.ftl 作為郵件發(fā)送模板:

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>Title</title>
          </head>
          <body>
          <p>hello 歡迎加入 xxx 大家庭,您的入職信息如下:</p>
          <table border="1">
              <tr>
                  <td>姓名</td>
                  <td>${username}</td>
              </tr>
              <tr>
                  <td>工號</td>
                  <td>${num}</td>
              </tr>
              <tr>
                  <td>薪水</td>
                  <td>${salary}</td>
              </tr>
          </table>
          <div style="color: #ff1a0e">一起努力創(chuàng)造輝煌</div>
          </body>
          </html>
          

          接下來,將郵件模板渲染成 HTML ,然后發(fā)送即可。

          @Test
          public void sendFreemarkerMail() throws MessagingException, IOException, TemplateException {
              MimeMessage mimeMessage=javaMailSender.createMimeMessage();
              MimeMessageHelper helper=new MimeMessageHelper(mimeMessage, true);
              helper.setSubject("這是一封測試郵件");
              helper.setFrom("1510161612@qq.com");
              helper.setTo("25xxxxx755@qq.com");
              helper.setCc("37xxxxx37@qq.com");
              helper.setBcc("14xxxxx098@qq.com");
              helper.setSentDate(new Date());
              //構(gòu)建 Freemarker 的基本配置
              Configuration configuration=new Configuration(Configuration.VERSION_2_3_0);
              // 配置模板位置
              ClassLoader loader=MailApplication.class.getClassLoader();
              configuration.setClassLoaderForTemplateLoading(loader, "templates");
              //加載模板
              Template template=configuration.getTemplate("mail.ftl");
              User user=new User();
              user.setUsername("javaboy");
              user.setNum(1);
              user.setSalary((double) 99999);
              StringWriter out=new StringWriter();
              //模板渲染,渲染的結(jié)果將被保存到 out 中 ,將out 中的 html 字符串發(fā)送即可
              template.process(user, out);
              helper.setText(out.toString(),true);
              javaMailSender.send(mimeMessage);
          }
          

          需要注意的是,雖然引入了 Freemarker 的自動化配置,但是我們在這里是直接 new Configuration 來重新配置 Freemarker 的,所以 Freemarker 默認的配置這里不生效,因此,在填寫模板位置時,值為 templates

          調(diào)用該方法,發(fā)送郵件,效果圖如下:

          3.3.5 使用 Thymeleaf 作郵件模板

          推薦在 Spring Boot 中使用 Thymeleaf 來構(gòu)建郵件模板。因為 Thymeleaf 的自動化配置提供了一個 TemplateEngine,通過 TemplateEngine 可以方便的將 Thymeleaf 模板渲染為 HTML ,同時,Thymeleaf 的自動化配置在這里是繼續(xù)有效的 。

          首先,引入 Thymeleaf 依賴:

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

          然后,創(chuàng)建 Thymeleaf 郵件模板:

          <!DOCTYPE html>
          <html lang="en" xmlns:th="http://www.thymeleaf.org">
          <head>
              <meta charset="UTF-8">
              <title>Title</title>
          </head>
          <body>
          <p>hello 歡迎加入 xxx 大家庭,您的入職信息如下:</p>
          <table border="1">
              <tr>
                  <td>姓名</td>
                  <td th:text="${username}"></td>
              </tr>
              <tr>
                  <td>工號</td>
                  <td th:text="${num}"></td>
              </tr>
              <tr>
                  <td>薪水</td>
                  <td th:text="${salary}"></td>
              </tr>
          </table>
          <div style="color: #ff1a0e">一起努力創(chuàng)造輝煌</div>
          </body>
          </html>
          

          接下來發(fā)送郵件:

          @Autowired
          TemplateEngine templateEngine;
          
          @Test
          public void sendThymeleafMail() throws MessagingException {
              MimeMessage mimeMessage=javaMailSender.createMimeMessage();
              MimeMessageHelper helper=new MimeMessageHelper(mimeMessage, true);
              helper.setSubject("這是一封測試郵件");
              helper.setFrom("1510161612@qq.com");
              helper.setTo("25xxxxx755@qq.com");
              helper.setCc("37xxxxx37@qq.com");
              helper.setBcc("14xxxxx098@qq.com");
              helper.setSentDate(new Date());
              Context context=new Context();
              context.setVariable("username", "javaboy");
              context.setVariable("num","000001");
              context.setVariable("salary", "99999");
              String process=templateEngine.process("mail.html", context);
              helper.setText(process,true);
              javaMailSender.send(mimeMessage);
          }
          

          調(diào)用該方法,發(fā)送郵件,效果圖如下:

          好了,這就是我們今天說的 5 種郵件發(fā)送姿勢,不知道你掌握了沒有呢?

          本文案例已經(jīng)上傳到 GitHub:https://github.com/lenve/javaboy-code-samples。

          有問題歡迎留言討論。

          參考資料:

          • https://www.mailgun.com/blog/which-smtp-port-understanding-ports-25-465-587

          主站蜘蛛池模板: 无码乱人伦一区二区亚洲一| 亚洲美女视频一区二区三区| 天码av无码一区二区三区四区| 国模无码一区二区三区| 精品欧美一区二区在线观看| 国产成人一区在线不卡| 色窝窝无码一区二区三区| 熟女少妇丰满一区二区| 久久精品国产一区二区三区不卡| 麻豆果冻传媒2021精品传媒一区下载| 麻豆视频一区二区三区| 久久se精品一区二区| 欧洲精品码一区二区三区| 变态拳头交视频一区二区 | 国产小仙女视频一区二区三区| 伊人久久一区二区三区无码 | 日韩在线一区视频| 一区二区三区在线免费| 国产精品99精品一区二区三区| 国产一区二区不卡在线播放| 久久er99热精品一区二区 | 一区二区三区视频观看| 亚洲国产日韩在线一区| 日韩人妻精品无码一区二区三区| 亚洲AV成人精品日韩一区| 亚洲av成人一区二区三区 | 亚洲av无码一区二区三区在线播放| 国产激情一区二区三区四区| 无码毛片视频一区二区本码 | 色噜噜狠狠一区二区三区| 日本人的色道www免费一区| 日本不卡一区二区三区| 亚洲第一区香蕉_国产a| 末成年女AV片一区二区| 中文字幕一区二区三区在线观看| 亚洲一区二区三区国产精品无码| 亚洲国产精品成人一区| 国产一区二区在线观看麻豆| 亚洲欧洲无码一区二区三区| 日本精品3d动漫一区二区| 国产在线aaa片一区二区99 |