發送郵件的總結博客
前言
其實發送郵件是一個比較簡單的操作,只是之前都沒進行總結,這裏彙總一下,大體分爲四個大類:1、發送簡單文本郵件。2、發送帶有附件的郵件。3、發送帶有HTML鏈接的郵件。4、發送模板渲染的郵件。
準備工作
通篇會以QQ郵箱爲例來進行舉例,並通過自己給自己發郵件的方式來完成實例。需要做的準備工作其實分爲兩個,一個是程序中相關配置的導入,另一個是自己郵箱SMTP服務的開通。
開通SMTP服務
1、進入自己的郵箱,然後找到設置按鈕
2、進入到賬戶選項卡
3、然後找到下面的開通POP3/SMTP服務的選項
我這裏已經是開通了,如果需要開通,還需要點擊下面的生成授權碼,然後將授權碼配置到自己的本地文件中,之後點擊頁面中的保存設置,搞定。
引入相關配置
1、引入mail服務的依賴
<!--email-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2、引入郵件的相關配置
##發送郵件的配置信息
spring.mail.host=smtp.qq.com
spring.mail.port=587 //相關端口,這個
spring.mail.username=********* //這裏配置自己的郵件用戶名
spring.mail.password=********* //這裏就是配置的授權碼
spring.mail.protocol=smtp
spring.mail.needAuth=true
spring.mail.sslClass=javax.net.ssl.SSLSocketFactory //指定加密認證方式
至此完成我們所有的準備工作,可以開始具體實例了
發送簡單文本郵件
配置完成之後,直接在自己定義的服務類中,注入JavaMailSender就可以了,這裏直接貼上代碼
@Autowired
private JavaMailSender mailSender;
/**
* 發送簡單的文本消息郵件
*
* @param subject 郵件主題
* @param content 郵件內容
* @param tos 目的郵箱(可以多個)
*/
public void sendSimpleMail(final String subject, final String content, final String[] tos) {
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
//這裏寫在配置文件中了,這裏應該指定自己的郵件服務器的賬戶
simpleMailMessage.setFrom(environment.getProperty("mail.send.from")); //指定那個人發的
simpleMailMessage.setTo(tos); //指定郵件發往何處
simpleMailMessage.setSubject(subject); //指定發送郵件的主題
simpleMailMessage.setText(content);
mailSender.send(simpleMailMessage);
log.info("簡單文本郵件發送成功:{}", simpleMailMessage);
}
controller測試的代碼
@RequestMapping(value = prefix + "/send/simple", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
public BaseResponse sendSimpleMail(@RequestBody @Validated MailRequest mailRequest, BindingResult bindingResult) {
BaseResponse response = new BaseResponse(StatusCode.Success);
try {
String checkResult = ValidatorUtils.checkResult(bindingResult);
if (StringUtils.isNotBlank(checkResult)) {
return new BaseResponse(StatusCode.Invalid_Params);
}
log.info("發送簡單文本郵件參數爲:{}", mailRequest);
String[] mailTos = StringUtils.split(mailRequest.getMailTos(), ",");
//只需要關注這個就可以,這個就是調用service的發送郵件
mailService.sendSimpleMail(mailRequest.getSubject(), mailRequest.getContent(), mailTos);
} catch (Exception e) {
response = new BaseResponse(StatusCode.Fail);
log.error("發送郵件異常:{}", e);
}
return response;
}
發送帶有附件的郵件
發送帶有附件文件的郵件,需要配置附件文件的地址
#附件文件的文件夾地址
mail.send.attachment.location.root.url=D:\\MailAttachment
##第一個附件文件的文件名和文件地址
mail.send.attachment.one.location=${mail.send.attachment.location.root.url}\\image1.jpg
mail.send.attachment.one.name=圖片1.jpg
##第二個附件文件的文件名和文件地址
mail.send.attachment.two.location=${mail.send.attachment.location.root.url}\\image2.jpg
mail.send.attachment.two.name=圖片2.jpg
##第三個附件文件的文件名和文件地址,這裏故意將文件名弄的有點長
mail.send.attachment.three.location=${mail.send.attachment.location.root.url}\\SpringBoot郵件測試發送附件文件.docx
mail.send.attachment.three.name=SpringBoot郵件測試發送附件文件測試長文件名稱的文件附件這個文件的文件名字就是怎麼長不要懷疑.docx
配置完成之後,在實例中可以利用 MimeMessageHelper
來完成正式待發送郵件的構建,具體代碼如下所示:
/**
* 發送帶有附件的郵件
*
* @param subject
* @param content
* @param tos
*/
public void sendAttachmentMail(final String subject, final String content, final String[] tos) throws Exception {
MimeMessage mimeMessage = mailSender.createMimeMessage();
//這裏如果要發送附件,需要將第二個參數置爲true,將郵件信息對象切換到多模塊模式。
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "utf-8");
messageHelper.setFrom(environment.getProperty("mail.send.from"));
messageHelper.setTo(tos);
messageHelper.setSubject(subject);
//加入簡單文本消息
messageHelper.setText(content);
//加入附件文件
messageHelper.addAttachment(environment.getProperty("mail.send.attachment.one.name"), new File(environment.getProperty("mail.send.attachment.one.location")));
messageHelper.addAttachment(environment.getProperty("mail.send.attachment.two.name"), new File(environment.getProperty("mail.send.attachment.two.location")));
messageHelper.addAttachment(environment.getProperty("mail.send.attachment.three.name"), new File(environment.getProperty("mail.send.attachment.three.location")));
mailSender.send(mimeMessage);
log.info("發送帶附件的郵件成功:{}", mimeMessage);
}
controller的測試文件
/**
* 發送帶附件的郵件
*
* @param mailRequest
* @param bindingResult
* @return
*/
@RequestMapping(value = prefix + "/send/attachment", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
public BaseResponse sendAttachmentMail(@RequestBody @Validated MailRequest mailRequest, BindingResult bindingResult) {
BaseResponse response = new BaseResponse(StatusCode.Success);
try {
String checkResult = ValidatorUtils.checkResult(bindingResult);
if (StringUtils.isNotBlank(checkResult)) {
return new BaseResponse(StatusCode.Invalid_Params);
}
log.info("開始發送帶有附件的郵件:{}", mailRequest);
String[] mailTos = StringUtils.split(mailRequest.getMailTos(), ",");
//只需要關注這裏就好
mailService.sendAttachmentMail(mailRequest.getSubject(), mailRequest.getContent(), mailTos);
} catch (Exception e) {
response = new BaseResponse(StatusCode.Fail);
log.error("發送帶附件的郵件異常,異常信息爲:{}", e);
}
return response;
}
最終的結果,會發現收到的結果會有個問題
第三個文件名過長的文件,直接亂碼了,這就尷尬了,最後通過找源碼(我也忘記我咋找的了)發現,其實有個一屬性是默認開了的,導致文件名長度超過60,就會自動切分,因此需要在啓動的時候將這個屬性關掉即可,具體如下所示:
/**
* 如果附件中指示的文件名過長,則會出現文件亂碼的問題,是因爲默認的屬性
* mail.mime.splitlongparameters=true所致,這裏需要將其置爲false
*/
@PostConstruct
public void init() {
System.setProperty("mail.mime.splitlongparameters", "false");
}
之後測試結果正常
發送帶有HTML文本的郵件
這個在之前的基礎上只需要修改一個參數就可以了
/**
* 發送HTML類型的郵件
*
* @param subject
* @param content
* @param tos
*/
public void sendHTMLMail(final String subject, final String content, final String[] tos) throws Exception {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "utf-8");
messageHelper.setFrom(environment.getProperty("mail.send.from"));
messageHelper.setTo(tos);
messageHelper.setSubject(subject);
log.info(content);
messageHelper.setText(content, true);//第二個參數設置爲true,表示爲發送HTML文本
messageHelper.addAttachment(environment.getProperty("mail.send.attachment.one.name"), new File(environment.getProperty("mail.send.attachment.one.location")));
mailSender.send(mimeMessage);
log.info("發送帶有HTML文本的郵件成功");
}
在測試的時候,可以直接弄一個HTML的字符串,發送過來,就會正常顯示HTML的內容。
發送thymeleaf渲染的郵件
有些企業級別的郵件發送出來的時候,是渲染了相關指定模板的,這裏也將這個總結一下。以thymeleaf爲例。
1、引入thymeleaf的依賴
<!--thymeleaf-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2、配置thymeleaf的相關參數
#指定模板文件的名稱
mail.template.file.name=mailTempOne
##thymeleaf的配置
spring.thymeleaf.enabled=true
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
#指定模板文件的文件夾地址
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.check-template-location=true
spring.thymeleaf.check-template=false
spring.thymeleaf.cache=false
3、一個簡單的模板
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">
<head>
<meta charset="UTF-8"/>
<title>Title</title>
</head>
<body>
<p style="font-size: larger; color: burlywood">這是我發送出來的模板郵件,以下是郵件內容:</p><br/>
內容:<span th:text="${content}"></span><br/>
收件人:<span th:text="${mailTos}"></span><br/>
</body>
</html>
4、渲染模板的代碼
/**
* 渲染HTML模板
* @param templateFile 具體的模板文件
* @param paramMap 需要填充的參數
*/
public String renderTemplate(final String templateFile,Map<String,Object> paramMap){
Context context=new Context(LocaleContextHolder.getLocale());
context.setVariables(paramMap);
return templateEngine.process(templateFile,context);
}
5、controller中直接獲得填充後的文件,然後交給發送郵件的服務
@RequestMapping(value=prefix+"/send/template",method=RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
public BaseResponse sendTemplateMail(@RequestBody @Validated MailRequest mailRequest, BindingResult bindingResult){
BaseResponse response = new BaseResponse(StatusCode.Success);
try {
String checkResult = ValidatorUtils.checkResult(bindingResult);
if (StringUtils.isNotBlank(checkResult)) {
return new BaseResponse(StatusCode.Invalid_Params);
}
log.info("渲染HTML模板併發送帶模板的郵件:{}",mailRequest);
Map<String,Object> paramMap= Maps.newHashMap();
paramMap.put("content",mailRequest.getContent());
paramMap.put("mailTos",mailRequest.getMailTos());
//獲取渲染之後的HTML
String html = mailService.renderTemplate(templateFileLocation,paramMap);
String[] tos = StringUtils.split(mailRequest.getMailTos());
//通過發送HTML的方式發送郵件
mailService.sendHTMLMail(mailRequest.getSubject(),html,tos);
} catch (Exception e) {
response = new BaseResponse(StatusCode.Fail);
log.error("發送HTML郵件異常,異常信息爲:{}", e);
}
return response;
}
總結
四種發送郵件的操作,幾乎涵蓋了大部分應用場景
1、發送簡單文本郵件。2、發送帶有附件的郵件。3、發送帶有HTML鏈接的郵件。4、發送模板渲染的郵件。