最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot實(shí)現(xiàn)發(fā)送郵件功能

 更新時(shí)間:2019年12月10日 11:15:13   作者:經(jīng)典雞翅  
這篇文章主要介紹了SpringBoot 發(fā)送郵件功能實(shí)現(xiàn),本文以163郵箱為例通過這個(gè)小案例給大家介紹,需要的朋友可以參考下

背景

有個(gè)小伙伴問我你以前發(fā)郵件功能怎么弄的。然后我就給他找了個(gè)demo,正好在此也寫一下,分享給大家。

理清痛點(diǎn)

發(fā)送郵件,大家可以想一下,坑的地方在哪?
我覺得是三個(gè)吧。
第一:郵件白名單問題。
第二:郵件超時(shí)問題。
第三:郵件帶附件問題。
我下面的demo都會(huì)介紹這些問題及解決。

實(shí)現(xiàn)方案

準(zhǔn)備工作

我們先要準(zhǔn)備一個(gè)可以發(fā)送的郵箱,我這里以我的163郵箱為例,現(xiàn)在發(fā)送郵件的規(guī)則,要求你輸入一種叫做授權(quán)碼的東西,注意這個(gè)東西不是密碼。
獲取授權(quán)碼的步驟:





當(dāng)選擇開啟,通過驗(yàn)證之后就可以獲取到驗(yàn)證碼。選擇重置驗(yàn)證碼也可以獲取。以前17年的時(shí)候就寫過一個(gè)demo,現(xiàn)在19年又開了一個(gè),因?yàn)橐郧暗耐恕?/p>

SpringBoot項(xiàng)目引入郵件包

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

yml配置郵件相關(guān)

spring:
 mail:
 # 郵件服務(wù)地址
 host: smtp.163.com
 # 端口,可不寫默認(rèn)
 port: 25
 # 編碼格式
 default-encoding: utf-8
 # 用戶名
 username: xxx@163.com
 # 授權(quán)碼,就是我們剛才準(zhǔn)備工作獲取的代碼
 password: xxx
 # 其它參數(shù)
 properties:
  mail:
  smtp:
   # 如果是用 SSL 方式,需要配置如下屬性,使用qq郵箱的話需要開啟
   ssl:
   enable: true
   required: true
   # 郵件接收時(shí)間的限制,單位毫秒
   timeout: 10000
   # 連接時(shí)間的限制,單位毫秒
   connectiontimeout: 10000
   # 郵件發(fā)送時(shí)間的限制,單位毫秒
   writetimeout: 10000

針對(duì)于上面提的超時(shí)問題,捕獲超時(shí)異常就可解決。

郵件發(fā)送工具類

主要通過以下工具類就可以滿足發(fā)送java郵件的需要。當(dāng)我們進(jìn)行好 yml 配置后,SpringBoot會(huì)幫助我們自動(dòng)配置 JavaMailSender 我們通過這個(gè)java類就可以實(shí)現(xiàn)操作java來發(fā)送郵件。以下列舉了幾種常用的郵件。

@Service
public class MailService {
 private static final Logger logger = LoggerFactory.getLogger(MailServiceImpl.class);

 @Autowired
 private JavaMailSender mailSender;

 private static final String SENDER = "xxx@163.com";

 /**
  * 發(fā)送普通郵件
  *
  * @param to  收件人
  * @param subject 主題
  * @param content 內(nèi)容
  */
 @Override
 public void sendSimpleMailMessge(String to, String subject, String content) {
  SimpleMailMessage message = new SimpleMailMessage();
  message.setFrom(SENDER);
  message.setTo(to);
  message.setSubject(subject);
  message.setText(content);
  try {
   mailSender.send(message);
  } catch (Exception e) {
   logger.error("發(fā)送簡(jiǎn)單郵件時(shí)發(fā)生異常!", e);
  }
 }

 /**
  * 發(fā)送 HTML 郵件
  *
  * @param to  收件人
  * @param subject 主題
  * @param content 內(nèi)容
  */
 @Override
 public void sendMimeMessge(String to, String subject, String content) {
  MimeMessage message = mailSender.createMimeMessage();
  try {
   //true表示需要?jiǎng)?chuàng)建一個(gè)multipart message
   MimeMessageHelper helper = new MimeMessageHelper(message, true);
   helper.setFrom(SENDER);
   helper.setTo(to);
   helper.setSubject(subject);
   helper.setText(content, true);
   mailSender.send(message);
  } catch (MessagingException e) {
   logger.error("發(fā)送MimeMessge時(shí)發(fā)生異常!", e);
  }
 }

