用過Spring 開發者對JavaMailSender應該不陌生,它是Spring 提供郵件發送的接口。在Spring Boot中對這塊應用也進行了自動化的封裝。下面我們就來實際操作一下如何在Spring Boot項目中使用JavaMailSender進行郵件的發送操作。
首先我們需要創建一個Maven項目并且引入Spring Boot的基本依賴,然后再引入郵件發送相關的場景啟動器,代碼如下。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
第二步,在引入了自動配置場景啟動類之后,剩余的配置與之前的其他配置一樣,需要在application.yml 或者是application.properties中進行配置。下面我們演示利用QQ郵箱郵件發送效果。
spring:
#郵箱基本配置
mail:
#配置smtp服務主機地址
host: smtp.qq.com
#發送者郵箱
username: xxxxxxx@qq.com
#配置密碼,注意不是真正的密碼,而是剛剛申請到的授權碼
password: xxxxxxxxxxx
#端口號465或587
port: 587
#默認的郵件編碼為UTF-8
default-encoding: UTF-8
#其他參數
properties:
mail:
#配置SSL 加密工廠
smtp:
ssl:
#本地測試,先放開ssl
enable: false
required: false
#開啟debug模式,這樣郵件發送過程的日志會在控制臺打印出來,方便排查錯誤
debug: true
指定郵箱類型如下圖所示
這里我們創建一個一般郵件格式都有的實體類,包括收件人、郵件主題、郵件內容、以及附件路徑等內容。
@Data
public class MailRequest implements Serializable {
/**
* 接收人
*/
private String sendTo;
/**
* 郵件主題
*/
private String subject;
/**
* 郵件內容
*/
private String text;
/**
* 附件路徑
*/
private String filePath;
}
完成郵件實體配置之后,我們需要定義一個郵件服務。
public interface SendMailService {
/**
* 簡單文本郵件
*
* @param mailRequest
* @return
*/
void sendSimpleMail(MailRequest mailRequest);
/**
* Html格式郵件,可帶附件
*
* @param mailRequest
* @return
*/
void sendHtmlMail(MailRequest mailRequest);
}
郵件服務實現
@Service
public class SendMailServiceImpl implements SendMailService {
//注入郵件工具類
@Autowired
private JavaMailSender javaMailSender;
@Value("${spring.mail.username}")
private String sendMailer;
private static final Logger logger = LoggerFactory.getLogger(SendMailServiceImpl.class);
public void checkMail(MailRequest mailRequest) {
Assert.notNull(mailRequest,"郵件請求不能為空");
Assert.notNull(mailRequest.getSendTo(), "郵件收件人不能為空");
Assert.notNull(mailRequest.getSubject(), "郵件主題不能為空");
Assert.notNull(mailRequest.getText(), "郵件收件人不能為空");
}
@Override
public void sendSimpleMail(MailRequest mailRequest) {
SimpleMailMessage message = new SimpleMailMessage();
checkMail(mailRequest);
//郵件發件人
message.setFrom(sendMailer);
//郵件收件人 1或多個
message.setTo(mailRequest.getSendTo().split(","));
//郵件主題
message.setSubject(mailRequest.getSubject());
//郵件內容
message.setText(mailRequest.getText());
//郵件發送時間
message.setSentDate(new Date());
javaMailSender.send(message);
logger.info("發送郵件成功:{}->{}",sendMailer,mailRequest.getSendTo());
}
@Override
public void sendHtmlMail(MailRequest mailRequest) {
MimeMessage message = javaMailSender.createMimeMessage();
checkMail(mailRequest);
try {
MimeMessageHelper helper = new MimeMessageHelper(message,true);
//郵件發件人
helper.setFrom(sendMailer);
//郵件收件人 1或多個
helper.setTo(mailRequest.getSendTo().split(","));
//郵件主題
helper.setSubject(mailRequest.getSubject());
//郵件內容
helper.setText(mailRequest.getText(),true);
//郵件發送時間
helper.setSentDate(new Date());
String filePath = mailRequest.getFilePath();
if (StringUtils.hasText(filePath)) {
FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
helper.addAttachment(fileName,file);
}
javaMailSender.send(message);
logger.info("發送郵件成功:{}->{}",sendMailer,mailRequest.getSendTo());
} catch (MessagingException e) {
logger.error("發送郵件時發生異常!",e);
}
}
}
@RestController
@RequestMapping("/sendmail")
public class SendMailController {
@Autowired
private SendMailService sendMailService;
@PostMapping("/simple")
public void SendSimpleMessage(@RequestBody MailRequest mailRequest) {
sendMailService.sendSimpleMail(mailRequest);
}
@PostMapping("/html")
public void SendHtmlMessage(@RequestBody MailRequest mailRequest) {
sendMailService.sendHtmlMail(mailRequest);
}
}
完成配置之后,調用Controller接口就可以實現對指定的郵箱發送消息了。
何在Spring boot中配置和發送郵件呢,今天我們就以QQ郵件為例,給大家說一下在spring Boot中發送,包括簡單郵件,html格式郵件,包含附件的郵件,和發送圖片內容的郵件
spring boot配置郵件
package com.team.base.service;
import lombok.extern.java.Log;
import lombok.extern.log4j.Log4j;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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.stereotype.Service;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
/**
* @com.team.base.service
* @fenghaiju
* @2018/3/19-16:46
* @springBootBase
**/
@Service
@Slf4j
public class MailService {
@Autowired
private JavaMailSender sender;
@Value("${spring.mail.username}")
private String from;
/**
* 發送純文本的簡單郵件
* @param to
* @param subject
* @param content
*/
public void sendSimpleMail(String to, String subject, String content){
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(to);
message.setSubject(subject);
message.setText(content);
try {
sender.send(message);
log.info("簡單郵件已經發送。");
} catch (Exception e) {
log.error("發送簡單郵件時發生異常!",e);
}
}
/**
* 發送html格式的郵件
* @param to
* @param subject
* @param content
*/
public void sendHtmlMail(String to, String subject, String content){
MimeMessage message = sender.createMimeMessage();
try {
//true表示需要創建一個multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
sender.send(message);
log.info("html郵件已經發送。");
} catch (MessagingException e) {
log.error("發送html郵件時發生異常!",e);
}
}
/**
* 發送帶附件的郵件
* @param to
* @param subject
* @param content
* @param filePath
*/
public void sendAttachmentsMail(String to, String subject, String content, String filePath){
MimeMessage message = sender.createMimeMessage();
try {
//true表示需要創建一個multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
helper.addAttachment(fileName, file);
sender.send(message);
log.info("帶附件的郵件已經發送。");
} catch (MessagingException e) {
log.error("發送帶附件的郵件時發生異常!",e);
}
}
/**
* 發送嵌入靜態資源(一般是圖片)的郵件
* @param to
* @param subject
* @param content 郵件內容,需要包括一個靜態資源的id,比如:<img src=\"cid:rscId01\" >
* @param rscPath 靜態資源路徑和文件名
* @param rscId 靜態資源id
*/
public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId){
MimeMessage message = sender.createMimeMessage();
try {
//true表示需要創建一個multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
FileSystemResource res = new FileSystemResource(new File(rscPath));
helper.addInline(rscId, res);
sender.send(message);
log.info("嵌入靜態資源的郵件已經發送。");
} catch (MessagingException e) {
log.error("發送嵌入靜態資源的郵件時發生異常!",e);
}
}
}
package com.team.base.controller; import com.team.base.service.MailService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @com.team.base.controller * @fenghaiju * @2018/3/19-16:51 * @springBootBase **/ @RestController @RequestMapping("/mail") public class MailController { @Autowired private MailService mailService; /** * 簡單發送 * @return */ @RequestMapping("/sendSimpleMail") public ResponseEntity<?> sendSimpleMail(){ mailService.sendSimpleMail("fenghaiju@sohu.com", "簡單郵件", "簡單的郵件測試"); return ResponseEntity.ok(true); } /** * 發送html內容 * @return */ @RequestMapping("/sendHtmlMail") public ResponseEntity<?> sendHtmlMail(){ mailService.sendHtmlMail("fenghaiju@sohu.com", "html郵件", "<html><body><h3>你好, 這是一封模板郵件!</h3></body></html>"); return ResponseEntity.ok(true); } /** * 發送附件 * @return */ @RequestMapping("/sendAttachmentsMail") public ResponseEntity<?> sendAttachmentsMail(){ mailService.sendAttachmentsMail("fenghaiju@sohu.com", "附件郵件", "測試郵件內容","D:\\article\\結尾.txt"); return ResponseEntity.ok(true); } /** * 發送圖片 * @return */ @RequestMapping("/sendInlineResourceMail") public ResponseEntity<?> sendInlineResourceMail(){ mailService.sendInlineResourceMail("fenghaiju@sohu.com", "發送圖片", "<img src=\"cid:rscId01\" >","D:\\article\\架構師.png","rscId01"); return ResponseEntity.ok(true); } }
企業郵箱中創建個性化的電子郵件模板,可以在創作郵件時節省時間,快速的完成郵件;并且根據設置好的格式,也不會丟下關鍵的信息內容,那么這些具體是怎樣實現的呢?下面介紹具體實現的內容。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。