Springboot中配置Mail和普通mail的實(shí)現(xiàn)方式
一、開通SMTP
SMTP是一種簡(jiǎn)單的郵件傳輸協(xié)議,SMTP只能夠推送郵件,如果想要在郵件服務(wù)器上下拉郵件,可以使用POP3或者IMAP協(xié)議。
自己的郵箱就可以開通SMTP,以QQ郵箱為例(163或者其他郵箱開通大同小異)
1)打開自己的QQ郵箱—【設(shè)置】—【賬戶】—【POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務(wù)】
將這幾個(gè)開啟,如果你沒有開啟的話,開啟后點(diǎn)擊頁(yè)面上的【生成授權(quán)碼】,然后根據(jù)提示(發(fā)送短信)操作就可以。
這里的授權(quán)碼在代碼中要用到,用于發(fā)送郵件時(shí)的密碼,注意這里不是登陸郵箱的密碼,可以生成多個(gè)授權(quán)碼,有這個(gè)授權(quán)碼就可以通過(guò)你的郵箱發(fā)送郵件。
開通完畢
二、springboot中配置mail(spring boot環(huán)境已經(jīng)搭好)
1)application.yml文件如下
spring: mail: #如果是163 就為 smtp.163.com host: smtp.qq.com #剛才開通了SMTP的QQ郵箱 username: 你的QQ郵箱@foxmail.com # 在頁(yè)面生成的授權(quán)碼 password: 授權(quán)碼 default-encoding: utf-8 protocol: smtp # 默認(rèn)端口 port: 25 properties: mail: smtp: # 設(shè)置是否需要認(rèn)證,如果為true,那么用戶名和密碼就必須的, # 如果設(shè)置false,可以不設(shè)置用戶名和密碼,當(dāng)然也得看你的對(duì)接的平臺(tái)是否支持無(wú)密碼進(jìn)行訪問(wèn)的。 auth: true starttls: # STARTTLS[1] 是對(duì)純文本通信協(xié)議的擴(kuò)展。它提供一種方式將純文本連接升級(jí)為加密連接(TLS或SSL),而不是另外使用一個(gè)端口作加密通信。 enable: true required: true #郵件配置(自定義設(shè)置,主要配置了收件人和發(fā)件人,這些可以當(dāng)做發(fā)送郵件的參數(shù)) mail-config: environmental: 郵件測(cè)試 # 發(fā)件人郵箱 from: 發(fā)件人@foxmail.com # 收件人郵箱(抄送人) recipient: - "收件人1的郵箱@foxmail.com" - "收件人2的郵箱@qq.com"
2)maven依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
3)讀取發(fā)件人和收件人配置類
package com.zlc.mail.coonfig; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; /** * @描述 : 郵件配置 * @Author : 追到烏云的盡頭找太陽(yáng) * @Date : 2019/10/18 14:52 **/ @Configuration @ConfigurationProperties(prefix = "mail-config") public class MailConfig { private String environmental; private String from; private String [] recipient = null; public String getFrom() { return from; } public void setFrom(String from) { this.from = from; } public String[] getRecipient() { return recipient; } public void setRecipient(String[] recipient) { this.recipient = recipient; } public String getEnvironmental() { return environmental; } public void setEnvironmental(String environmental) { this.environmental = environmental; } }
4)發(fā)送郵件工具類
package com.zlc.mail.util; import com.zlc.mail.coonfig.MailConfig; 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.Component; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.io.File; /** * @描述 : 郵件工具 * @Author : zlc * @Date : 2019/10/10 16:41 **/ @Component public class MailUtil { private final JavaMailSender mailSender; private final MailConfig mailConfig; public MailUtil(JavaMailSender mailSender , MailConfig mailConfig) { this.mailSender = mailSender; this.mailConfig = mailConfig; } public void sendSimpleMail(String subject, String content) { // new 一個(gè)簡(jiǎn)單郵件消息對(duì)象 SimpleMailMessage message = new SimpleMailMessage(); // 和配置文件中的的username相同,相當(dāng)于發(fā)送方 message.setFrom(mailConfig.getFrom()); // setCc 抄送,setTo 發(fā)送,setBCc密送 message.setCc(mailConfig.getRecipient()); message.setSubject("【類型】:【文本】-【來(lái)源】【" + mailConfig.getEnvironmental() + "】-主題【" + subject + "】"); // 正文 message.setText(content); // 發(fā)送 mailSender.send(message); } public void sendHtmlMail(String subject, String content) { //使用MimeMessage,MIME協(xié)議 MimeMessage message = mailSender.createMimeMessage(); MimeMessageHelper helper; //MimeMessageHelper幫助我們?cè)O(shè)置更豐富的內(nèi)容 try { helper = new MimeMessageHelper(message, true); helper.setFrom(mailConfig.getFrom()); helper.setTo(mailConfig.getRecipient()); helper.setSubject("【類型】:【HTML】【來(lái)源】-【" + mailConfig.getEnvironmental() + "】-主題【" + subject + "】"); //true代表支持html helper.setText(content, true); mailSender.send(message); } catch (MessagingException e) { e.printStackTrace(); // logger.error("發(fā)送HTML郵件失敗:", e); } } public void sendAttachmentMail(String subject, String content, File file) { MimeMessage message = mailSender.createMimeMessage(); MimeMessageHelper helper; try { helper = new MimeMessageHelper(message, true); //true代表支持多組件,如附件,圖片等 helper.setFrom(mailConfig.getFrom()); helper.setTo(mailConfig.getRecipient()); helper.setSubject("【類型】:【附件】-【來(lái)源】-【" + mailConfig.getEnvironmental() + "】-主題【" + subject + "】"); helper.setText(content, true); FileSystemResource file1 = new FileSystemResource(file); String fileName = file1.getFilename(); //添加附件,可多次調(diào)用該方法添加多個(gè)附件 helper.addAttachment(fileName, file1); mailSender.send(message); } catch (MessagingException e) { e.printStackTrace(); } } public void sendInlineResourceMail(String subject, String content, String rscPath, String rscId) { MimeMessage message = mailSender.createMimeMessage(); MimeMessageHelper helper; try { helper = new MimeMessageHelper(message, true); helper.setFrom(mailConfig.getFrom()); helper.setTo(mailConfig.getRecipient()); helper.setSubject("【類型】:【圖片】-【來(lái)源】-【" + mailConfig.getEnvironmental() + "】-主題【" + subject + "】"); helper.setText(content, true); FileSystemResource res = new FileSystemResource(new File(rscPath)); //重復(fù)使用添加多個(gè)圖片 helper.addInline(rscId, res); mailSender.send(message); } catch (MessagingException e) { e.printStackTrace(); } } }
三、普通發(fā)送郵件的類,和是否SpringBoot沒關(guān)系
package com.zlc.mail.javamail; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.*; import java.io.UnsupportedEncodingException; import java.util.Properties; /** * @author : 追到烏云的盡頭找太陽(yáng)-(Jacob) * @date : 2019/10/29 17:51 **/ public class MailUtil { public static void sendImageMail(String subject, String conent, String imagePath ) throws MessagingException { // 郵件配置文件 Properties properties = new Properties(); properties.setProperty("mail.protocol","smtp"); properties.setProperty("mail.host","smtp.qq.com"); properties.setProperty("mail.smtp.auth", "true"); //發(fā)送郵件時(shí)使用的環(huán)境配置 Session session = Session.getInstance(properties); //session.setDebug(true); MimeMessage message = new MimeMessage(session); //設(shè)置郵件的頭 message.setFrom(new InternetAddress("發(fā)件人郵箱地址@foxmail.com")); message.setRecipients(Message.RecipientType.TO, "收件人郵箱@foxmail.com"); message.setSubject("【人臉識(shí)別】-【主題】-【" + subject + "】"); //設(shè)置正文 //搞出文本部分 MimeBodyPart textPart = new MimeBodyPart(); //搞圖片部分 MimeBodyPart imagePart = new MimeBodyPart(); imagePart.setContentID("mm"); //把磁盤上的文件加到part中使用到了JAF框架 try { DataHandler dh = new DataHandler(new FileDataSource(imagePath)); imagePart.setDataHandler(dh); }catch (Exception e){ e.printStackTrace(); conent+="讀取圖片異常,異常信息為:" + e.getMessage(); } textPart.setContent("<h3>內(nèi)容:"+ conent +"<br/><img src='cid:mm'/>", "text/html"); MimeMultipart mp = new MimeMultipart(); mp.addBodyPart(textPart); mp.addBodyPart(imagePart); //有關(guān)系的 mp.setSubType("related"); message.setContent(mp); message.saveChanges(); //發(fā)送郵件 Transport ts = session.getTransport(); //密碼為授權(quán)碼不是郵箱的登錄密碼 ts.connect("開通了smtp的郵箱地址@foxmail.com", "授權(quán)碼"); //對(duì)象,用實(shí)例方法 ts.sendMessage(message, message.getAllRecipients()); } public static void sendEnclosureMail(String subject, String conent ,String imagePath, String filePath) throws MessagingException { Properties props = new Properties(); props.setProperty("mail.protocol", "smtp"); props.setProperty("mail.host", "smtp.qq.com"); props.setProperty("mail.smtp.auth", "true"); Session session = Session.getInstance(props); //發(fā)送郵件時(shí)使用的環(huán)境配置 MimeMessage message = new MimeMessage(session); //設(shè)置郵件的頭 message.setFrom(new InternetAddress("發(fā)件人郵箱地址@foxmail.com")); message.setRecipients(Message.RecipientType.TO, "收件人郵箱地址@foxmail.com"); message.setSubject("【人臉識(shí)別】-【主題】-【" + subject + "】"); //設(shè)置正文 //搞出文本部分 MimeBodyPart textPart = new MimeBodyPart(); MimeBodyPart imagePart = new MimeBodyPart(); DataHandler dh = new DataHandler(new FileDataSource("")); if ("" != imagePath || null != imagePath) { textPart.setContent("圖片<img src='cid:mm'/>", "text/html;charset=UTF-8"); //搞圖片部分 imagePart.setContentID("mm"); //把磁盤上的文件加到part中使用到了JAF框架 dh = new DataHandler(new FileDataSource(imagePath)); imagePart.setDataHandler(dh); } MimeMultipart mp = new MimeMultipart(); mp.addBodyPart(textPart); mp.addBodyPart(imagePart); mp.setSubType("related"); MimeBodyPart textImagePart = new MimeBodyPart(); textImagePart.setContent(mp); //創(chuàng)建附件部分 MimeBodyPart attachmentPart = new MimeBodyPart(); if ("" != filePath || null != filePath){ dh = new DataHandler(new FileDataSource(filePath)); } String filename = dh.getName(); attachmentPart.setDataHandler(dh); //手工設(shè)置文件名 防止亂碼使用 javaMail里的 MimeUtility進(jìn)行編碼 try { attachmentPart.setFileName(MimeUtility.encodeText(filename)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } //最終的 MimeMultipart MimeMultipart finalMp = new MimeMultipart(); finalMp.addBodyPart(attachmentPart); finalMp.addBodyPart(textImagePart); finalMp.setSubType("mixed"); message.setContent(finalMp); message.saveChanges(); //發(fā)送郵件 Transport ts = session.getTransport(); ts.connect("開啟了smtp的郵箱地址@foxmail.com", "授權(quán)碼"); ts.sendMessage(message, message.getAllRecipients()); } }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring中allowedOriginPatterns和allowedOrigins方法有何不同詳解
這篇文章主要給大家介紹了關(guān)于Spring中allowedOriginPatterns和allowedOrigins方法有何不同,allowedOriginPatterns和allowedOrigins都是用來(lái)設(shè)置允許跨域請(qǐng)求的來(lái)源,需要的朋友可以參考下2023-10-10SpringBoot項(xiàng)目中的多數(shù)據(jù)源支持的方法
本篇文章主要介紹了SpringBoot項(xiàng)目中的多數(shù)據(jù)源支持的方法,主要介紹在SpringBoot項(xiàng)目中利用SpringDataJpa技術(shù)如何支持多個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)源,有興趣的可以了解一下2017-10-10SpringBoot validator參數(shù)驗(yàn)證restful自定義錯(cuò)誤碼響應(yīng)方式
這篇文章主要介紹了SpringBoot validator參數(shù)驗(yàn)證restful自定義錯(cuò)誤碼響應(yīng)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10Spring Boot 3.4.0 結(jié)合 Mybatis-plus 實(shí)
本文詳細(xì)介紹了在 Spring Boot 3.4.0 項(xiàng)目中結(jié)合 Mybatis-plus 實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的完整方案,通過(guò)自定義注解和AOP切面,我們可以優(yōu)雅地實(shí)現(xiàn)方法級(jí)別的數(shù)據(jù)源切換,滿足多數(shù)據(jù)源場(chǎng)景下的各種需求,感興趣的朋友一起看看吧2025-04-04Java設(shè)計(jì)模式之Iterator模式介紹
所謂Iterator模式,即是Iterator為不同的容器提供一個(gè)統(tǒng)一的訪問(wèn)方式。本文以java中的容器為例,模擬Iterator的原理。需要的朋友可以參考下2013-07-07