1. 程式人生 > >Spring Boot學習(十四)之Spring boot中使用QQ郵箱傳送郵件

Spring Boot學習(十四)之Spring boot中使用QQ郵箱傳送郵件

相信使用過Spring的眾多開發者都知道Spring提供了非常好用的JavaMailSender介面實現郵件傳送。在Spring Boot的Starter模組中也為此提供了自動化配置。下面通過例項看看如何在Spring Boot中使用JavaMailSender傳送郵件。快速入門在Spring Boot的工程中的pom.xml中引入spring-boot-starter-mail依賴:
<?xml version="1.0" encoding="UTF-8"?>
<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>com.cicoding</groupId>
	<artifactId>cicoding-mail</artifactId>
	<version>1.0.0</version>
	<packaging>jar</packaging>

	<name>cicoding-mail</name>
	<description>Spring Boot project</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.3.2.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<java.version>1.8</java.version>
	</properties>

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

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

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

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

	</dependencies>
	
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>
如其他自動化配置模組一樣,在完成了依賴引入之後,只需要在application.properties中配置相應的屬性內容。下面我們以QQ郵箱為例,在application.properties中加入如下配置(注意替換自己的使用者名稱和密碼):一種模版配置;
spring.mail.host=smtp.qq.com
spring.mail.username=使用者名稱
spring.mail.password=這裡填郵箱的授權碼
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.host=smtp.qq.com
spring.mail.username=郵箱名
spring.mail.password=這裡填郵箱的授權碼
spring.mail.default-encoding=UTF-8
spring.mail.port=465
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.debug=true
  • 注意:
PO3/SMTP服務必須開啟

QQ郵箱傳送郵件伺服器主機名為:
smtp.qq.com,必須使用使用SSL(spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory),埠號465或587(spring.mail.port=465)通過單元測試來實現一封簡單郵件的傳送:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class ApplicationTests {

	@Autowired
	private JavaMailSender mailSender;
	@Autowired
	private VelocityEngine velocityEngine;
	@Test
	public void sendSimpleMail() throws Exception {

		SimpleMailMessage message = new SimpleMailMessage();
		message.setFrom("[email protected]");
		message.setTo("[email protected]");
		message.setSubject("主題:簡單郵件");
		message.setText("測試郵件內容");

		mailSender.send(message);
	}
}
好,我們到這裡,一個簡單的郵件傳送就完成了,執行一下該單元測試,看看效果如何?注:由於Spring Boot的starter模組提供了自動化配置,所以在引入了spring-boot-starter-mail依賴之後,會根據配置檔案中的內容去建立JavaMailSender例項,因此我們可以直接在需要使用的地方直接@Autowired來引入郵件傳送物件。進階使用在上例中,我們通過使用SimpleMailMessage實現了簡單的郵件傳送,但是實際使用過程中,我們還可能會帶上附件、或是使用郵件模組等。這個時候我們就需要使用MimeMessage來設定複雜一些的郵件內容,下面我們就來依次實現一下。傳送附件在上面單元測試中加入如下測試用例(通過MimeMessageHelper來發送一封帶有附件的郵件):
@Autowired
	private JavaMailSender mailSender;

	@Test
	public void sendAttachmentsMail() throws Exception {

		MimeMessage mimeMessage = mailSender.createMimeMessage();

		MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
		helper.setFrom("[email protected]");
		helper.setTo("[email protected]");
		helper.setSubject("主題:有附件");
		helper.setText("有附件的郵件");

		FileSystemResource file = new FileSystemResource(new File("weixin.jpg"));
		helper.addAttachment("附件-1.jpg", file);
		helper.addAttachment("附件-2.jpg", file);

		mailSender.send(mimeMessage);
	}
嵌入靜態資源除了傳送附件之外,我們在郵件內容中可能希望通過嵌入圖片等靜態資源,讓郵件獲得更好的閱讀體驗,而不是從附件中檢視具體圖片,下面的測試用例演示瞭如何通過MimeMessageHelper實現在郵件正文中嵌入靜態資源。
@Test
	public void sendInlineMail() throws Exception {

		MimeMessage mimeMessage = mailSender.createMimeMessage();

		MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
		helper.setFrom("[email protected]");
		helper.setTo("[email protected]m");
		helper.setSubject("主題:嵌入靜態資源");
		helper.setText("<html><body><img src=\"cid:weixin\" ></body></html>", true);

		FileSystemResource file = new FileSystemResource(new File("weixin.jpg"));
		helper.addInline("weixin", file);

		mailSender.send(mimeMessage);
	}
