日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

springboot集成邮箱功能

發布時間:2025/3/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springboot集成邮箱功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 寫在前面

我們都知道,如果系統出現預警,或者有一些監控需求,我們可以通過發送短信或者郵件來進行通知,本篇文章呢,我就打算來講解一下SpringBoot的郵件服務。我們都知道發送郵件應該是網站的必備功能之一,什么注冊驗證,忘記密碼或者是給用戶發送營銷信息。以前我們會使用 JavaMail 相關 api 來寫發送郵件的相關代碼,后來 Spring 推出了 JavaMailSender 更加簡化了郵件發送的過程,在之后 Spring Boot 對此進行了封裝就有了現在的 spring-boot-starter-mail,如果你看了我前面的文章的話,就會知道,SpringBoot把大部分的需求封裝成了一個個場景啟動器,而mail也就是相應的場景啟動器。

2. 了解郵件服務

經常出現和郵件相關的協議是SMTP、IMAP和POP3,所以在這里我們首先來認識了解這三個協議。

  • SMTP全稱為Simple Mail Transfer Protocol(簡單郵件傳輸協議),它是一組用于從源地址到目的地址傳輸郵件的規范,通過它來控制郵件的中轉方式。SMTP認證要求必須提供賬號和密碼才能登陸服務器,其設計目的在于避免用戶受到垃圾郵件的侵擾。

  • IMAP全稱為Internet Message Access Protocol(互聯網郵件訪問協議),IMAP允許從郵件服務器上獲取郵件的信息、下載郵件等。IMAP與POP類似,都是一種郵件獲取協議。

  • POP3全稱為Post Office Protocol 3(郵局協議),POP3支持客戶端遠程管理服務器端的郵件。POP3常用于“離線”郵件處理,即允許客戶端下載服務器郵件,然后服務器上的郵件將會被刪除。目前很多POP3的郵件服務器只提供下載郵件功能,服務器本身并不刪除郵件,這種屬于改進版的POP3協議。

  • 那么問題來了,IMAP和POP3協議有什么不同呢?兩者最大的區別在于,IMAP允許雙向通信,即在客戶端的操作會反饋到服務器上,例如在客戶端收取郵件、標記已讀等操作,服務器會跟著同步這些操作。而對于POP協議雖然也允許客戶端下載服務器郵件,但是在客戶端的操作并不會同步到服務器上面的,例如在客戶端收取或標記已讀郵件,服務器不會同步這些操作。

    3. SpringBoot相關類

    SpringBoot中針對郵件服務的兩個工具類是,JavaMailSender和JavaMailSenderImpl,它們是Spring官方提供的集成郵件服務的接口和實現類,以簡單高效的設計著稱,目前是Java后端發送郵件和集成郵件服務的主流工具。那如何通過JavaMailSenderImpl發送郵件?非常簡單,直接在業務類注入JavaMailSenderImpl并調用send方法發送郵件。其中簡單郵件可以通過SimpleMailMessage來發送郵件,而復雜的郵件(例如添加附件)可以借助MimeMessageHelper來構建MimeMessage發送郵件。

    我們不難理解,SpringBoot對于郵件服務能做到開箱即用,其實就是基于官方內置的自動配置,翻看源碼可知曉郵件自動配置類(MailSenderPropertiesConfiguration) 為上下文提供了郵件服務實例(JavaMailSenderImpl)。

    4. 具體教程

    4.1、pom配置

    首先我們創建一個新的項目,只要包含最基本的web場景就可以了,然后我們在pom.xml中引入依賴就可以了,依賴如下:

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

    接著,我們在application.properties主配置文件中對mail進行相關的配置,配置內容如下,我做了相關注釋

    spring.mail.host=smtp.163.com spring.mail.username=amazing spring.mail.password=xxxxxx #這里填的不是賬號密碼,是的第三方登錄校驗碼 spring.mail.default-encoding=UTF-8 mail.fromMail.address=amazing@163.com

    上面的郵箱服務器的地址,我這里放出一下常用有限發郵箱服務器地址

    QQ郵箱(mail.qq.com): POP3服務器地址:pop.qq.com(端口:110) SMTP服務器地址:smtp.qq.com(端口:25) SMTP服務器需要身份驗證。網易郵箱(163.com): POP3服務器地址:pop.163.com(端口:110) SMTP服務器地址:smtp.163.com(端口:25)谷歌郵箱(google.com): POP3服務器地址:pop.gmail.com(SSL啟用端口:995) SMTP服務器地址:smtp.gmail.com(SSL啟用端口:587)阿里云郵箱(mail.aliyun.com): POP3服務器地址:pop3.aliyun.com(SSL加密端口:995;非加密端口:110) SMTP服務器地址:smtp.aliyun.com(SSL加密端口:465;非加密端口:25) IMAP服務器地址:imap.aliyun.com(SSL加密端口:993;非加密端口:143)新浪郵箱(sina.com): POP3服務器地址:pop3.sina.com.cn(端口:110) SMTP服務器地址:smtp.sina.com.cn(端口:25)

    4.2、簡單使用
    這樣就完成了我們SpringBoot使用郵件服務的基本配置,那么接下來我們簡單使用一下,首先編寫Service,目錄結構如下

    public interface MailService {public void sendSimpleMail(String to, String subject, String content); }@Component public class MailServiceImpl implements MailService{private final Logger logger = LoggerFactory.getLogger(this.getClass());@Autowiredprivate JavaMailSender mailSender;@Value("${mail.fromMail.addr}")private String from;@Overridepublic void sendSimpleMail(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);logger.info("簡單郵件已經發送。");} catch (Exception e) {logger.error("發送簡單郵件時發生異常!", e);}} }

    編寫 test 類進行測試,至此一個簡單的文本發送就完成了。

    4.3、豐富郵件內容
    但是在正常使用的過程中,我們通常在郵件中加入圖片或者附件來豐富郵件的內容,下面講介紹如何使用 Spring Boot 來發送豐富的郵件。

    發送 html 格式郵件
    其它都不變在 MailService 添加 sendHtmlMail 方法

    public void sendHtmlMail(String to, String subject, String content) {MimeMessage message = mailSender.createMimeMessage();try {//true表示需要創建一個multipart messageMimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true);mailSender.send(message);logger.info("html郵件發送成功");} catch (MessagingException e) {logger.error("發送html郵件時發生異常!", e);} }

    在測試類中構建 html 內容,測試發送

    @Test public void testHtmlMail() throws Exception {String content="<html>\n" +"<body>\n" +" <h3>hello world ! 這是一封Html郵件!</h3>\n" +"</body>\n" +"</html>";MailService.sendHtmlMail("xxxxxx@163.com","test simple mail",content); }

    發送帶附件的郵件
    還是老樣子,在 MailService 添加 sendAttachmentsMail 方法。

    public void sendAttachmentsMail(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);mailSender.send(message);logger.info("帶附件的郵件已經發送。");} catch (MessagingException e) {logger.error("發送帶附件的郵件時發生異常!", e);} }

    添加多個附件可以使用多條 helper.addAttachment(fileName, file),然后在測試類中添加測試方法

    @Test public void sendAttachmentsMail() {String filePath="e:\\tmp\\application.log";mailService.sendAttachmentsMail("xxxxx@163.com", "主題:帶附件的郵件", "有附件,請查收!", filePath); }

    發送帶靜態資源的郵件
    郵件中的靜態資源一般就是指圖片,在 MailService 添加 sendAttachmentsMail 方法。

    public void sendInlineResourceMail(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);logger.info("嵌入靜態資源的郵件已經發送。");} catch (MessagingException e) {logger.error("發送嵌入靜態資源的郵件時發生異常!", e);} }

    在測試類中添加測試方法

    @Test public void sendInlineResourceMail() {String rscId = "neo006";String content="<html><body>這是有圖片的郵件:<img src=\'cid:" + rscId + "\' ></body></html>";String imgPath = "C:\\Users\\summer\\Pictures\\favicon.png";mailService.sendInlineResourceMail("XXXXX@163.com", "主題:這是有圖片的郵件", content, imgPath, rscId); }

    添加多個圖片可以使用多條 <img src='cid:" + rscId + "' > 和 helper.addInline(rscId, res)來實現

    4.5、總結步驟

  • 郵件發送需要引入spring-boot-start-mail
  • SpringBoot自動配置MailSenderAutoConfiguration
  • 定義MailProperties內容,配置在application.yml(propeties也可以)中
  • 自動裝配JavaMailSender
  • 參考文章

    5.郵件系統

    上面發送郵件的基礎服務就這些了,但是如果我們要做成一個郵件系統的話還需要考慮以下幾個問題,首先是郵件模板的問題,我們會經常收到類似這樣的郵件

    其中只有 neo 這個用戶名在變化,其它郵件內容均不變,如果每次發送郵件都需要手動拼接的話會不夠優雅,并且每次模板的修改都需要改動代碼的話也很不方便,因此對于這類郵件需求,都建議做成郵件模板來處理。模板的本質很簡單,就是在模板中替換變化的參數,轉換為 html 字符串即可,這里以thymeleaf為例來演示,第一步當然是導入thymeleaf的包啦。

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

    然后在在 resorces/templates 下創建 emailTemplate.html

    <!DOCTYPE html> <html lang="zh" xmlns:th="http://www.thymeleaf.org"><head><meta charset="UTF-8"/><title>Title</title></head><body>您好,這是驗證郵件,請點擊下面的鏈接完成驗證,<br/><a href="#" th:href="@{ http://www.xxx.com/neo/{id}(id=${id}) }">激活賬號</a></body> </html> @Test public void sendTemplateMail() {//創建郵件正文Context context = new Context();context.setVariable("id", "006");String emailContent = templateEngine.process("emailTemplate", context);mailService.sendHtmlMail("ityouknow@126.com","主題:這是模板郵件",emailContent); }

    當然啦,這里要強調一點的是,我們在實現郵箱服務的時候,因為各種原因,總會有郵件發送失敗的情況,比如:郵件發送過于頻繁、網絡異常等。在出現這種情況的時候,我們一般會考慮重新重試發送郵件,會分為以下幾個步驟來實現:

  • 接收到發送郵件請求,首先記錄請求并且入庫。
  • 調用郵件發送接口發送郵件,并且將發送結果記錄入庫。
  • 啟動定時系統掃描時間段內,未發送成功并且重試次數小于3次的郵件,進行再次發送
  • 最后
    很多時候郵件發送并不是我們主業務必須關注的結果,比如通知類、提醒類的業務可以允許延時或者失敗。這個時候可以采用異步的方式(線程)來發送郵件,加快主交易執行速度,在實際項目中可以采用MQ發送郵件相關參數,監聽到消息隊列之后啟動發送郵件。

    文章轉自

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的springboot集成邮箱功能的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。