其實想寫JavaMail這一系列的博客已經有一個月之久了,緣起是某次亂逛傳智播客官網瀏覽到相關的視頻教程,想起大學時代學過的電腦網路提到郵件相關的協議,但遺憾的是到目前為止還沒有接觸電腦網路編程,尤其搞Java EE開發之後,底層的網路細節都已經封裝好了,並沒有接觸多少底層的細節,一直以來以為只... ...
序
其實想寫JavaMail這一系列的博客已經有一個月之久了,緣起是某次亂逛傳智播客官網瀏覽到相關的視頻教程,想起大學時代學過的電腦網路提到郵件相關的協議,但遺憾的是到目前為止還沒有接觸電腦網路編程,尤其搞Java EE開發之後,底層的網路細節都已經封裝好了,並沒有接觸多少底層的細節,一直以來以為只要與網路協議相關的編程都是C/C++家族特有的功能。看了張孝祥老師的視頻之後,發現C/C++能幹的事,Java也能幹出來,並且一下子就對郵件開發有點興趣起來。當然看了視頻之後還只是懵懵懂懂不能理解透徹,畢竟很有很多細節值得下去咀嚼。於是又買了張孝祥老師的《Java郵件開發詳解》來,這才對JavaMail理解明朗起來。
在這感謝張孝祥老師,老師雖然已經辭世,但其技術書籍卻普惠了後來人。本系列教程知識點提煉自張孝祥老師的JavaMail視頻教程和《Java郵件開發詳解》書籍,以及來自JavaMail官方的API文檔,是對上訴系列文檔的歸納、升華和總結。本系列博客適合剛學完了Java SE的初學者,和正在學習電腦網路編程的在校生,以及已經有工作經驗的Java EE開發提供JavaMail方面的參考資料。
本系列博客教程內容大致分為:郵件協議相關協議講解,JavaMail郵件的發送,電子郵件的組織結構,使用JavaMail生成複雜結構的電子郵件,郵件的接收和解析等。並最總能夠向好友發送一封複雜郵件,這封郵件應該包含附件、超鏈接、HTML格式文本以及內嵌圖片,並且郵件的抄送人,密送人也能夠正常接收到郵件的內容。
基本概念
郵件伺服器
電子郵件的系統抽象簡單概括如下圖:
從圖中可以看出,電子郵件伺服器主要有一下功能:
- 接收用戶投遞的郵件;
- 將用戶投遞進來的郵件轉發給目標郵件伺服器;
- 接收其他郵件伺服器轉發來的郵件,並把郵件存儲到其他管理的用戶郵箱中;
- 為前來讀取郵件的用戶提供讀取服務。
SMTP協議
如果按照相見的傳輸方向分類,那麼郵件協議大概分為兩種:SMTP協議和POP3/IMAP協議。前者主要是推送郵件,後者主要是把郵件從伺服器上拉到本地來。
SMTP的全稱是Simple Mail Transfer Protocol,簡單郵件傳輸協議,它定義了伺服器與伺服器之間,已經伺服器與客戶端之間的通信規則,常用埠號是25。
POP3協議
全程是Post Office Protocol,有據協議,它定義了客戶端與伺服器通信的規則,常用埠號110。
IMAP協議
它全稱為Internet Message Access Protocol,Internet消息訪問協議,它是對POP3協議的一中擴展,也是定義了郵件客戶端與郵件伺服器的通信規則。
用戶代理
用戶代理俗稱就是郵件客戶端,或者可以稱為郵件閱讀器。其作用是方便用戶閱讀、回覆、轉發、保存和撰寫郵件報文。目前流行的郵件客戶端有FoxMail,Outlook,Thunderbird等,由於博主操作系統用的是ubuntu,所以實驗環境是建立在Thunderbird上的。
DNS
DNS與上訴協議在TCP/IP協議族中處於位置:應用層。DNS是功能變數名稱解析系統,它的作用是將功能變數名稱映射成ip地址,將功能變數名稱轉換為IP地址這一過程我們稱之為功能變數名稱解析,除此之外DNS還有功能變數名稱反向解析的作用。
DNS的解析過程有點複雜,這裡不打算詳解介紹,DNS為什麼要與郵件開發想關聯起來?那是因為SMTP協議既與客戶端通信,又與伺服器通信,伺服器判斷發送過來的郵件是通過郵件客戶端(用戶代理)過來的還是某台SMTP伺服器發送過來的,是通過判斷其電腦名稱是否是註冊在DNS系統中的電腦名稱。
如果你看到這裡已經感覺雲里霧裡,或是嫌棄介紹的概念太過簡單粗糙。彆著急,下麵的篇章將從實際動手為出發點,帶你走近JavaMail開發的殿堂。