直接引入整合后的官方依賴
一、Springboot整合mail
配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
以QQ郵箱為例,開啟授權(quán)碼,粘貼到配置文件中的password項(xiàng)

https://mail.qq.com/
application.yml配置
spring:
mail:
#smtp服務(wù)主機(jī) qq郵箱則為smtp.qq.com、smtp.163.com
host: smtp.qq.com
#服務(wù)協(xié)議
protocol: smtp
# 編碼集
default-encoding: UTF-8
#發(fā)送者郵件的賬戶
username: 599999999@qq.com
#發(fā)送者郵箱授權(quán)碼
password: sadfasdggh
test-connection: true
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
controller
package priv.yuey.wheels.emailDemo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import priv.yuey.wheels.commonUtilsDemo.ResponseData;
import priv.yuey.wheels.emailDemo.SimpleEmailEntity;
import priv.yuey.wheels.emailDemo.service.EmailService;
/**
* @Author yue
* @Date 2022-01-02
* @Version V1.0.1
* @Description 郵箱服務(wù)接口
*/
@RestController
@RequestMapping("email")
public class EmailController {
@Autowired
private EmailService emailService;
/**
* 發(fā)送文本郵件
*/
@PostMapping("text")
public ResponseData sendTestEmail(@RequestBody SimpleEmailEntity simpleEmailEntity){
return emailService.sendTextMail(simpleEmailEntity);
}
/**
* 發(fā)送html郵件
*/
@PostMapping("html")
public ResponseData sendEmail(@RequestBody SimpleEmailEntity simpleEmailEntity){
return emailService.sendHtmlMail(simpleEmailEntity);
}
/**
* 發(fā)送附件郵件
*/
@PostMapping("attachments")
public ResponseData sendAttachmentsMail(@RequestBody SimpleEmailEntity simpleEmailEntity){
return emailService.sendAttachmentsMail(simpleEmailEntity);
}
}
=================================================================================== 參數(shù)類
=================================================================================== 參數(shù)類
=================================================================================== 參數(shù)類
package priv.yuey.wheels.emailDemo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author yue
* @Date 2022-01-02
* @Version V1.0.1
* @Description
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SimpleEmailEntity {
/**
* 主題
*/
private String subject;
/**
* 主題內(nèi)容
*/
private String text;
/**
* 接收人郵箱列表
*/
private String tos;
// private String[] tos;
/**
* 附件路徑
*/
private String filePath;
}
Service
package priv.yuey.wheels.emailDemo.service;
import org.springframework.mail.SimpleMailMessage;
import priv.yuey.wheels.commonUtilsDemo.ResponseData;
import priv.yuey.wheels.emailDemo.SimpleEmailEntity;
/**
* @Author yue
* @Date 2022-01-02
* @Version V1.0.1
* @Description 郵箱服務(wù)
*/
public interface EmailService {
/**
* 發(fā)送文本郵件
* @param simpleEmailEntity 郵件信息
*/
ResponseData sendTextMail(SimpleEmailEntity simpleEmailEntity);
/**
* 發(fā)送HTML郵件
* @param simpleEmailEntity 郵件信息
*/
ResponseData sendHtmlMail(SimpleEmailEntity simpleEmailEntity);
/**
* 發(fā)送帶附件的郵件
* @param simpleEmailEntity 郵件信息
* @param filePath 附件路徑
*/
ResponseData sendAttachmentsMail(SimpleEmailEntity simpleEmailEntity);
}
=================================================================================== 實(shí)現(xiàn)類
=================================================================================== 實(shí)現(xiàn)類
=================================================================================== 實(shí)現(xiàn)類
package priv.yuey.wheels.emailDemo.service.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import priv.yuey.wheels.commonUtilsDemo.ResponseData;
import priv.yuey.wheels.emailDemo.SimpleEmailEntity;
import priv.yuey.wheels.emailDemo.service.EmailService;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
/**
* @Author yue
* @Date 2022-01-02
* @Version V1.0.1
* @Description 郵箱服務(wù)
*/
@Service
public class EmailServiceImpl implements EmailService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Value("${spring.mail.username}")
private String from;
@Autowired
private JavaMailSender mailSender;
@Override
public ResponseData sendTextMail(SimpleEmailEntity simpleEmailEntity) {
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
//發(fā)件人
simpleMailMessage.setFrom(from);
//收件人
simpleMailMessage.setTo(simpleEmailEntity.getTos());
//郵件主題
simpleMailMessage.setSubject(simpleEmailEntity.getSubject());
//郵件內(nèi)容
simpleMailMessage.setText(simpleEmailEntity.getText());
//發(fā)送郵件
mailSender.send(simpleMailMessage);
return ResponseData.ok("郵件發(fā)送成功");
}
@Override
public ResponseData sendHtmlMail(SimpleEmailEntity simpleEmailEntity) {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper messageHelper;
try {
messageHelper = new MimeMessageHelper(message,true);
messageHelper.setFrom(from);
messageHelper.setTo(simpleEmailEntity.getTos());
message.setSubject(simpleEmailEntity.getSubject());
messageHelper.setText(simpleEmailEntity.getText(),true);
mailSender.send(message);
logger.info("郵件已經(jīng)發(fā)送!");
} catch (MessagingException e) {
logger.error("發(fā)送郵件時(shí)發(fā)生異常:"+e);
return ResponseData.ok("郵件發(fā)送失敗");
}
return ResponseData.ok("郵件發(fā)送成功");
}
@Override
public ResponseData sendAttachmentsMail(SimpleEmailEntity simpleEmailEntity) {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper messageHelper;
String filePath = simpleEmailEntity.getFilePath();
try {
messageHelper = new MimeMessageHelper(message,true);
messageHelper.setFrom(from);
messageHelper.setTo(simpleEmailEntity.getTos());
messageHelper.setSubject(simpleEmailEntity.getSubject());
messageHelper.setText(simpleEmailEntity.getText(),true);
//攜帶附件
File file = new File(filePath);
String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
messageHelper.addAttachment(fileName,file);
mailSender.send(message);
logger.info("郵件加附件發(fā)送成功!");
} catch (MessagingException e) {
logger.error("發(fā)送失?。?+e);
return ResponseData.ok("郵件發(fā)送失敗");
}
return ResponseData.ok("郵件發(fā)送成功");
}
}
后續(xù)邏輯根據(jù)自己業(yè)務(wù)來
例如:郵箱校驗(yàn)用戶(類似于手機(jī)號(hào)校驗(yàn))、定時(shí)任務(wù)郵箱推送xx信息
pom.xml引入maven依賴
<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
具體實(shí)現(xiàn)
調(diào)用過程就不放了,比較簡單
請(qǐng)求數(shù)據(jù)參考:
url:http://localhost:8080/email/sendMixedMail
{
"subject": "測(cè)試主題",
"content": "測(cè)試正文內(nèi)容safds63369",
"tos": "接受郵件的郵箱地址",
"cc": "抄送人,下面代碼暫時(shí)沒添加抄送人,所以這個(gè)值無所謂",
"attachmentsPath": "附件地址,需要就添加,不需要無所謂。例如:D:\em\企業(yè)微信截圖.png"
}
package priv.yuey.wheels.emailDemo.service.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import priv.yuey.wheels.commonUtilsDemo.ResponseData;
import priv.yuey.wheels.emailDemo.SimpleEmailEntity;
import priv.yuey.wheels.emailDemo.service.EmailService;
import java.io.FileOutputStream;
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.*;
/**
* @Author yue
* @Date 2022-01-02
* @Version V1.0.1
* @Description 郵箱服務(wù)
*/
@Service
public class EmailServiceImpl implements EmailService {
private final Logger logger = LoggerFactory.getLogger(EmailService.class);
// @Value("${spring.mail.username}")
private static final String from = "發(fā)送人郵箱@qq.com";
private static final String mailHost = "smtp.qq.com";// 具體郵箱服務(wù)類型來寫,這是qq郵箱的
private static final String mailPassword = "fdsgfdsggf";// 郵箱密碼,參考文章頂部圖片
private static final String mailTransportProtocol = "smtp";
private static final String mailSmtpAuth = "true";// 開啟密碼校驗(yàn),默認(rèn)關(guān)閉的。
@Override
public ResponseData sendTextMail(SimpleEmailEntity simpleEmailEntity) {
try {
Properties properties = emailConfig();
Session session = Session.getInstance(properties);
//2、通過session得到transport對(duì)象
Transport transport = session.getTransport();
//3、使用郵箱的用戶名和密碼連上郵件服務(wù)器,發(fā)送郵件時(shí),發(fā)件人需要提交郵箱的用戶名和密碼給smtp服務(wù)器,用戶名和密碼都通過驗(yàn)證之后才能夠正常發(fā)送郵件給收件人。
transport.connect(mailHost, from, mailPassword);
// 4、創(chuàng)建消息
MimeMessage message = new MimeMessage(session);
//指明郵件的發(fā)件人
message.setFrom(new InternetAddress(from));
//指明郵件的收件人,現(xiàn)在發(fā)件人和收件人是一樣的,那就是自己給自己發(fā)
message.setRecipient(Message.RecipientType.TO, new InternetAddress(simpleEmailEntity.getTos()));
//郵件的標(biāo)題
message.setSubject(simpleEmailEntity.getSubject(),"UTF-8");
//郵件的文本內(nèi)容
message.setContent(simpleEmailEntity.getContent(), "text/html;charset=UTF-8");
//返回創(chuàng)建好的郵件對(duì)象
//5、發(fā)送郵件
transport.sendMessage(message, message.getAllRecipients());
transport.close();
} catch (Exception e) {
logger.error("發(fā)送失敗", e);
}
return ResponseData.ok("郵件發(fā)送成功");
}
@Override
public ResponseData sendAttachmentsMail(SimpleEmailEntity simpleEmailEntity) {
try {
Properties properties = emailConfig();
Session session = Session.getInstance(properties);
//2、通過session得到transport對(duì)象
Transport transport = session.getTransport();
//3、使用郵箱的用戶名和密碼連上郵件服務(wù)器,發(fā)送郵件時(shí),發(fā)件人需要提交郵箱的用戶名和密碼給smtp服務(wù)器,用戶名和密碼都通過驗(yàn)證之后才能夠正常發(fā)送郵件給收件人。
transport.connect(mailHost, from, mailPassword);
// 4、創(chuàng)建消息
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.setRecipient(Message.RecipientType.TO, new InternetAddress(simpleEmailEntity.getTos()));
message.setSubject(simpleEmailEntity.getSubject(),"UTF-8");
//創(chuàng)建郵件正文,為了避免郵件正文中文亂碼問題,需要使用charset=UTF-8指明字符編碼
MimeBodyPart text = new MimeBodyPart();
text.setContent(simpleEmailEntity.getContent(), "text/html;charset=UTF-8");
//創(chuàng)建郵件附件
MimeBodyPart attach = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource(simpleEmailEntity.getAttachmentsPath()));
attach.setDataHandler(dh);
attach.setFileName(MimeUtility.encodeText(dh.getName()));
//創(chuàng)建容器描述數(shù)據(jù)關(guān)系
MimeMultipart mp = new MimeMultipart();
mp.addBodyPart(text);
mp.addBodyPart(attach);
mp.setSubType("mixed");
message.setContent(mp);
message.saveChanges();
//5、發(fā)送郵件
transport.sendMessage(message, message.getAllRecipients());
transport.close();
logger.info("郵件發(fā)送成功,收件人:{}", simpleEmailEntity.getTos());
} catch (Exception e) {
logger.error("發(fā)送附件郵件錯(cuò)誤!", e);
}
return ResponseData.ok("郵件發(fā)送成功");
}
/**
* 生成一封郵件正文帶圖片的郵件
*/
@Override
public ResponseData sendImageMail(SimpleEmailEntity simpleEmailEntity) {
try {
Properties properties = emailConfig();
Session session = Session.getInstance(properties);
Transport transport = session.getTransport();
transport.connect(mailHost, from, mailPassword);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.setRecipient(Message.RecipientType.TO, new InternetAddress(simpleEmailEntity.getTos()));
message.setSubject("帶圖片的郵件","UTF-8");
// 準(zhǔn)備郵件數(shù)據(jù)
// 1、準(zhǔn)備圖片數(shù)據(jù)
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("D:\\em\\企業(yè)微信截圖.png"));
image.setDataHandler(dh);// 將圖片數(shù)據(jù)添加到"節(jié)點(diǎn)"
image.setContentID("cstp");// 這個(gè)編號(hào)可在文本中引用
// 2、準(zhǔn)備郵件正文數(shù)據(jù)
MimeBodyPart text = new MimeBodyPart();
text.setContent("這是一封郵件正文帶圖片<img src='cid:cstp'/></a>的郵件", "text/html;charset=UTF-8");
// 3、描述數(shù)據(jù)關(guān)系
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(image);
mm.setSubType("related");// 關(guān)聯(lián)關(guān)系
message.setContent(mm);
//設(shè)置郵件的發(fā)送時(shí)間,默認(rèn)立即發(fā)送
message.setSentDate(new Date());
message.saveChanges();
//發(fā)送郵件
transport.sendMessage(message, message.getAllRecipients());
transport.close();
} catch (Exception e) {
logger.error("發(fā)送郵件失敗", e);
}
return ResponseData.ok("郵件發(fā)送成功");
}
/**
* 生成一封帶附件和帶圖片的郵件
*/
@Override
public ResponseData sendMixedMail(SimpleEmailEntity simpleEmailEntity) {
try {
Properties properties = emailConfig();
Session session = Session.getInstance(properties);
//2、通過session得到transport對(duì)象
Transport transport = session.getTransport();
//3、使用郵箱的用戶名和密碼連上郵件服務(wù)器,發(fā)送郵件時(shí),發(fā)件人需要提交郵箱的用戶名和密碼給smtp服務(wù)器,用戶名和密碼都通過驗(yàn)證之后才能夠正常發(fā)送郵件給收件人。
transport.connect(mailHost, from, mailPassword);
// 4、創(chuàng)建消息
MimeMessage message = new MimeMessage(session);
//設(shè)置郵件的基本信息
message.setFrom(new InternetAddress(from));
message.setRecipient(Message.RecipientType.TO, new InternetAddress(simpleEmailEntity.getTos()));
message.setSubject("帶附件和帶圖片的的郵件");
// 準(zhǔn)備郵件數(shù)據(jù)
// 1、準(zhǔn)備圖片數(shù)據(jù)
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("D:\\em\\企業(yè)微信截圖.png"));
image.setDataHandler(dh);// 將圖片數(shù)據(jù)添加到"節(jié)點(diǎn)"
image.setContentID("cstp");// 這個(gè)編號(hào)可在文本中引用
// 2、準(zhǔn)備郵件正文數(shù)據(jù)
MimeBodyPart text = new MimeBodyPart();
text.setContent("這是一封郵件正文帶圖片<img src='cid:cstp'/></a>的郵件", "text/html;charset=UTF-8");
//描述關(guān)系:正文和圖片
MimeMultipart mm_text_image = new MimeMultipart();
mm_text_image.addBodyPart(text);
mm_text_image.addBodyPart(image);
mm_text_image.setSubType("related");// 關(guān)聯(lián)關(guān)系
// 講圖片、文本轉(zhuǎn)成普通節(jié)點(diǎn)
MimeBodyPart text_image = new MimeBodyPart();
text_image.setContent(mm_text_image);
//附件1
MimeBodyPart attach1 = new MimeBodyPart();
DataHandler dh2 = new DataHandler(new FileDataSource("D:\\em\\滴滴出行電子發(fā)票及行程報(bào)銷單.zip"));
attach1.setDataHandler(dh2);
attach1.setFileName(MimeUtility.encodeText(dh2.getName()));
//附件2
MimeBodyPart attach2 = new MimeBodyPart();
DataHandler dh3 = new DataHandler(new FileDataSource("D:\\em\\滴滴出行行程報(bào)銷單.pdf"));
attach2.setDataHandler(dh3);
attach2.setFileName(MimeUtility.encodeText(dh3.getName()));
// 10. 大匯總:設(shè)置(文本+圖片)的節(jié)點(diǎn) 和 附件 節(jié)點(diǎn) 的關(guān)系(合成一個(gè)大的混合"節(jié)點(diǎn)" / Multipart )
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text_image);
mm.addBodyPart(attach1); // 如果有多個(gè)附件,可以創(chuàng)建多個(gè)多次添加
mm.addBodyPart(attach2); // 如果有多個(gè)附件,可以創(chuàng)建多個(gè)多次添加
mm.setSubType("mixed"); // 混合關(guān)系
message.setContent(mm);
message.saveChanges();
//5、發(fā)送郵件
transport.sendMessage(message, message.getAllRecipients());
transport.close();
} catch (Exception e) {
logger.error("發(fā)送郵件失敗", e);
}
return ResponseData.ok("發(fā)送成功");
}
/**
* 郵箱基礎(chǔ)配置
*/
public Properties emailConfig() {
Properties prop = new Properties();
prop.setProperty("mail.host", mailHost);
prop.setProperty("mail.transport.protocol", mailTransportProtocol);
prop.setProperty("mail.smtp.auth", mailSmtpAuth);
return prop;
}
}