本文記錄學習在SpringBoot中發送郵件。java
發送郵件是一個咱們在項目中常常會用到的功能,如在用戶註冊時發送驗證碼,帳戶激活等都會用到。完整的一個郵件發送過程主要包含如下幾個步驟:spring
1 發件人在用戶郵件代理上寫郵件內容及收件人的郵箱地址;服務器
2 用戶郵件代理根據發件人填寫的郵件信息,生成一封符合郵件格式的郵件;app
3 用戶郵件代理把郵件發送到發信人的郵件服務器上;ide
4 發件人的郵件服務器使用 SMTP 協議把這封郵件發送到收件人的郵件服務器上;spring-boot
5 收件人的郵件服務器收到郵件後,把這封郵件放到收件人在這個服務器上的信箱中;學習
6 收件人使用用戶郵件代理來收取郵件。測試
之前發送郵件時,調用 JavaMail 的相關 API 來開發實現,須要咱們本身去組裝消息體,代碼量比較大,實現起來也不是很容易;Spring 提供的JavaMailSender 對JavaMail的Api作了必定的封裝,簡化了發郵件的過程。JavaMailSender 提供了強大的郵件發送功能,可支持各類類型的郵件發送。Spring Boot在JavaMailSender 的基礎上又作了進一步的封裝,讓咱們的使用更加的簡單。spa
在pom.xml文件中引入須要得依賴代理
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
在application.properties中配置郵件服務相關信息(測試使用得是QQ郵件服務)
# Email
#郵件默認字符集
spring.mail.default-encoding=UTF-8
#郵件服務地址
spring.mail.host=smtp.qq.com
#郵件服務協議,能夠不寫(查看源碼可知,沒有時默認值是smtp )
#spring.mail.protocol=smtp
#端口
spring.mail.port=25
#帳號
spring.mail.username=********@qq.com
#密碼 使用第三方發送郵件時,須要開通受權,因此此處要寫郵箱受權碼
spring.mail.password=****************
完成了上邊得配置後,在啓動服務得時候,SpringBoot會根據咱們得配置,爲咱們初始化好一個JavaMailSender類供咱們調用,咱們只須要在要使用得地方注入就能夠了。
定義一個郵件服務接口,提供咱們得郵件服務方法,其餘業務中用到發郵件功能時,調用找個接口就能夠了
public interface EmailSenderService {
/**
* 發送文本消息
* @param subject 郵件主題
* @param content 郵件內容
* @param to 收件人(可變參數,多個時用逗號隔開)
*/
void sendTextMail(String subject, String content, String... to);
}
@Service
public class EmailSenderServiceImpl implements EmailSenderService {
@Autowired
private JavaMailSender javaMailSender;
//發件人郵箱
@Value("${spring.mail.username}")
private String from;
@Override
public void sendTextMail(String subject, String content, String... to) {
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setFrom(from);
mailMessage.setTo(to);
mailMessage.setSubject(subject);
mailMessage.setText(content);
mailMessage.setSentDate(new Date());
javaMailSender.send(mailMessage);
}
}
如上,咱們在實現類中注入JavaMailSender後直接調用它send方法就能夠完成發郵件。其餘業務中用到發郵件業務了,直接調用EmailSenderService 接口得方法便可。咱們徹底也能夠把JavaMailSender直接注入到咱們得各個業務模塊中去,在發郵件時直接調用JavaMailSender得send方法發郵件。可是仍是推薦將郵件發送相關功能獨立起來,便於維護。
上邊咱們實現了發送一個文本郵件,有時候咱們還須要在發送郵件時附帶發送附件,這種也是支持的,咱們添加接口及實現方法
/**
* 發送帶附件郵件
* @param subject 主題
* @param content 內容
* @param filePath 附件得本地路徑
* @param fileName 附件名
* @param to 收件人
*/
void sendAttachmentMail(String subject, String content, String filePath, String fileName, String... to);
@Override
public void sendAttachmentMail(String subject, String content, String filePath, String fileName, String... to) {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content);
//附件
FileSystemResource file = new FileSystemResource(new File(filePath));
helper.addAttachment(fileName, file);
javaMailSender.send(mimeMessage);
} catch (MessagingException e) {
e.printStackTrace();
}
}
若是咱們發送郵件時,除了收件人以外,還想讓某些人知道即抄送某些人,這種也是支持得,接口及實現方法以下:
/**
* 發送一個郵件並抄送
* @param subject 主題
* @param content 內容
* @param ccList 抄送人(能夠有多個)
* @param to 收件人(能夠有多個)
*/
void sendTextMail(String subject, String content, List<String> ccList, String... to);
@Override
public void sendTextMail(String subject, String content, List<String> ccList, String... to) {
//收件人地址
InternetAddress[] addressesTo = new InternetAddress[to.length];
if(to != null && to.length>0){
for(int i=0;i<to.length;i++){
InternetAddress addressTo = null;
try {
addressTo = new InternetAddress(to[i]);
addressesTo[i] = addressTo;
} catch (AddressException e) {
e.printStackTrace();
}
}
}
//抄送人地址
InternetAddress[] addressesCc = new InternetAddress[ccList.size()];
if(ccList != null && ccList.size() > 0){
for(int i=0;i<ccList.size();i++){
String ccAdd = ccList.get(i);
InternetAddress address = null;
try {
address = new InternetAddress(ccAdd);
addressesCc[i] = address;
} catch (AddressException e) {
e.printStackTrace();
}
}
}
MimeMessagePreparator preparator = new MimeMessagePreparator() {
@Override
public void prepare(MimeMessage mimeMessage) throws Exception {
mimeMessage.setFrom(from);
mimeMessage.setSubject(subject);
mimeMessage.setText(content);
mimeMessage.setRecipients(Message.RecipientType.TO, addressesTo);
mimeMessage.setRecipients(Message.RecipientType.CC, addressesCc);
}
};
javaMailSender.send(preparator);
}
如上方法就實現了向多人發送郵件而且抄送多人