電子郵件須要在郵件客戶端和郵件服務器之間,以及兩個郵件服務器之間進行傳遞,就必須遵循必定的規則,這些規則就是郵件傳輸協議。SMTP協議定了郵件客戶端與SMTP服務之間,以及兩臺SMTP服務器之間發送郵件的通訊規則;POP3/IMAP協議定義了郵件客戶端與POP3服務器之間收發郵件的通訊規則。css
SMTP(Simple Mail Transfer Protocol,簡單郵件傳輸協議)定義了郵件客戶端與SMTP服務器之間,以及兩臺SMTP服務器之間發送郵件的通訊規則 。SMTP協議屬於TCP/IP協議族,通訊雙方採用一問一答的命令/響應形式進行對話,且定了對話的規則和全部命令/響應的語法格式。
html
SMTP協議中一共定了18條命令,發送一封電子郵件的過程一般只須要其中的6條命令便可完成發送郵件的功能,下表按照發送命令的前後順序列出了這6條命令,並描述了其語法及功能說明,其中,<SP>表明空格,<CRLF>表明回車和換行。java
SMTP命令格式 | 說明 |
ehlo<SP><domain><CRLF> | ehlo命令是SMTP郵件發送程序與SMTP郵件接收程序創建鏈接後必須發送的第一條SMTP命令,參數<domain>表示SMTP郵件發送者的主機名。 ehlo命令用於替代傳統SMTP協議中的helo命令。 |
auth<SP><para><CRLF> | 若是SMTP郵件接收程序須要SMTP郵件發送程序進行認證時,它會向SMTP郵件發送程序提示它所採用的認證方式,SMTP郵件發送程序接着應該使用這個命令迴應SMTP郵件接收程序,參數<para>表示迴應的認證方式,一般是SMTP郵件接收程序先前提示的認證方式。 |
mail<SP>From:<reverse-path><CRLF> | 此命令用於指定郵件發送者的郵箱地址,參數<reverse-path>表示發件人的郵箱地址 |
rcpt<SP>To:<forword-path><CRLF> | 此命令用於指定郵件接收者的郵箱地址,參數<forward-path>表示接收者的郵箱地址。若是郵件要發送給多個接收者,那麼應使用多條rcpt<SP>To命令來分別指定每個接收者的郵箱地址。 |
data<CRLF> | 此命令用於表示SMTP郵件發送程序準備開始輸入郵件內容,在這個命令後面發送的全部數據都將被當作郵件內容,直至遇到「<CRLF>.<CRLF>"標誌符,則表示郵件內容結束。 |
quit<CRLF> | 此命令表示要結束郵件發送過程,SMTP郵件接收程序接收到此命令後,將關閉與SMTP郵件發送程序的網絡鏈接。 |
其它SMTP命令的語法及功能描述能夠參考RFC821和RFC1869文檔。apache
對於SMTP郵件發送程序發送的每一條命令,SMTP郵件接收程序都將回應一條響應信息。每條響應信息都以一個響應狀態開頭,如:250 OK。響應狀態用於表示SMTP服務器對請求命令的處理結果和狀態,它是一個三位的十進制數。響應狀態碼的最高位數字表明瞭不一樣的分類,當其爲 2 時表示命令執行成功;爲5時表示命令執行失敗;爲3時表示命令沒有完成。關於響應狀態碼所表明的具體含義,能夠參考RFC821文檔。服務器
SMTP協議是一個基於TCP/IP的應用層協議,SMTP服務器默認的網絡監聽端口號爲25,下面將經過telnet程序,手工發送SMTP命令來發送一封電子郵件,從而理解SMTP協議的交互過程。網絡
模擬環境說明:鏈接sina的SMTP服務器,給163的SMTP服務器發送一封郵件,操做過程以下圖所示:app
說明:dom
一、鏈接SMTP服務器的用戶名和密碼須要通過base64編碼,下面是對用戶名和密碼進行base64編碼的JAVA程序:ide
二、紅色箭頭指向的文字表示我在telnet程序中輸入的命令,以二、三、5數字開頭的行表示SMTP服務器對命令的響應。經過上表中的6個SMTP命令就完成了一封簡單電子郵件的發送。固然一封複雜的郵件不僅包含這些信息,還應包括主題、發送日期、抄送和附件等消息頭。oop
POP3命令格式 | 說明 |
user<SP>username<CRLF> | user 命令是POP3客戶端程序與POP3郵件服務器創建鏈接後一般發送的第一條命令,參數 username 表示收件人的賬戶名稱。 |
pass<SP>password<CRLF> | pass 命令是在user命令成功經過後,POP3客戶端程序接着發送的命令,它用於傳遞賬戶的密碼,參數 password 表示賬戶的密碼。 |
apop<SP>name,digest<CRLF> | apop 命令用於替代user和pass命令,它以MD5 數字摘要的形式向POP3郵件服務器提交賬戶密碼。 |
stat<CRLF> | stat 命令用於查詢郵箱中的統計信息,例如:郵箱中的郵件數量和郵件佔用的字節大小等。 |
uidl<SP>msg#<CRLF> | uidl 命令用於查詢某封郵件的惟一標誌符,參數msg#表示郵件的序號,是一個從1開始編號的數字。 |
list<SP>[MSG#]<CRLF> | list 命令用於列出郵箱中的郵件信息,參數 msg#是一個可選參數,表示郵件的序號。當不指定參數時,POP3服務器列出郵箱中全部的郵件信息;當指定參數msg#時,POP3服務器只返回序號對應的郵件信息。 |
retr<SP>msg#<CRLF> | retr 命令用於獲取某封郵件的內容,參數 msg#表示郵件的序號。 |
dele<SP>msg#<CRLF> | dele 命令用於在某封郵件上設置刪除標記,參數msg#表示郵件的序號。POP3服務器執行dele命令時,只是爲郵件設置了刪除標記,並無真正把郵件刪除掉,只有POP3客戶端發出quit命令後,POP3服務器纔會真正刪除全部設置了刪除標記的郵件。 |
rest<CRLF> | rest 命令用於清除全部郵件的刪除標記。 |
top<SP>msg#<SP>n<CRLF> | top 命令用於獲取某封郵件的郵件頭和郵件體中的前n行內容,參數msg#表示郵件的序號,參數n表示要返回郵件的前幾行內容。使用這條命令以提升 Web Mail系統(經過Web站點上收發郵件)中的郵件列表顯示的處理效率,由於這種狀況下不須要獲取每封郵件的完整內容,而是僅僅須要獲取每封郵件的郵件頭信息。 |
noop<CRLF> | noop 命令用於檢測POP3客戶端與POP3服務器的鏈接狀況。 |
quit<CRLF> | quit 命令表示要結束郵件接收過程,POP3服務器接收到此命令後,將刪除全部設置了刪除標記的郵件,並關閉與POP3客戶端程序的網絡鏈接。 |
早期人們在使用電子郵件時,都是使用普通文本內容的電子郵件內容進行交流,因爲互聯網的迅猛發展,人們已不知足電子郵件僅僅是用來交換文本信息,而但願使用電子郵件來交換更爲豐富多彩的多媒體信息,例如,在郵件中嵌入圖片、聲音、動畫和附件等二進制數據。但在以往的郵件發送協議RFC822文檔中定義,只能發送文本信息,沒法發送非文本的郵件,針對這個問題,人們後來專門爲此定義了MIME(Multipurpose Internet Mail Extension,多用途Internet郵件擴展)協議。
MIME協議用於定義複雜的郵件體格式,它能夠表達多段平行的文本內容和非文本的郵件內容,例如,在郵件體中內嵌的圖像數據和郵件附件等。另外,MIME協議的數據格式也能夠避免郵件內容在傳輸過程發生信息丟失。對於表示某個具體資源的MIME消息,它的消息頭中須要指定資源的數據類型;對於MIME組合消息,它的消息中須要指定組合關係。具體資源的數據類型和組合消息的組合關係,都是經過消息頭中的Content-Type頭字段來指定的。Content-Type字段中的內容以「主類型/子類型」的形式出現,主類型有text、image、audio、video、application、multipart、message等,分別表示文本、圖片、音頻、視頻、應用程序、組合結構、消息等。每一個主類型下面都有多個子類型,例如text類型包含plain、html、xml、css等子類型。multipart主類型用於表示MIME組合消息,它是MIME協議中最重要的一種類型。一封MIME郵件中的MIME消息能夠有三種組合關係:混合、關聯、選擇,它們對應MIME類型以下: