本文是vhr系列的第十二篇,項目地址https://github.com/lenve/vhr
郵件發送也是一個老生常談的問題了,代碼雖然簡單,但是許多小伙伴對過程不太理解,所以還是打算和各位小伙伴聊聊這個話題。
郵件協議
我們經常會聽到各種各樣的郵件協議,比如SMTP、POP3、IMAP,那麼這些協議有什麼作用,有什麼區別?我們先來討論一下這個問題。
SMTP是一個基於TCP/IP的應用層協議,江湖地位有點類似於HTTP,SMTP服務器默認監聽的端口號為25。看到這裡,小伙伴們可能會想到既然SMTP協議是基於TCP/IP的應用層協議,那麼我是不是也可以通過Socket發送一封郵件呢?回答是肯定的。
生活中我們投遞一封郵件要經過如下幾個步驟:
1.深圳的小王先將郵件投遞到深圳的郵局
2.深圳的郵局將郵件運送到上海的郵局
3.上海的小張來郵局取郵件
這是一個縮減版的生活中郵件發送過程。這三個步驟可以分別對應我們的郵件發送過程,假設從[email protected]發送郵件到[email protected]:
[email protected]先將郵件投遞到騰訊的郵件服務器
2.騰訊的郵件服務器將我們的郵件投遞到網易的郵件服務器
[email protected]登錄網易的郵件服務器查看郵件
郵件投遞大致就是這個過程,這個過程就涉及到了多個協議,我們來分別看一下。
SMTP協議全稱為Simple Mail Transfer Protocol,譯作簡單郵件傳輸協議,它定義了郵件客戶端軟件於SMTP服務器之間,以及SMTP服務器與SMTP服務器之間的通信規則。也就是說[email protected]用戶先將郵件投遞到騰訊的SMTP服務器這個過程就使用了SMTP協議,然後騰訊的SMTP服務器將郵件投遞到網易的SMTP服務器這個過程也依然使用了SMTP協議,SMTP服務器就是用來收郵件。而POP3協議全稱為Post Office Protocol,譯作郵局協議,它定義了郵件客戶端與POP3服務器之間的通信規則,那麼該協議在什麼場景下會用到呢?當郵件到達網易的SMTP服務器之後,[email protected]用戶需要登錄服務器查看郵件,這個時候就該協議就用上了:郵件服務商都會為每一個用戶提供專門的郵件存儲空間,SMTP服務器收到郵件之後,就將郵件保存到相應用戶的郵件存儲空間中,如果用戶要讀取郵件,就需要通過郵件服務商的POP3郵件服務器來完成。最後,可能也有小伙伴們聽說過IMAP協議,這個協議是對POP3協議的擴展,功能更強,作用類似,這裡不再贅述。
發送QQ郵件準備工作
首先我們需要先登錄QQ郵箱網頁版,點擊上方的設置按鈕:
然後點擊賬戶選項卡:
在賬戶選項卡中找到開啟POP3/SMTP選項,如下:
點擊開啟,開啟相關功能,開啟過程需要手機號碼驗證,按照步驟操作即可,不贅述。開啟成功之後,即可獲取一個授權碼,將該號碼保存好,一會使用。
然後我們需要JavaxMail這個jar包,小伙伴可以直接去Maven中央倉庫下載,這裡不再贅述。
發送
簡單郵件
如果我們只發送一個簡單的文本,發送方式就比較簡單,整個過程可以分為三步如下:
第一步:構造SMTP郵件服務器的基本環境
Properties properties = new Properties();properties.setProperty("mail.host", "smtp.qq.com");properties.setProperty("mail.transport.protocol", "smtp");properties.setProperty("mail.smtp.auth", "true");properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");properties.setProperty("mail.smtp.port", "465");Session session = Session.getDefaultInstance(properties);session.setDebug(true);第二步:構造郵件
MimeMessage mimeMessage = new MimeMessage(session);mimeMessage.addRecipients(Message.RecipientType.TO, "[email protected]");//設置收信人mimeMessage.addRecipients(Message.RecipientType.CC, "[email protected]");//抄送mimeMessage.setFrom("[email protected]");//郵件發送人mimeMessage.setSubject("測試郵件主題");//郵件主題mimeMessage.setContent("Hello,這是一封測試郵件", "text/html;charset=utf-8");//正文
第三步:發送郵件
Transport transport = session.getTransport();transport.connect("smtp.qq.com", "[email protected]", "剛剛申請到的授權碼");transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());//發送郵件,第二個參數為收件人transport.close();複雜郵件
發送複雜郵件,第一步和第三步也是一樣的,只有第二步構造郵件的過程比較麻煩,那麼接下來給小伙伴們演示一個發送一封圖文+兩個附件的郵件。要發送複雜郵件,得先熟悉三個概念,如下:
1.MimeMessage:該類是個能理解MIME類型和頭的電子郵件消息
2.MimeMultipart:該類定義了增加、刪除以及獲取郵件不同部分內容的方法
3.MimeBodyPart:該對象代表一個MimeMessage對象內容的一部分。每個MimeBodyPart被認為有兩部分:MIME類型和匹配這個類型的內容
完整的郵件生成過程如下(第一步和第三步參考上文):
MimeMessage mimeMessage = new MimeMessage(session);mimeMessage.addRecipients(Message.RecipientType.TO, "[email protected]");//設置收信人mimeMessage.addRecipients(Message.RecipientType.CC, "[email protected]");//抄送mimeMessage.setFrom("[email protected]");//郵件發送人mimeMessage.setSubject("測試郵件主題");//郵件主題MimeMultipart mixed = new MimeMultipart("mixed");mimeMessage.setContent(mixed);//設置整封郵件的MIME消息體為混合的組合關係MimeBodyPart attach1 = new MimeBodyPart();//創建附件1MimeBodyPart attach2 = new MimeBodyPart();//創建附件2MimeBodyPart content = new MimeBodyPart();//創建郵件正文mixed.addBodyPart(attach1);//將附件一添加到MIME消息體中mixed.addBodyPart(attach2);//將附件二添加到MIME消息體中mixed.addBodyPart(content);//將正文添加到消息體中FileDataSource fds1 = new FileDataSource(new File("C://Users//sang//Desktop//1.png"));//構造附件一的數據源DataHandler dh1 = new DataHandler(fds1);//數據處理attach1.setDataHandler(dh1);//設置附件一的數據源attach1.setFileName("1.png");//設置附件一的文件名//附件二的操作與附件一類似,這裡就不一一註釋了FileDataSource fds2 = new FileDataSource(new File("C://Users//sang//Desktop//博客筆記.xlsx"));DataHandler dh2 = new DataHandler(fds2);attach2.setDataHandler(dh2);attach2.setFileName(MimeUtility.encodeText("博客筆記.xlsx"));//設置文件名時,如果有中文,可以通過MimeUtility類中的encodeText方法進行編碼,避免亂碼MimeMultipart bodyMimeMultipart = new MimeMultipart("related");//設置正文的MIME類型content.setContent(bodyMimeMultipart);//將bodyMimeMultipart添加到正文消息體中MimeBodyPart bodyPart = new MimeBodyPart();//正文的HTML部分bodyPart.setContent("<h1>Hello大家好,這是一封測試郵件<img src='cid:2.png'/></h1>","text/html;charset=utf-8");MimeBodyPart picPart = new MimeBodyPart();//正文的圖片部分DataHandler dataHandler = new DataHandler(new FileDataSource("C://Users//sang//Desktop//2.png"));picPart.setDataHandler(dataHandler);picPart.setContentID("2.png");//將正文的HTML和圖片部分分別添加到bodyMimeMultipart中bodyMimeMultipart.addBodyPart(bodyPart);bodyMimeMultipart.addBodyPart(picPart);mimeMessage.saveChanges();
OK,Java Mail發送QQ郵件就是這麼簡單,至於其他的如163,sina等,寫法類似,這裡我就不贅述了。
總結
以上所述是小編給大家介紹的SpringBoot中發送QQ郵件功能的實現代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!