 /**
  * 發(fā)送帶附件的郵件
  *
  * @param to  收件人
  * @param subject 主題
  * @param content 內(nèi)容
  * @param filePath 附件路徑
  */
 @Override
 public void sendMimeMessge(String to, String subject, String content, String filePath) {
  MimeMessage message = mailSender.createMimeMessage();
  try {
   //true表示需要?jiǎng)?chuàng)建一個(gè)multipart message
   MimeMessageHelper helper = new MimeMessageHelper(message, true);
   helper.setFrom(SENDER);
   helper.setTo(to);
   helper.setSubject(subject);
   helper.setText(content, true);

   FileSystemResource file = new FileSystemResource(new File(filePath));
   String fileName = file.getFilename();
   helper.addAttachment(fileName, file);

   mailSender.send(message);
  } catch (MessagingException e) {
   logger.error("發(fā)送帶附件的MimeMessge時(shí)發(fā)生異常!", e);
  }
 }

 /**
  * 發(fā)送帶靜態(tài)文件的郵件
  *
  * @param to  收件人
  * @param subject 主題
  * @param content 內(nèi)容
  * @param rscIdMap 需要替換的靜態(tài)文件
  */
 @Override
 public void sendMimeMessge(String to, String subject, String content, Map<String, String> rscIdMap) {
  MimeMessage message = mailSender.createMimeMessage();
  try {
   //true表示需要?jiǎng)?chuàng)建一個(gè)multipart message
   MimeMessageHelper helper = new MimeMessageHelper(message, true);
   helper.setFrom(SENDER);
   helper.setTo(to);
   helper.setSubject(subject);
   helper.setText(content, true);

   for (Map.Entry<String, String> entry : rscIdMap.entrySet()) {
    FileSystemResource file = new FileSystemResource(new File(entry.getValue()));
    helper.addInline(entry.getKey(), file);
   }
   mailSender.send(message);
  } catch (MessagingException e) {
   logger.error("發(fā)送帶靜態(tài)文件的MimeMessge時(shí)發(fā)生異常!", e);
  }
 }
}

發(fā)送郵件的demo

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbooEmailDemoApplicationTests {

 @Autowired
 private MailService mailService;

 private static final String TO = "xxx@qq.com";
 private static final String SUBJECT = "測(cè)試郵件";
 private static final String CONTENT = "test content";

 /**
  * 測(cè)試發(fā)送普通郵件
  */
 @Test
 public void sendSimpleMailMessage() {
  mailService.sendSimpleMailMessge(TO, SUBJECT, CONTENT);
 }

 /**
  * 測(cè)試發(fā)送html郵件
  */
 @Test
 public void sendHtmlMessage() {
  String htmlStr = "<h1>Test</h1>";
  mailService.sendMimeMessge(TO, SUBJECT, htmlStr);
 }

 /**
  * 測(cè)試發(fā)送帶附件的郵件
  * @throws FileNotFoundException
  */
 @Test
 public void sendAttachmentMessage() throws FileNotFoundException {
  File file = ResourceUtils.getFile("classpath:test.txt");
  String filePath = file.getAbsolutePath();
  mailService.sendMimeMessge(TO, SUBJECT, CONTENT, filePath);
 }

 /**
  * 測(cè)試發(fā)送帶附件的郵件
  * @throws FileNotFoundException
  */
 @Test
 public void sendPicMessage() throws FileNotFoundException {
  String htmlStr = "<html><body>測(cè)試:圖片1 <br> <img src=\'cid:pic1\'/> <br>圖片2 <br> <img src=\'cid:pic2\'/></body></html>";
  Map<String, String> rscIdMap = new HashMap<>(2);
  rscIdMap.put("pic1", ResourceUtils.getFile("classpath:pic01.jpg").getAbsolutePath());
  rscIdMap.put("pic2", ResourceUtils.getFile("classpath:pic02.jpg").getAbsolutePath());
  mailService.sendMimeMessge(TO, SUBJECT, htmlStr, rscIdMap);
 }
}

白名單問題