這裡需要注意的是addInline函式中資源名稱weixin需要與正文中cid:weixin對應起來模板郵件通常我們使用郵件傳送服務的時候,都會有一些固定的場景,比如重置密碼、註冊確認等,給每個使用者傳送的內容可能只有小部分是變化的。所以,很多時候我們會使用模板引擎來為各類郵件設定成模板,這樣我們只需要在傳送時去替換變化部分的引數即可。在Spring Boot中使用模板引擎來實現模板化的郵件傳送也是非常容易的,下面我們以velocity為例實現一下。引入velocity模組的依賴:(在pom檔案已經一如依賴)
@Test
	public void sendTemplateMail() throws Exception {

		MimeMessage mimeMessage = mailSender.createMimeMessage();

		MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
		helper.setFrom("[email protected]");
		helper.setTo("[email protected]");
		helper.setSubject("主題:模板郵件");

		Map<String, Object> model = new HashedMap();
		model.put("username", "cicoding");
		String text = VelocityEngineUtils.mergeTemplateIntoString(
				velocityEngine, "template.vm", "UTF-8", model);
		helper.setText(text, true);

		mailSender.send(mimeMessage);
	}
resources/templates/下,建立一個模板頁面template.vm<html><body> <h3>你好, ${username}, 這是一封模板郵件!</h3></body></html>嘗試執行一下,就可以收到內容為你好, cicoding, 這是一封模板郵件!的郵件。這裡,我們通過傳入username的引數,在郵件內容中替換了模板中的${username}變數。

相關推薦

Spring Boot學習()Spring boot使用QQ郵箱傳送郵件

相信使用過Spring的眾多開發者都知道Spring提供了非常好用的JavaMailSender介面實現郵件傳送。在Spring Boot的Starter模組中也為此提供了自動化配置。下面通過例項看看如

Spring Boot學習(二)Spring Boot使用@Async實現非同步呼叫

什麼是“非同步呼叫”?“非同步呼叫”對應的是“同步呼叫”,同步呼叫指程式按照定義順序依次執行,每一行程式都必須等待上一行程式執行完成之後才能執行;非同步呼叫指程式在順序執行時,不等待非同步呼叫的語句返回

spring boot 學習()SpringBoot+Redis+SpringSession緩存實戰

blog 安裝 user 個人 turn pid pass pin star SpringBoot + Redis +SpringSession 緩存之實戰 前言 前幾天,從師兄那兒了解到EhCache是進程內的緩存框架,雖然它已經提供了集群環境下的緩存同步策略,這種同步仍

RabbitMQ學習(一)spring整合傳送非同步訊息

實現使用Exchange型別為DirectExchange. routingkey的名稱預設為Queue的名稱。非同步傳送訊息。 1.配置檔案 [plain] view plain copy print? #============== rabbitmq co

Spring學習):WebSpring

Spring通常用來開發Web應用。 SpringMVC的執行過程: 我們可以從以下的圖來分析SpringMVC的的執行過程。 1、客戶端在傳送請求的時候,會呼叫DispatcherServlet,Dispatch是SpringMVC的入口,Dispatche

劍指offer鏈表倒數第k個結點

gif img https question pla last 代碼 鏈表 || 一、題目 輸入一個鏈表,輸出該鏈表中倒數第k個結點。 二、思路   兩個指針,先讓第一個指針和第二個指針都指向頭結點,然後再讓第一個指正走(k-1)步,到達第k個節點。然後兩個指針同

Spring Boot學習

自動配置 pat xml配置 XML 入口 spa ges auto classpath @SpringBootApplication 每一個Spring Boot項目都有一個名為*Application的入口類,入口類中有個main方法,在main方法中使用: Sprin

spring boot 學習(二)攔截器實現IP黑名單

ppi html .html 日期類 dpa asp tails 我們 req 攔截器實現IP黑名單 前言 最近一直在搞 Hexo+GithubPage 搭建個人博客,所以沒怎麽進行 SpringBoot 的學習。所以今天就將上次的”?秒防刷新”進行了一番修改。上次是采用註

