發送電子郵件
Spring
框架提供了一種使用 JavaMailSender
接口的簡單抽象方法發送電子郵件,而 SpringBoot
爲其提供了自動配置。
首先我們需要導入 spring-boot-starter-mail
包。
<!--mail-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
特別注意,因爲某些默認超時值是無限的,所以需要重新配置,以避免線程被一個無相應的郵箱服務器阻塞,如下面的例子所示:
spring.mail.properties.mail.smtp.connectiontimeout=5000
spring.mail.properties.mail.smtp.timeout=3000
spring.mail.properties.mail.smtp.writetimeout=5000
我們要知道,如果要從QQ郵箱發送一封郵件給163郵箱,並不是兩個用戶之間直接發送的,而是如下所示,用戶A把郵件發送給QQ郵箱服務器,然後QQ郵箱服務器發送給163郵箱服務器,最後用戶B上線之後再獲取這封郵件。
所以,我們還需要配置QQ郵箱的主機,你的郵箱賬戶的賬號、密碼(application.yml):
spring:
#mail的配置
mail:
properties:
smtp:
connectiontimeout: 5000
timeout: 3000
writetimeout: 5000
username: #你的郵箱賬號
password: #授權碼
host: smtp.qq.com
注意:上面的
password
並不是登錄時的密碼,獲取方式如下:
1、SimpleMailMessage
用法
接下來我們就可以發送電子郵件,記得更改代碼中的接收方的郵箱
和 發送方的郵箱
:
@SpringBootTest
class UmserverApplicationTests {
@Autowired
JavaMailSender mailSender;
@Test
public void testEmail() {
SimpleMailMessage msg = new SimpleMailMessage();
msg.setTo("接收方的郵箱");
msg.setSubject("一封郵件");
msg.setText("一封來自QQ郵箱的信件");
msg.setFrom("發送方的郵箱——即剛剛配置的郵箱賬號");
mailSender.send(msg);
}
}
2、 MimeMessageHelper
用法
有時候我們需要發送複雜的郵件,例如在郵件中加入附件,或者加入 Html
標籤,那麼就可以使用 MimeMessageHelper
。
2.1 帶有附件和Html
記得更改代碼中的接收方的郵箱
和 發送方的郵箱
:
@SpringBootTest
class UmserverApplicationTests {
@Autowired
JavaMailSender mailSender;
@Test
public void testEmail() throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setTo("接收方的郵箱");
helper.setFrom("發送方的郵箱——即剛剛配置的郵箱賬號");
helper.setSubject("MimeMessageHelper的使用");
helper.setText("<span style='color:red'>MimeMessageHelper的詳細使用如下:</span>" +
"<img src='cid:IMG_2139'>", true);
//在郵件內容中內置資源
FileSystemResource res = new FileSystemResource(new File("本機上的圖片地址"));
helper.addInline("IMG_2139", res);
//給郵件添加附件
FileSystemResource file = new FileSystemResource(new File("本機上的附件地址"));
helper.addAttachment("CoolImage.jpg", file);
mailSender.send(message);
}
}
效果如下:
2.2 使用模板庫創建郵件內容
在企業應用中,開發人員通常不會採用上面的那些方法來生成電子郵件內容,原因如下:
- 用Java代碼創建基於HTML的電子郵件內容很繁瑣且容易出錯;
- 顯示邏輯和業務邏輯之間沒有明確的區分;
- 更改電子郵件內容的顯示結構時需要編寫Java代碼,重新編譯,重新部署等。
解決這個問題的通常辦法是使用一個模版庫(例如FreeMarker
)來定義郵件內容的顯示結構。這時代碼的任務就只剩下產生數據,加入到郵件模版中,然後發送郵件。