1. 程式人生 > >電子郵件收發原理和JavaMail開發

電子郵件收發原理和JavaMail開發

Java郵件開發介紹

為什麼要學習javamail開發

現在很多WEB應用在開發時都需要整合郵件傳送功能,例如:

  • 給新註冊的使用者自動傳送一封包含其註冊資訊的歡迎E-Mail。
  • 給過生日的註冊會員自動傳送一封表示祝賀的E-Mail。
  • 將網站的最新活動資訊通過E-Mail傳送給所有的註冊會員。
  • 等等…

這些功能的實現都需要軟體開發人員在開發WEB應用中編寫相應的郵件處理程式。

學習目標

學習javamail主要包括兩部分:生成郵件和傳送接收郵件。
學習javamail開發之後的效果:

  • 可以編寫程式程式碼生成一封帶內嵌圖片的郵件。
  • 可以編寫程式生成一封即帶附件又帶圖片的複雜郵件。
  • 可以編寫java郵件傳送程式傳送郵件。
  • 實現類似sina、sohu的web郵件傳送程式。

郵件開發過程中的一些常見問題:

  • 中文名的郵件附件的亂碼問題。
  • Tomcat中JavaMail支援與衝突問題。
  • 如何實現郵件群發。

郵件開發涉及到的一些基本概念

郵件伺服器和電子郵箱

  • 郵件伺服器
    要在Internet上提供電子郵件功能,必須有專門的電子郵件伺服器。例如現在Internet上有很多提供郵件服務的廠商:sina、sohu、163等等他們都有自己的郵件伺服器。
    這些伺服器類似於現實生活中的郵局,它主要負責接收使用者投遞過來的郵件,並把郵件投遞到郵件接收者的電子郵箱中。
  • 電子郵箱
    電子郵箱(E-mail地址)的獲得需要在郵件伺服器上進行申請 ,確切地說,電子郵箱其實就是使用者在郵件伺服器上申請的一個帳戶。使用者在郵件伺服器上申請了一個帳號後,郵件伺服器就會為這個帳號分配一定的空間,使用者從而可以使用這個帳號以及空間,傳送電子郵件和儲存別人傳送過來的電子郵件。

郵件傳輸協議和郵件伺服器型別

  • SMTP協議
    使用者連上郵件伺服器後,要想給它傳送一封電子郵件,需要遵循一定的通迅規則,SMTP協議就是用於定義這種通訊規則的。因而,通常我們也把處理使用者smtp請求(郵件傳送請求)的郵件伺服器稱之為SMTP伺服器(郵件傳送伺服器)。(SMTP伺服器工作在25號埠上)
  • POP3協議
    同樣,使用者若想從郵件伺服器管理的電子郵箱中接收一封電子郵件的話,他連上郵件伺服器後,也需要遵循一定的通迅格式,POP3協議用於定義這種通訊格式。因而,通常我們也把處理使用者pop3請求(郵件接收請求)的郵件伺服器稱之為POP3伺服器(郵件接收伺服器)。(POP3伺服器工作在110號埠上)

電子郵件的傳送和接收過程

通過一張圖來說明一封郵件的傳送和接收過程,如下圖所示:
這裡寫圖片描述
簡單說一下這個郵件收發過程:

  1. [email protected]使用者寫好一封Email之後,傳送到163的SMTP伺服器。對應於上圖的步驟①
  2. 163的SMTP伺服器開始處理[email protected]使用者的請求,它會根據收件人的地址判斷,當前收件人是不是自己管轄的使用者,如果是,就直接將Email存放到為該收件人分配的郵箱空間當中。163的SMTP伺服器判斷收件人地址發現,這一封Email的收件人[email protected]是sina的郵件伺服器管理的,於是又將Email轉發給sina的SMTP伺服器。對應於上圖的步驟②
  3. sina的SMTP伺服器開始處理163的SMTP伺服器傳送過來的Email,sina的SMTP伺服器根據收件人的地址判斷,發現收件人是自己管轄的使用者,於是就直接將Email存放到為[email protected]使用者分配的郵箱空間當中。對應於上圖的步驟③
  4. [email protected]使用者將郵件發出去之後,就通知[email protected]使用者去收取。[email protected]使用者於是就連線上sina的POP3伺服器收取郵件。對應於上圖的步驟④
  5. POP3伺服器從[email protected]使用者的郵箱空間當中取出Email。對應於步驟⑤
  6. POP3伺服器將取出來的Email發給[email protected]使用者。對應於步驟⑥

