SpringBoot郵件傳送通知或郵件群發通知
阿新 • • 發佈:2021-02-06
技術標籤:SpringBootjava
SpringBoot郵件傳送通知或郵件群發通知
友情提醒:需要同時傳送給多人的時間會長一些,可以給程式碼做時間優化,也可以使用原生的mail jar包,下面給上依賴,下面兩個任選其一就可以
<!-- 郵件傳送 -->
<!-- 郵件通知原生 -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</dependency>
<!-- 時間會久一點 -->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-mail</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
</dependency>
直接上程式碼,需要的引數也都很詳細的標註出來了,直接postman測試就可以
/**
* @param sendMail 傳送人郵箱
* @param authorizationCode 授權碼
* @param takeMails 收件人郵箱
* */
@ApiOperation("測試傳送郵件")
@GetMapping("/sendMail")
public CommonResultPojo sendMail (@Param("sendMail")String sendMail,@Param("authorizationCode")String authorizationCode,
@Param("takeMail")String[] takeMails) throws Exception {
Properties prop = new Properties();
prop.setProperty("mail.host", "smtp.qq.com"); //todo 設定QQ郵件伺服器
prop.setProperty("mail.transport.protocol", "smtp"); //todo 郵件傳送協議
prop.setProperty("mail.smtp.auth", "true"); //todo 需要驗證使用者名稱密碼
//todo QQ郵箱設定SSL加密
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
//todo 建立定義整個應用程式所需的環境資訊的 Session 物件
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//todo 傳入發件人的姓名和授權碼
return new PasswordAuthentication(sendMail,authorizationCode);
}
});
//todo 通過session獲取transport物件
Transport transport = session.getTransport();
//todo 通過transport物件郵箱使用者名稱和授權碼連線郵箱伺服器
transport.connect("smtp.qq.com",sendMail,authorizationCode);
//todo 建立郵件,傳入session物件
for(String takeMail:takeMails) {
MimeMessage mimeMessage = complexEmail(session, sendMail, takeMail);
//todo 傳送郵件
transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
}
//todo 關閉連線
transport.close();
return new CommonResultPojo(200,"傳送成功",1);
}
//todo 傳送郵件方法
public static MimeMessage complexEmail(Session session,@Param("sendMail")String sendMail,
@Param("takeMail") String takeMails) throws MessagingException {
//todo 訊息的固定資訊
MimeMessage mimeMessage = new MimeMessage(session);
//todo 發件人
mimeMessage.setFrom(new InternetAddress(sendMail));
//todo 收件人
mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(takeMails));
//todo 郵件標題
mimeMessage.setSubject("帶圖片和附件的郵件");
//todo 準備圖片資料
MimeBodyPart image = new MimeBodyPart();
DataHandler handler = new DataHandler(new FileDataSource("D:\\hello.jpg"));
image.setDataHandler(handler);
image.setContentID("test.png"); //todo 設定圖片id
//todo 準備文字
MimeBodyPart text = new MimeBodyPart();
text.setContent("這是一段文字<img src='cid:test.png'>", "text/html;charset=utf-8");
//todo 附件
MimeBodyPart appendix = new MimeBodyPart();
appendix.setDataHandler(new DataHandler(new FileDataSource("D:\\zzzz.txt")));
appendix.setFileName("test.txt");
//todo 拼裝郵件正文
MimeMultipart mimeMultipart = new MimeMultipart();
mimeMultipart.addBodyPart(image);
mimeMultipart.addBodyPart(text);
mimeMultipart.setSubType("related"); //todo 文字和圖片內嵌成功
//todo 將拼裝好的正文內容設定為主體
MimeBodyPart contentText = new MimeBodyPart();
contentText.setContent(mimeMultipart);
//todo 拼接附件
MimeMultipart allFile = new MimeMultipart();
allFile.addBodyPart(appendix); //todo 附件
allFile.addBodyPart(contentText); //todo 正文
allFile.setSubType("mixed"); //todo 正文和附件都存在郵件中,所有型別設定為mixed
//todo 放到Message訊息中
mimeMessage.setContent(allFile);
mimeMessage.saveChanges(); //todo 儲存修改
if(mimeMessage !=null){
System.out.println("郵件傳送成功!!");
}else {
System.out.println("郵件傳送失敗!!");
}
return mimeMessage;
}
同時發給多人結果如下:
{
"code": 200,
"message": "傳送成功",
"data": 1
}