spring boot 學習(一)使用@Async實現異步調用

fontsize south 操作 dom img water 截圖 ota app 使用@Async實現異步調用 什麽是”異步調用”與”同步調用” “同步調用”就是程序按照一定的順序依次執行,,每一行程序代碼必須等上一行代碼執行完畢才能執行;”異步調用”則是只要上一行代碼

Spring Boot)RabbitMQ延遲隊列

system ofo 註意 contex ride build isa config msg 一、前言 延遲隊列的使用場景:1.未按時支付的訂單,30分鐘過期之後取消訂單;2.給活躍度比較低的用戶間隔N天之後推送消息,提高活躍度;3.過1分鐘給新註冊會員的用戶,發送註冊郵件

Spring Boot)RabbitMQ延遲佇列

一、前言 延遲佇列的使用場景:1.未按時支付的訂單,30分鐘過期之後取消訂單;2.給活躍度比較低的使用者間隔N天之後推送訊息,提高活躍度;3.過1分鐘給新註冊會員的使用者,傳送註冊郵件等。 <!--more--> 實現延遲佇列的方式有兩種: 通過訊息過期後進入死信交換器,再由交換器轉

Spring Boot學習筆記()使用AOP整合log4j日誌

rsources下面建立log4j.properties 新增配置資訊 # LOG4J配置 log4j.rootCategory=INFO, stdout, file, errorfile //級別,控制檯,檔案,錯誤的日誌 log4j.category.c

Spring Boot學習):使用@SpringBootTest註解進行單元測試

一、簡介 專案中經常會遇到需要單元測試的情況,那麼SpringBoot如何實現這種需求,使用@SpringBootTest註解可以執行環境,測試後臺程式碼。 二、環境準備 eclipse + maven + Spring Boot 三、程式碼示例 pom.xml

spring boot 2.x 整合 jpa 進階

本文主要針對jpa常見的用法進行演示講解,主要包括JPA常見的查詢、分頁查詢、HQL操作、SQL操作等幾個方面。 1、JPA支援的常用的查詢 /** * And查詢 等價於SQL中的and<br> */ List<

Spring Boot 構建企業級部落格學習)- Spting Boot 整合Thymeleaf模板

Spting Boot 整合Thymeleaf模板  理解Thymeleaf的概念、用法 Thymeleaf 與 Spring Boot 整合 Thymeleaf 實戰 Thymeleaf概念 理解Thymeleaf Thymeleaf是一種

從.Net到Java學習篇——spring boot+redis

“學習java已經十天,有時也懷念當初.net的經典,讓這語言將你我相連,懷念你......”接上一篇,本篇使用到的框架redis、FastJSON。 環境準備 安裝redis,下圖是我本機的redis綠色版,你可以網上自行下載安裝,如果不知道如何怎麼操作,可以移步到我的另一篇文章:ASP.NET R

SpringCloud SpringBoot mybatis 分散式微服務(Spring Boot整合MyBatis

Spring中整合MyBatis就不多說了,最近大量使用Spring Boot,因此整理一下Spring Boot中整合MyBatis的步驟。搜了一下Spring Boot整合MyBatis的文章,方法都比較老,比較繁瑣。查了一下文件,實際已經支援較為簡單的整合與使用。下面就

Spring Boot 學習)自定義 Banner

SpringBoot應用程式啟動過程中,都會預設在控制檯輸出上圖所顯示的內容,即是我們本篇文章所說的Banner。 當然,SpringBoot 提供了預設的Banner之外,也提供了自定義設定Banner的功能。 1、自定義Banner內容 自定義Banner很簡單

篇: Spring Boot使用校驗框架validation校驗

Spring Boot在內部通過整合hibernate-validation已經實現了JSR-349驗證規範介面,在Spring Boot專案中只要直接使用就行了。一般用在Controller中用於驗證前端傳來的引數。驗證分兩種:對封裝的Bean進行驗證  或者  對方法簡單

Spring Boot教程:基於自定義註解的AOP資料來源自動切換

上一篇文章講到了多資料來源的配置和手動切換,手動切換費時費力,下面我們改進一下,改成基於註解的AOP資料來源自動切換。 基礎知識不在贅述,直接上程式碼: public class DataSourceContextHolder { private static