在Spring Boot的工程中的pom.xml中引入spring-boot-starter-mail依賴:
org.springframework.boot
spring-boot-starter-mail
如其他自動化配置子產品一樣,在完成了依賴引入之後,隻需要在application.properties中配置相應的屬性内容。
下面我們以QQ郵箱為例,在application.properties中加入如下配置(注意替換自己的使用者名和密碼):
spring.mail.host=smtp.qq.com
spring.mail.username=使用者名
spring.mail.password=密碼
spring.mail.properties.mail.smtp.auth=truespring.mail.properties.mail.smtp.starttls.enable=truespring.mail.properties.mail.smtp.starttls.required=true
application.yml
mail:
host: mail.dahuatech.comdefault-encoding: UTF-8port:25username: [email protected]
password: [email protected]:
mail:
smtp:
auth:truestarttls:
enable:falserequired:false
通過單元測試來實作一封簡單郵件的發送:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes= Application.class)public classApplicationTests {
@AutowiredprivateJavaMailSender mailSender;
@Testpublic void sendSimpleMail() throwsException {
SimpleMailMessage message= newSimpleMailMessage();
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來發送一封帶有附件的郵件):
@Testpublic void sendAttachmentsMail() throwsException {
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實作在郵件正文中嵌入靜态資源。
@Testpublic void sendInlineMail() throwsException {
MimeMessage mimeMessage=mailSender.createMimeMessage();
MimeMessageHelper helper= new MimeMessageHelper(mimeMessage, true);
helper.setFrom("[email protected]");
helper.setTo("[email protected]");
helper.setSubject("主題:嵌入靜态資源");
helper.setText("
", true);
FileSystemResource file= new FileSystemResource(new File("weixin.jpg"));
helper.addInline("weixin", file);
mailSender.send(mimeMessage);
}
這裡需要注意的是addInline函數中資源名稱weixin需要與正文中cid:weixin對應起來
模闆郵件
通常我們使用郵件發送服務的時候,都會有一些固定的場景,比如重置密碼、注冊确認等,給每個使用者發送的内容可能隻有小部分是變化的。是以,很多時候我們會使用模闆引擎來為各類郵件設定成模闆,這樣我們隻需要在發送時去替換變化部分的參數即可。
在Spring Boot中使用模闆引擎來實作模闆化的郵件發送也是非常容易的,下面我們以FreeMarker為例實作一下。
引用 freeMarker jar引用. jar版本根據自己的情況選擇
org.springframework.boot
spring-boot-starter-freemarker
2.3.1.RELEASE
在resources/templates/下,建立一個模闆頁面template.ftl:
你好, ${username}, 這是一封模闆郵件!
使用模闆
@AutowiredprivateJavaMailSender mailSender;
@Autowiredprivate FreeMarkerConfigurer freeMarkerConfigurer;
//使用JavaMail的MimeMessage,支付更加複雜的郵件格式和内容
MimeMessage msg =mailSender.createMimeMessage();//建立MimeMessageHelper對象,處理MimeMessage的輔助類
MimeMessageHelper helper = new MimeMessageHelper(msg, true);//使用輔助類MimeMessage設定參數
helper.setFrom(from);
helper.setTo(recipients);helper.setCc(copyRecipients);
helper.setSubject(subject);
Map dataMap = JsonUtil.parseObject(mailContext,new TypeReference>(){});
Template template= freeMarkerConfigurer.getConfiguration().getTemplate(templateName+".ftl");try{
String text=FreeMarkerTemplateUtils.processTemplateIntoString(template,dataMap);
helper.setText(text,true);
}catch(TemplateException e){
e.printStackTrace();
}//加載檔案資源,作為附件//ClassPathResource file = new ClassPathResource("Chrysanthemum.jpg");//加入附件//helper.addAttachment("attachment.jpg", file);//發送郵件
mailSender.send(msg);