SpringBoot發送郵件
發送郵件原理:
最早的郵件傳輸協議:
SMTP協議:
SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議,它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。SMTP協議屬於TCP/IP協議簇,它幫助每臺計算機在發送或中轉信件時找到下一個目的地。
POP3協議:
POP3,全名爲"Post Office Protocol - Version 3",即"郵局協議版本3"。是TCP/IP協議族中的一員,由RFC1939 定義。本協議主要用於支持使用客戶端遠程管理在服務器上的電子郵件。提供了SSL加密的POP3協議被稱爲POP3S。
目前郵件傳輸協議:
IMAP協議:
IMAP(Internet Mail Access Protocol,Internet郵件訪問協議)以前稱作交互郵件訪問協議(Interactive Mail Access Protocol)。IMAP是斯坦福大學在1986年開發的一種郵件獲取協議。它的主要作用是郵件客戶端(例如MS Outlook Express)可以通過這種協議從郵件服務器上獲取郵件的信息,下載郵件等。當前的權威定義是RFC3501。IMAP協議運行在TCP/IP協議之上,使用的端口是143。它與POP3協議的主要區別是用戶可以不用把所有的郵件全部下載,可以通過客戶端直接對服務器上的郵件進行操作。
Mime協議:
MIME(Multipurpose Internet Mail Extensions)多用途互聯網郵件擴展類型。是設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候,瀏覽器會自動使用指定應用程序來打開。多用於指定一些客戶端自定義的文件名,以及一些媒體文件打開方式。
郵件發送流程:
郵件發送歷史:
創建SpringBoot項目配置模板:
導入到 IDEA編輯器中:
可以將模板項目重命名爲自定義的,需要修改:
修改項目名,修改pom.xml文件中的兩處地方:
修改後我們的項目目錄如下:
代碼實現:
一、發送文本郵件
第一:引入相關jar包
第二:application.properties配置郵箱參數
第三:封裝SimpleMailMessage
第四:JavaMailSender進行發送
第五:測試
第一:pom.xml 中引入 spring-boot-starter-mail
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
第二:添加參數application.properties
第三:src/main/xxxx/service/MailService.java
@Service
public class MailService {
private final Logger logger= LoggerFactory.getLogger(this.getClass());
@Value("${spring.mail.username}")
private String from;
@Autowired
private JavaMailSender javaMailSender;
public void sendSimpleMail(String to,String subject,String content){
logger.info("發送文本郵件開始:{}___{}___{}",to,subject,content);
SimpleMailMessage simpleMailMessage=new SimpleMailMessage();
simpleMailMessage.setTo(to);
simpleMailMessage.setSubject(subject);
simpleMailMessage.setText(content);
simpleMailMessage.setFrom(from);
javaMailSender.send(simpleMailMessage);
}
}
第四:單元測試src/test/xxxx/service/ServiceTest.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class ServiceTest {
@Resource
MailService mailService;
@Resource
TemplateEngine templateEngine;
@Test
public void sendSimpleMailTest(){
mailService.sendSimpleMail("[email protected]",
"發送第一封文本郵件",
"搭建完畢,發送第一封文本郵件!!!");
}
}
控制檯打印日誌:說明發送成功
二、發送HTML郵件
src/main/xxxx/service/MailService.java
@Service
public class MailService {
private final Logger logger= LoggerFactory.getLogger(this.getClass());
@Value("${spring.mail.username}")
private String from;
@Autowired
private JavaMailSender javaMailSender;
public void sendHtmlMail(String to,String subject,String content){
MimeMessage mimeMessage=javaMailSender.createMimeMessage();
logger.info("發送HTML郵件開始:{},{},{}",to,subject,content);
MimeMessageHelper mimeMessageHelper= null;
try {
mimeMessageHelper = new MimeMessageHelper(mimeMessage,true,"utf-8");
mimeMessageHelper.setTo(to);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(content,true);
mimeMessageHelper.setFrom(from);
javaMailSender.send(mimeMessage);
logger.info("發送HTML郵件成功!");
} catch (MessagingException e) {
logger.error("發送HTML郵件異常",e);
}
}
}
src/testxxxx/service/ServiceTest.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class ServiceTest {
@Resource
MailService mailService;
@Resource
TemplateEngine templateEngine;
@Test
public void sendHtmlMailTest(){
String content = "<html>\n"
+ "<body>\n"
+ "<h3>"+"Hello World!,這是第一封HTML郵件!!!"+"</h3>\n"
+ "</body>\n"
+ "</html>";
mailService.sendHtmlMail("[email protected]", "發送第一封HTML郵件", content);
}
}
控制檯打印:日誌信息
三、發送附件郵件
src/main/xxxx/service/MailService.java
@Service
public class MailService {
private final Logger logger= LoggerFactory.getLogger(this.getClass());
@Value("${spring.mail.username}")
private String from;
@Autowired
private JavaMailSender javaMailSender;
public void sendAttachmentsMail(String to,String subject,String content,
String filePath){
MimeMessage mimeMessage=javaMailSender.createMimeMessage();
logger.info("發送附件郵件開始:{},{},{},{}",to,subject,content,filePath);
MimeMessageHelper mimeMessageHelper= null;
try {
mimeMessageHelper = new MimeMessageHelper(mimeMessage,true,"UTF-8");
mimeMessageHelper.setTo(to);
mimeMessageHelper.setFrom(from);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(content,true);
FileSystemResource fileSystemResource=
new FileSystemResource(new File(filePath));
String fileName=fileSystemResource.getFilename();
mimeMessageHelper.addAttachment(fileName,fileSystemResource);
//可以發送多個附件或是一個數組,遍歷發送附件
mimeMessageHelper.addAttachment(fileName+"_test1",fileSystemResource);
mimeMessageHelper.addAttachment(fileName+"_test2",fileSystemResource);
mimeMessageHelper.addAttachment(fileName+"_test3",fileSystemResource);
javaMailSender.send(mimeMessage);
logger.info("發送附件郵件成功!");
} catch (MessagingException e) {
logger.error("發送附件郵件異常",e);
}
}
}
src/test/xxxx/service/ServiceTest.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class ServiceTest {
@Resource
MailService mailService;
@Resource
TemplateEngine templateEngine;
@Test
public void sendAttachmentsMailTest(){
String filePath="D:/SpringBoot/helloWorld.zip";
mailService.sendAttachmentsMail("[email protected]",
"發送第一封附件郵件",
"這是一封帶有附件的郵件",filePath);
}
}
控制檯打印:日誌顯示
四、帶圖片的郵件
src/main/xxxx/service/MailService.java
@Service
public class MailService {
private final Logger logger= LoggerFactory.getLogger(this.getClass());
@Value("${spring.mail.username}")
private String from;
@Autowired
private JavaMailSender javaMailSender;
public void sendInLineResourceMail(String to,String subject,String content,
String rscPath,String rscID){
MimeMessage mimeMessage=javaMailSender.createMimeMessage();
logger.info("發送靜態郵件開始:{},{},{},{},{}",to,subject,content,rscPath,rscID);
MimeMessageHelper mimeMessageHelper= null;
try {
mimeMessageHelper = new MimeMessageHelper(mimeMessage,true,"UTF-8");
mimeMessageHelper.setFrom(from);
mimeMessageHelper.setTo(to);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(content,true);
FileSystemResource fileSystemResource=
new FileSystemResource(new File(rscPath));
mimeMessageHelper.addInline(rscID,fileSystemResource);
javaMailSender.send(mimeMessage);
logger.info("發送圖片郵件成功!");
} catch (MessagingException e) {
logger.error("發送圖片郵件失敗!",e);
}
}
}
src/test/xxxx/service/ServiceTest.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class ServiceTest {
@Resource
MailService mailService;
@Resource
TemplateEngine templateEngine;
@Test
public void sendInLineMailTest(){
String imgPath="D:/SpringBoot/mail.jpg";
String rscId="mail001";
String content="<html><body>"
+"這是有圖片的文件:"
+"<img src=\'cid"+rscId+"\'></img>"
+"<img src=\'cid"+rscId+"\'></img>"
+"</body></html>";
mailService.sendInLineResourceMail("[email protected]",
"發送第一封圖片郵件",
content,
imgPath,
rscId);
}
}
控制檯打印:日誌信息
五、郵件模板
常用模板引擎:FreeMarker Thymeleaf Velocity Groovy Mustache等。不建議使用JSP。
具體實現後面博客中查看
六、常見異常
http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html
七、 郵件系統
需要考慮因素:
- 獨立微服務
- 異常處理
- 定時重試郵件
- 異步發送請求