本節介紹SpringBoot項目如何快速配置和發送郵件,包括簡單的郵件配置、發送簡單郵件、發送HTML郵件、發送攜帶附件的郵件等。
示例源碼在:https://github.com/laolunsi/spring-boot-examples
一、郵箱配置
要確保使用的郵箱開啟了客戶端登錄服務,以163郵箱為例:
注意在發送郵件的配置中,填寫的用戶名是郵箱地址,密碼是這里的授權碼。其他郵箱如QQ、企業郵箱也是類似的配置,不懂的建議百度哦,不是很復雜的。
下面我們直接進入示例吧:
二、簡單郵件發送
創建一個SpringBoot項目,引入如下依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
注:其他依賴按照自己的需求添加即可,如有問題可以參考示例項目。
填寫配置信息:
server:
port: 8012
spring:
mail:
host: 'smtp.163.com'
username: 'xxx@163.com'
password: 'xxxx' # 授權碼
編寫測試接口:
@RestController
@RequestMapping(value = "email")
public class EmailAction {
@Value("${spring.mail.username}")
private String sendName;
private final JavaMailSender mailSender; // 也可以使用AutoWired
public EmailAction(JavaMailSender mailSender) {
this.mailSender = mailSender;
}
@PostMapping(value = "simple")
public String sendSimpleMsg(String msg, String email) {
if (StringUtils.isEmpty(msg) || StringUtils.isEmpty(email)) {
return "請輸入要發送消息和目標郵箱";
}
try {
SimpleMailMessage mail = new SimpleMailMessage();
mail.setFrom(sendName);
mail.setTo(email);
mail.setSubject("這是一封簡單郵件");
mail.setText(msg);
mailSender.send(mail);
return "發送成功";
} catch (Exception ex) {
ex.printStackTrace();
return "發送失敗:" + ex.getMessage();
}
}
}
測試一下:
三、HTML發送
除了普通的文本格式郵件,郵件還可以是HTML格式的,這樣就可以自定義豐富的樣式啦!
發送HTML郵件也很簡單,在發送郵件時指定內容為HTML即可:
@PostMapping(value = "html")
public String sendHtmlMsg(String msg, String email) {
if (StringUtils.isEmpty(msg) || StringUtils.isEmpty(email)) {
return "請輸入要發送消息和目標郵箱";
}
try {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
messageHelper.setFrom(sendName);
messageHelper.setTo(email);
messageHelper.setSubject("HTML郵件");
String html = "<div><h1><a name=\"hello\"></a><span>Hello</span></h1><blockquote><p><span>this is a html email.</span></p></blockquote><p> </p><p><span>"
+ msg + "</span></p></div>";
messageHelper.setText(html, true);
mailSender.send(message);
return "發送成功";
} catch (MessagingException e) {
e.printStackTrace();
return "發送失敗:" + e.getMessage();
}
}
四、含附件的郵件發送
有時候需要發送攜帶附件的郵件,比如投遞簡歷,通常會攜帶一個PDF文件。
我們這里在resources下添加一個PDF文件,然后發送郵件時攜帶這個文件:
@PostMapping(value = "mime_with_file")
public String sendWithFile(String msg, String email) {
if (StringUtils.isEmpty(msg) || StringUtils.isEmpty(email)) {
return "請輸入要發送消息和目標郵箱";
}
try {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
messageHelper.setFrom(sendName);
messageHelper.setTo(email);
messageHelper.setSubject("一封包含附件的郵件");
messageHelper.setText(msg);
// 該文件位於resources目錄下
// 文件路徑不能直接寫文件名,系統會報錯找不到路徑,而IDEA卻能直接映射過去
// 文件路徑可以寫成相對路徑src/main/resources/x.pdf,也可以用絕對路徑:System.getProperty("user.dir") + "/src/main/resources/x.pdf"
File file = new File("src/main/resources/SpringBoot日志處理之Logback.pdf");
//File file = new File(System.getProperty("user.dir") + "/src/main/resources/SpringBoot日志處理之Logback.pdf");
System.out.println("文件是否存在:" + file.exists());
messageHelper.addAttachment(file.getName(), file);
mailSender.send(message);
return "發送成功";
} catch (MessagingException e) {
e.printStackTrace();
return "發送失敗:" + e.getMessage();
}
}
測試一下:
五、HTML含圖片發送
如果HTML郵件包含圖片等靜態資源怎么辦呢?即將圖片顯示在郵件中,這樣郵件接收者就不用下載附件才能看到圖片內容了。而且郵件內容也更加豐富了。
這個功能也很簡單,使用addInline即可,可以這樣做:
@PostMapping(value = "html_with_img")
public String sendHtmlWithImg(String msg, String email) {
if (StringUtils.isEmpty(msg) || StringUtils.isEmpty(email)) {
return "請輸入要發送消息和目標郵箱";
}
try {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
messageHelper.setFrom(sendName);
messageHelper.setTo(email);
messageHelper.setSubject("帶靜態資源圖片的HTML郵件");
String html = "<div><h1><a name=\"hello\"></a><span>Hello</span></h1><blockquote><p><span>this is a html email.</span></p></blockquote><p> </p><p><span>"
+ msg + "</span></p><img src='cid:myImg' /></div>";
messageHelper.setText(html, true);
File file = new File("src/main/resources/wei.jpg");
messageHelper.addInline("myImg", file);
mailSender.send(message);
return "發送成功";
} catch (MessagingException e) {
e.printStackTrace();
return "發送失敗:" + e.getMessage();
}
}
六、使用模板發送郵件
利用模板引擎,比如thymeleaf,還可以通過模板文件來發送郵件:
首先引入spring-boot-starter-thymeleaf依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
在resources下新建一個templates文件夾,下面創建一個EmailTemplate.html文件:
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>郵件模板</title>
</head>
<body>
Hello, this is your msg: <span th:text="${msg}"></span>
</body>
</html>
@Autowired
private TemplateEngine templateEngine;
@PostMapping(value = "html_with_template")
public String sendHtmlByTemplate(String msg, String email) {
if (StringUtils.isEmpty(msg) || StringUtils.isEmpty(email)) {
return "請輸入要發送消息和目標郵箱";
}
try {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
messageHelper.setFrom(sendName);
messageHelper.setTo(email);
messageHelper.setSubject("使用HTML模板文件發送郵件");
Context context = new Context();
context.setVariable("msg", msg);
messageHelper.setText(templateEngine.process("EmailTemplate", context), true);
mailSender.send(message);
return "發送成功";
} catch (MessagingException e) {
e.printStackTrace();
return "發送失敗:" + e.getMessage();
}
}