1. 郵件與協議
A. smtp(簡單郵件傳輸協議):smtp是Simple Mail Transfer Protocol縮寫,它是一組用於從源地址到目的地址傳輸郵件的規范,通過它來控制郵件的中轉方式,smtp認證要求必須提供賬號和密碼才能登陸服務器,其目的是避免用戶受到垃圾郵件的干擾;
B. pop3(郵局協議):pop3是Post Office Protocol 3縮寫,支持客戶端遠程管理服務器端的郵件;
C. smtp服務器地址:網易163/QQ/126/sina/aliyun郵箱 ——> smtp.163.com/smtp.qq.com/ smtp.126.com/smtp.sina.com/ smtp.aliyun.com;
D. 郵件分簡單郵件和復雜郵件,復雜郵件有html格式郵件、帶附件格式郵件、帶靜態資源郵件、基於Freemarker模板的郵件;
2. pom.xml Maven依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
3. 郵箱信息配置
A. application.properties文件配置
B. 前端傳輸參數動態配置
注意:若使用配置文件設置郵箱信息,可使用JavaMailSender接口發送郵件;若動態配置郵箱信息,需使用JavaMailSenderImpl實現類發送郵件;它們是Java后端發送郵件和集成郵件服務的主流工具。
4. 發送郵件
A. 發送簡單郵件
package com.ruhuanxingyun.dcy.service.manage.service; import com.ruhuanxingyun.dcy.service.manage.model.dto.MailDTO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.mail.MailProperties; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Service; /** * @description: 郵件 服務層 * @author: ruphie * @date: Create in 2021/4/17 11:00 * @company: ruhuanxingyun */ @Slf4j @Service public class MailService { @Autowired private MailProperties mailProperties; @Autowired private JavaMailSender javaMailSender; /** * 發送簡單郵件 * @param mailDTO 郵件信息 */ public void sendSimpleMail(MailDTO mailDTO) { SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); // 郵件發送人 simpleMailMessage.setFrom(mailProperties.getUsername()); // 郵件收件人 simpleMailMessage.setTo(mailDTO.getMailRecipient()); //郵件主題 simpleMailMessage.setSubject(mailDTO.getSubject()); //郵件內容 simpleMailMessage.setText(mailDTO.getContent()); // 發送郵件 javaMailSender.send(simpleMailMessage); } }
B. 發送HTML郵件
package com.ruhuanxingyun.service.system.impl; import com.ruhuanxingyun.entity.system.Mail; import com.ruhuanxingyun.service.system.IMailService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.util.Properties; /** * @description: 郵件工具接口實現層 * @author: ruphie * @date: Create in 2020/1/4 16:58 * @company: ruhuanxingyun */ @Service public class MailServiceImpl implements IMailService { @Autowired private JavaMailSenderImpl javaMailSender; @Override public void sendHtmlMail(Mail mail){ javaMailSender.setDefaultEncoding("UTF-8"); javaMailSender.setHost(mail.getMailHost());
javaMailSender.setPort(mail.getMailPort()); // 是否SSL加密連接 if (mail.getOnSsl() == 2) { Properties properties = new Properties(); properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); javaMailSender.setJavaMailProperties(properties); } // 需要驗證郵箱用戶名和密碼 if (mail.getOnAuth() == 2) { javaMailSender.setUsername(mail.getUsername()); javaMailSender.setPassword(mail.getPassword()); } MimeMessage mimeMessage = javaMailSender.createMimeMessage(); try { MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true); messageHelper.setFrom(mail.getMailSender()); messageHelper.setTo(mail.getMailRecipient()); messageHelper.setSubject(mail.getSubject()); messageHelper.setText(mail.getContent(), true); javaMailSender.send(mimeMessage); } catch (MessagingException e) { e.printStackTrace(); throw new RuntimeException("發送測試郵件失敗"); } } }
C. 發送帶靜態資源郵件
D. 發送帶附件郵件
5. 常見錯誤
錯誤一:注入JavaMailSender或JavaMailSenderImpl,啟動報錯
原因:無法找到該類,因為沒有被掃描到,無法自動注入
解決:配置bean類,並在類上加@Configuration
可參考:SpringBoot整合Mail郵件;