手工演示電子郵件的傳送

為了增強學習的趣味性和調動大家學習的熱情,我先通過手工方式來發送和接收一封郵件,我在163和sina上分別開設了一個郵箱賬號,我想用163的郵箱向sina的郵箱中傳送一封郵件,這個郵件傳送過程是怎樣的呢?先用畫圖的方式簡要描述一下(參見上圖),我們要傳送和接收郵件,首先要知道163和sina的郵件伺服器地址,郵件伺服器幫我們幹什麼呢?幫我們把郵件發出去,幫我們把郵件接收進來,為我們提供取郵件的服務。
然後我們就要思考一個問題:是直接把郵件發給sina的郵件伺服器,還是經過163的伺服器發給sina呢?我們分別要連線它們的什麼伺服器呢?——很顯然,是經過163的郵件伺服器傳送給sina的郵件伺服器。

  • 準備實驗環境

    • 提前在163和sina上註冊一個免費帳號。
    • 獲取smtp和pop3伺服器的名稱。
      163或sina會在其幫助中心裡提示管理當前註冊帳號的郵件伺服器的主機名。

      • 網易163免費郵箱相關伺服器資訊
        這裡寫圖片描述
      • sina免費郵箱相關伺服器資訊
        這裡寫圖片描述
    • 編寫base64編碼程式對使用者名稱和密碼進行編碼,這樣的程式程式碼為:

      public class Base64Util {
      
          public static void main(String[] args) throws IOException {
              System.out.print("請輸入使用者名稱:");
              BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
              String userName = in.readLine();
              System.out.print("請輸入密碼:");
              String password = in.readLine();
              BASE64Encoder encoder = new BASE64Encoder();
              System.out.println("編碼後的使用者名稱為:" 
                      + encoder.encode(userName.getBytes()));
              System.out.println("編碼後的密碼為:" 
                      + encoder.encode(password.getBytes())); 
      
          }
      
      }
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17

準備好實驗環境之後,那我們就手工使用SMTP協議傳送電子郵件。

使用SMTP協議傳送郵件

SMTP協議講解

使用SMTP協議傳送郵件給郵件伺服器時規定了要做以下幾件事:

  • 使用ehlo命令和連線上的smtp伺服器打聲招呼,例如:
    • echo hello
  • 使用auth login命令登入到smtp伺服器,登入使用的使用者名稱和密碼必須是經過base64編碼後的使用者名稱和密碼,例如:
    1. 輸入命令:auth login
    2. 輸入使用base64加密過後的使用者名稱:eWVyZW55dW+1sFuMTAwMDE=
    3. 輸入使用base64加密過後的密碼:MTAwMDF5ZXJl+2sbnl1YW4=
  • 指明郵件的發件人和收件人
  • 編寫要傳送的郵件內容,郵件的編寫格式是有一定的規則的,必須符合RFC822文件規範,RFC822文件規定了如何編寫一封簡單的郵件,一封格式良好的郵件應該包含郵件頭和郵件的主體內容,並且郵件頭和郵件體兩者之間要使用空行分隔
    郵件頭使用下面的三個欄位來指明:

    • from欄位用於指明郵件的傳送人。
    • to欄位用於指明郵件的收件人。
    • subject欄位用於指明郵件的主題。

    郵件體:即郵件內容。
    郵件的內容包含了這些資訊之後才是一封格式良好的郵件。

    1. 輸入data命令:

      data

    2. 編寫郵件內容

      from: <[email protected]>    ——郵件頭
      to: <[email protected]>      ——郵件頭
      subject: hello           ——郵件頭
      <空行>
      hello world           ——郵件的具體內容

    提示:可利用RFC822文件漏洞傳送假冒郵件

  • 輸入一個.告訴郵件伺服器郵件內容已經寫完了。
    • .
  • 輸入quit命令斷開與郵件伺服器的連線。
    • quit