如果是發(fā)送給固定郵箱,可以直接在固定郵箱里面設(shè)置白名單,如果頻繁的發(fā)送給多個(gè)郵箱,最好設(shè)置以下發(fā)送時(shí)間間隔,不要不斷的給某一個(gè)郵箱發(fā)送。

總結(jié)

以上所述是小編給大家介紹的SpringBoot 發(fā)送郵件功能實(shí)現(xiàn),希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

相關(guān)文章

  • Java HttpServletResponse響應(yīng)實(shí)現(xiàn)過程詳解

    Java HttpServletResponse響應(yīng)實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了Java HttpServletResponse響應(yīng)實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Spring BeanUtils忽略空值拷貝的方法示例代碼

    Spring BeanUtils忽略空值拷貝的方法示例代碼

    本文用示例介紹Spring(SpringBoot)如何使用BeanUtils拷貝對(duì)象屬性忽略空置,忽略null值拷貝屬性的用法,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2022-03-03
  • Java?springBoot初步使用websocket的代碼示例

    Java?springBoot初步使用websocket的代碼示例

    這篇文章主要介紹了Java?springBoot初步使用websocket的相關(guān)資料,WebSocket是一種實(shí)現(xiàn)實(shí)時(shí)雙向通信的協(xié)議,適用于需要實(shí)時(shí)通信的應(yīng)用程序,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • SpringCache常用注解及key中參數(shù)值為null問題解析

    SpringCache常用注解及key中參數(shù)值為null問題解析

    這篇文章主要介紹了SpringCache常用注解及key中參數(shù)值為null的問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • BlockingQueue隊(duì)列處理高并發(fā)下的日志

    BlockingQueue隊(duì)列處理高并發(fā)下的日志

    這篇文章主要介紹了BlockingQueue隊(duì)列處理高并發(fā)下的日志示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • 在SpringBoot項(xiàng)目中利用maven的generate插件

    在SpringBoot項(xiàng)目中利用maven的generate插件

    今天小編就為大家分享一篇關(guān)于在SpringBoot項(xiàng)目中利用maven的generate插件,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • SpringBoot中的yaml語法及靜態(tài)資源訪問問題

    SpringBoot中的yaml語法及靜態(tài)資源訪問問題

    這篇文章主要介紹了SpringBoot中的yaml語法及靜態(tài)資源訪問問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • 使用Java實(shí)現(xiàn)在Excel中創(chuàng)建下拉列表

    使用Java實(shí)現(xiàn)在Excel中創(chuàng)建下拉列表

    下拉列表(下拉框)可以確保用戶僅從預(yù)先給定的選項(xiàng)中進(jìn)行選擇,這樣不僅能減少數(shù)據(jù)輸入錯(cuò)誤,還能節(jié)省時(shí)間提高效率,下面我們就來看看如何在java中利用免費(fèi)庫(kù)實(shí)現(xiàn)創(chuàng)建下拉列表吧
    2024-03-03
  • Java實(shí)現(xiàn)動(dòng)態(tài)IP代理的步驟詳解

    Java實(shí)現(xiàn)動(dòng)態(tài)IP代理的步驟詳解

    在網(wǎng)絡(luò)編程中,動(dòng)態(tài)IP代理可以幫助用戶隱藏真實(shí)IP以及提高數(shù)據(jù)抓取的效率,本文將介紹如何在Java中實(shí)現(xiàn)動(dòng)態(tài)IP代理,包括設(shè)置代理、發(fā)送請(qǐng)求以及處理響應(yīng),需要的朋友可以參考下
    2025-02-02
  • Nacos動(dòng)態(tài)配置管理機(jī)制方式

    Nacos動(dòng)態(tài)配置管理機(jī)制方式

    這篇文章主要介紹了Nacos動(dòng)態(tài)配置管理機(jī)制方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評(píng)論

拉萨市| 惠东县| 泸水县| 辉县市| 垣曲县| 五莲县| 高台县| 武穴市| 福贡县| 仁布县| 揭东县| 射阳县| 湖北省| 嘉鱼县| 成武县| 运城市| 蒲城县| 西贡区| 阳春市| 盱眙县| 宁国市| 平江县| 鄂托克前旗| 江山市| 凤城市| 孟津县| 水富县| 县级市| 任丘市| 漠河县| 南陵县| 南漳县| 资源县| 高邮市| 米林县| 新邵县| 交城县| 旬邑县| 麦盖提县| 盐池县| 苍溪县|