SpringBoot實現郵件功能是非常的方便快捷的,因為SpringBoot默認有starter實現了Mail。 發送郵件應該是網站的必備功能之一,什麼註冊驗證,忘記密碼或者是給用戶發送營銷信息。 最早期的時候我們會使用JavaMail相關api來寫發送郵件的相關代碼,後來spring退出了 JavaMailSender更加簡化了郵件發送的過程,在之後springboot對此進行了封裝就有了 現在的spring-boot-starter-mail。
文章目錄
基礎配置
引入依賴
Mail配置文件
實現過程
郵件異步發送
基礎配置
引入依賴
<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-mail/<artifactid>
<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-thymeleaf/<artifactid>
QQ郵箱->設置->賬戶->POP3/SMTP服務:開啟服務後會獲得QQ的授權碼.
Mail配置文件
# JavaMailSender 郵件發送的配置
spring.mail.host: smtp.qq.com
spring.mail.username: 用戶qq郵箱
spring.mail.password: 授權碼
spring.mail.properties.mail.smtp.auth: true
spring.mail.properties.mail.smtp.starttls.enable: true
spring.mail.properties.mail.smtp.starttls.required: true
spring.mail.default-encoding: UTF-8
163郵箱配置
#郵箱服務器地址
spring.mail.host: smtp.***.cn
#用戶名
spring.mail.username: ****@****.cn
#密碼
spring.mail.password: *****
spring.mail.default-encoding: UTF-8
spring.mail.sendTo: *****@qq.com
實現過程
@Component
@Slf4j
public class MailServiceImp implements MailService{
@Autowired
private JavaMailSender mailSender;
@Override
public void sendSimpleMail(String from,String to, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(to);
message.setSubject(subject);
message.setText(content);
try {
mailSender.send(message);
} catch (Exception e) {
log.error(e.getMessage(),e);
}
}
/**
* 發送html郵件
* @param to
* @param subject
* @param content
*/
@Override
public void sendHtmlMail(String from,String to, String subject, String content) {
MimeMessage message = mailSender.createMimeMessage();
try {
//true表示需要創建一個multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
mailSender.send(message);
log.info("html郵件發送成功");
} catch (MessagingException e) {
log.error("發送html郵件時發生異常!", e);
}
}
/**
* 發送帶附件的郵件
* @param to
* @param subject
* @param content
* @param filePath
*/
public void sendAttachmentsMail(String from,String to, String subject, String content, String filePath){
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
helper.addAttachment(fileName, file);
//helper.addAttachment("test"+fileName, file);
mailSender.send(message);
log.info("帶附件的郵件已經發送。");
} catch (MessagingException e) {
log.error("發送帶附件的郵件時發生異常!", e);
}
}
/**
* 發送正文中有靜態資源(圖片)的郵件
* @param to
* @param subject
* @param content
* @param rscPath
* @param rscId
*/
public void sendInlineResourceMail(String from,String to, String subject, String content, String rscPath, String rscId){
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
FileSystemResource res = new FileSystemResource(new File(rscPath));
helper.addInline(rscId, res);
mailSender.send(message);
log.info("嵌入靜態資源的郵件已經發送。");
} catch (MessagingException e) {
log.error("發送嵌入靜態資源的郵件時發生異常!", e);
}
}
}
在resorces/templates下創建MailTemplate.html.html
<title>Title/<title>
您好,這是驗證郵件,請點擊下面的鏈接完成驗證,
發送郵件
@RestController
public class MainController {
@Autowired
private MailService mailService;
@Autowired
private TemplateEngine templateEngine;
@Value("${spring.mail.username}")
private String from;
@Value("${spring.mail.sendTo}")
private String sendTo;
@RequestMapping("/send")
public String send(){
sendSimpleMail();
return "success";
}
public void sendSimpleMail(){
mailService.sendSimpleMail(from,sendTo,"這是一封測試郵件!","這是一封測試郵件!");
}
public void sendHtmlMail() throws Exception {
String content="\\n" +
"
\\n" +"
hello world ! 這是一封html郵件!
\\n" +"\\n" +
"";
mailService.sendHtmlMail(from,sendTo,"test simple mail",content);
}
public void sendAttachmentsMail() {
String filePath="e:\\\\tmp\\\\application.log";
mailService.sendAttachmentsMail(from,sendTo, "主題:帶附件的郵件", "有附件,請查收!", filePath);
}
public void sendInlineResourceMail() {
String rscId = "neo006";
String content="
這是有圖片的郵件:";String imgPath = "C:\\\\Users\\\\summer\\\\Pictures\\\\favicon.png";
mailService.sendInlineResourceMail(from,sendTo,"主題:這是有圖片的郵件", content, imgPath, rscId);
}
public void sendTemplateMail() {
//創建郵件正文
Context context = new Context();
context.setVariable("id", "006");
String emailContent = templateEngine.process("MailTemplate", context);
mailService.sendHtmlMail(from,sendTo,"主題:這是模板郵件",emailContent);
}
}
郵件異步發送很多時候郵件發送並不是我們主業務必須關注的結果,比如通知類、提醒類的業務可以允許延時或者失敗。這個時候可以採用異步的方式來發送郵件,加快主交易執行速度,在實際項目中可以採用MQ發送郵件相關參數,監聽到消息隊列之後啟動發送郵件
閱讀更多 硇洲島主 的文章