以上的6個步驟就是SMTP協議規定的傳送一封Email必須要做的事情。

使用SMTP協議手工傳送郵件

在對SMTP協議有一定的瞭解之後,我們就可以使用SMTP協議來發送郵件了。下面演示一下使用telnet客戶端連線上163的郵件伺服器然後發一封Email到sina的郵箱中去。
為了能夠對SMTP協議有一個直觀的認識,這裡我們不借助任何第三方郵件客戶端工具,而是使用最原始的的telnet客戶端來完成郵件的傳送過程,telnet是一個windows自帶的網路客戶端程式,通過它可以連線上網際網路上面的任意一臺主機
大概有人是第一次使用telnet客戶端的工具,我們試著使用telnet客戶端連線sina的smtp伺服器,發現會出現’telnet’ 不是內部或外部命令,也不是可執行的程式這樣亂七八糟的東西,如下圖所示:
這裡寫圖片描述
要解決該問題,可以參見我的筆記win7作業系統下使用telnet客戶端
好了,現在我們使用telnet客戶端連線到網易的smtp伺服器上,如下圖所示:
這裡寫圖片描述
通過telnet客戶端發Email,如下圖所示:
這裡寫圖片描述
這時我們發現會報一個錯誤:

554 DT:SPM

退信程式碼說明:
554 DT:SPM 傳送的郵件內容包含了未被許可的資訊,或被系統識別為垃圾郵件。請檢查是否有使用者傳送病毒或者垃圾郵件;

這說明我們使用telnet客戶端連線上163的郵件伺服器然後發一封Email,163的SMTP伺服器認為該郵件的內容包含了未被許可的資訊,或被其識別為垃圾郵件,所以將該郵件退回。
接著我想,既然使用telnet客戶端連線上163的郵件伺服器然後發一封Email到sina的郵箱中去失敗了,那麼試試使用telnet客戶端連線上163的郵件伺服器然後發一封Email到qq的郵箱中去,結果依然報相同的錯誤:
這裡寫圖片描述
接著我試著使用telnet客戶端連線上sina的郵件伺服器然後發一封Email到163的郵箱中去,結果驗證都沒通過:
這裡寫圖片描述
再接著我試著使用telnet客戶端連線上qq的郵件伺服器然後發一封Email到163的郵箱中去,結果連SMTP伺服器都登不上去。
這裡寫圖片描述
此刻,我已經瘋了!!!我試圖去搜狐閃電郵箱官網裡面註冊一個搜狐郵箱,結果是連這個頁面都打不開。

手工演示電子郵件的接收

使用POP3協議接收郵件

POP3協議講解

POP3協議規定了收取郵件時要做以下幾件事:

  • 輸入使用者名稱和密碼登入到POP3伺服器,使用者名稱和密碼不需要經過base64加密。
    • user username——登入郵箱的使用者名稱
    • pass password——登入郵箱使用的密碼
  • 使用retr命令收取郵件。
    • retr 數字:收取郵件,如retr 1表示收取郵箱當中的第一封郵件,這是POP3協議裡面最重要的一個命令。
      在使用retr命令收取郵件之前,可以使用如下的兩個命令檢視一下郵箱裡面的郵件的一些相關資訊。
      • stat:返回郵箱裡面的郵件數量以及郵件佔用的空間大小資訊(可以看到有幾封電子郵件,總共佔用多少個位元組)
      • list:返回某一封郵件的統計資訊(可以看到每封電子郵件分別佔用多少個位元組)
  • 郵件收取完成之後使用quit命令斷開與POP3伺服器的連線。
    • quit:斷開與POP3伺服器的連線。

使用POP3協議手工接收郵件

收取郵件我們也不借助任何第三方客戶端工具,而是使用telnet客戶端連線到POP3伺服器進行收取。
例如:現在我的163郵箱當中有這樣的一封郵件,如下圖所示:
這裡寫圖片描述
現在我們不用使用foxmail或者outLook這樣的客戶端工具去收取,而是使用telnet客戶端連線到163的POP3伺服器去手工收取。
使用telnet連線上163的POP3伺服器,使用命令:telnet pop.163.com 110,如下圖所示:
這裡寫圖片描述
接著根據POP3協議規定的郵件收取步驟來收取郵件。如下圖所示:
這裡寫圖片描述
可以看到,我們使用POP3協議純手工從163的POP3伺服器當中收取回來了一封Email,Email裡面的內容都經過了base64編碼處理。這就是使用POP3協議收取郵件的過程。
以上就是郵件的傳送與接收原理的相關內容,這一篇文章主要是介紹郵件傳送和接收過程中使用到的SMTP協議和POP3協議,沒有涉及到太多程式碼方面的東西,後面會具體介紹使用JavaMail來進行郵件傳送。

相關推薦

電子郵件收發原理JavaMail開發

Java郵件開發介紹 為什麼要學習javamail開發 現在很多WEB應用在開發時都需要整合郵件傳送功能,例如: 給新註冊的使用者自動傳送一封包含其註冊資訊的歡迎E-Mail。 給過生日的註冊會員自動傳送一封表示祝賀的E-Mail。 將網站的最新活動資訊通過E-Mail傳送給所有的註冊會員。 等等

郵件原理JavaMail開發(一)——郵件的傳送與接收原理

Java郵件開發介紹 為什麼要學習javamail開發 現在很多WEB應用在開發時都需要整合郵件傳送功能,例如: 給新註冊的使用者自動傳送一封包含其註冊資訊的歡迎E-Mail。 給過生日的註冊會員自動傳送一封表示祝賀的E-Mail。 將網站的最新活動

郵件原理JavaMail開發中應用的一些重要的類

JavaMail API使用javax.mail.Message類來表示一封郵件,Message類是一個抽象類,應用程式需要使用其實現子類java.mail.internet.MimeMessage來建立Message類的例項物件。如果要建立一封致包含文字的簡單郵件,那麼只需要使用到MimeMessage類就

電子郵件收發協議總結

保存 通知 [1] 不同 str user tcp連接 結束 tcp/ip 說明:本文僅供學習交流,轉載請標明出處,歡迎轉載! 電子郵件發送協議是一種基於“推”的協議,主要包括SMTP;郵件接收協議則是一種基於“拉”的協議,主要包括POP協議和IMAP協議,

Leetcode 929 獨特的電子郵件(PythonC++實現)

每封電子郵件都由一個本地名稱和一個域名組成,以 @ 符號分隔。 例如,在 [email protected]中, alice 是本地名稱,而 leetcode.com 是域名。 除了小寫字母,這些電子郵件還可能包含 ','

Leetcode 929 獨特的電子郵件(PythonC++實現)

每封電子郵件都由一個本地名稱和一個域名組成,以 @ 符號分隔。 例如,在 [email protected]中, alice 是本地名稱,而 leetcode.com 是域名。 除了小寫字母,這些電子郵件還可能包含 ',' 或 '+'。 如果在電子郵件地址的本

電子郵件格式 eml mbox 及其相互轉換

原文地址:http://notes.techlive.me/note-2010-12-15-48.html 一、簡單瞭解 eml1 eml 格式被一些電子郵件客戶端用來儲存電子郵件。它只能儲存一封郵件,但可以包含郵件附件或者那些隨郵件一同傳送的檔案。 mbox2 mbox

FPGA組成、工作原理開發流程

1.5 embed nec 基礎 查找 clear 配置 系統性能 發現 FPGA組成、工作原理和開發流程 原創 2012年01月07日 09:11:52 9402 0 4 ********************************LoongEmbedd

備份導入Outlook 2016 電子郵件簽名

服務器 Windows Server 在本文中,我將分享您在Outlook 2013和Outlook 2016中備份或導入簽名的過程在清除Outlook配置文件之前,請確保您通過在文件資源管理器中的配置文件中的APPDATA文件夾中復制它們來備份您的簽名。請記住,默認情況下APPDATA文件夾是一個隱

SpringMvc 及極速快-三平臺開發工作原理作用

上下 struts ont 通用 tex 環境 返回 子郵件 iba 極速快-三平臺開發Q1446595067工作原理: 1.springmvc請所有的請求都提交給DispatcherServlet,它會委托應用系統的其他模塊負責負責對請求進行真正的處理工作。

SpringCloud工作筆記065---lombok的使用原理_在開發工具STS_eclipse_Idea中整合lombok

  JAVA技術交流QQ群:170933152  簡單說就是在類中不用再寫:get set方法,hashcode toStirng equals方法了    eclipse中整合: update時,勾選上Force Update of Sn

[原始碼報告分享] C#實現的基於SMTP協議的E-MAIL電子郵件傳送客戶端軟體

利用SMTP和Pop協議從底層開發了這個軟體。SMTP全稱是簡單郵件傳輸協議,它專門用來發送郵件用的。Pop全稱是郵局協議,是專門用於接收郵件的。我主要是負責如何實現傳送郵件功能的。MailSend名稱空間是我整個程式的核心。它包括兩個類。在SmtpMail的類中包含了一個SendMail的方法,它

【C#】C#對電子郵件收發操作

目錄結構: contents structure [+] 簡介 傳送郵件 讀取郵件 1.簡介 郵件傳輸常用的協議有,SMTP、POP3、IMAP4。他們都屬於TCP/IP協議,預設狀態下分別通過TCP埠25,110,和143建立連結。 SMTP協議 SMTP的全稱是“Simple

SMTP協議及POP3協議-郵件發送接收原理(轉)

賬戶 pub 上進 現實生活 targe base64編碼 郵局 list amr 本文轉自https://blog.csdn.net/qq_15646957/article/details/52544099 感謝作者 一、 郵件開發涉及到的一些基本概念 1.1、郵件服

電子郵件傳送接收過程 一一 SMTP、POP3、IMAP

電子郵件傳送協議主要是SMTP,收件協議主要是POP3和IMAP; SMTP 的全稱是“Simple Mail Transfer Protocol”,即簡單郵件傳輸協議。它是一組用於從源地址到目的地址

Java基礎:深入理解java異常處理機制的原理開發應用【轉載】

Java異常處理機制在日常開發中應用頻繁,本篇文章主要在基礎的使用方法上,更進一步的,如何更加合理的使用異常機制,希望可以對各位朋友能有所幫助。   Java異常處理機制其最主要的幾個關鍵字:try、catch、finally、throw、throws,以及各種各樣

軟體開發原理原則

軟體危機“ 軟體危機是指軟體開發和維護過程中遇到的嚴重的問題 表現 產品不符合客戶的實際需求 軟體質量差 文件不合格 價格昂貴 產生的原因 軟體的特點給開發和維護帶來的困難 開發管理人員只重視開發不注意維護 軟體開發遵循的原理: (1)用分階段的生存週期計劃嚴格管理 (2)堅持進行階

用flask開發個人部落格(24)—— flask中使用Flask_Mail傳送電子郵件

        flask中使用Flask-Mail提供對電子郵件的支援,下面將分步驟測試flask中傳送電子郵件的功能: 1 配置SMTP伺服器的資訊         我們需要藉助flask程式例項app的config屬性來配置電子郵件的SMTP伺服器資訊,其中主要的配置

9、ssm整合activeMQ、JAVAMail實現郵件非同步註冊登陸功能

1、前言 註冊某個網站的時候,往往要你用郵箱註冊,傳送郵件的功能很簡單,但是在點選註冊傳送郵件的時候,總不能等郵件傳送完畢之後才能跳轉頁面吧?或者說,我們應該將發郵件的這個過程異步出去,讓他自己慢慢去發郵件,我的主執行緒直接跳轉到其他頁面,等郵件到了,使用者點

Android 元件化開發原理配置

在Application的不斷髮展過程中,我們開發者要不斷地增加新特性。更多的程式碼就意味著更長的build時間和更長的增量build時間。在工程較大的專案中,build時間要佔到10%~15%的工作時間。這不僅是浪費時間,也是測試驅動工作方式(TDD)比較困難的原因。