1. 程式人生 > >使用SMTP傳送電子郵件

使用SMTP傳送電子郵件

描述SMTP的基本操作,有如下常見的情景。假如Alice想給Bob傳送一封簡單的ASCII報文:

1)Alice啟動她的郵件代理伺服器並提供Bob的郵件地址(例如:***@163.com),撰寫郵件,通過使用者代理髮送該郵件。

2)Alice的使用者代理把報文傳送給Alice的郵件伺服器,該郵件再這裡被放在報文傳送佇列中。

3)執行在Alice郵件伺服器上的SMTP客戶端發現了在報文佇列中的該報文,他就建立一個到執行在Bob的郵件伺服器上的SMTP伺服器的TCP連線。

4)在經過一些初始SMTP握手後,SMTP客戶端通過該TCP連線傳送Alice的報文。

5)在Bob的有勁啊伺服器上,SMTP的伺服器接收該報文,Bob的郵件伺服器然後將該報文放入Bob的郵箱中。

6)再Bob方便的時候,他呼叫使用者代理閱讀該報文。

如下圖所示:

下面簡單介紹傳送郵件時,6步操作的具體內容。

SMTP客戶機(執行在傳送方郵件伺服器上)在25號埠建立一個到SMTP的伺服器(執行在接收方郵件伺服器上)的TCP連線。如果某伺服器沒有開機,客戶機會再稍後繼續嘗試連線。一旦連線建立,伺服器與客戶機之間執行一些應用層的握手操作,相互進行自我介紹,然後再發送資料報文。在SMTP握手階段,SMTP客戶機指明發送方的郵件地址(產生報文的使用者)和接收方的郵件地址。一旦該SMTP客戶機和伺服器彼此介紹之後,客戶機發送該報文。SMTP能利用TCP提供的可靠資料傳輸無差錯地將郵件投遞到伺服器。該客戶機如果有另外的報文要傳送到該伺服器,就在該相同的TCP連線上重複當前處理;否則,它指示TCP關閉連線。

SMTP客戶機(C)和SMTP伺服器(S)之間交換報文指令碼的例子:客戶機的主機名為crepes.fr,伺服器的主機名為hamburger.edu。以c:開頭的ASCII碼文字行就是客戶機交給其TCP套接字的哪些行,以s:開頭的ASCII碼則是伺服器傳送給其TCP套接字的哪些行,一旦TCP連線起來,就開始了下列過程:

S:220 hamburger.edu C:HLo crepes.fr S:250 Hello crepes.fr, pleased to meet you C:MAIL FROM: <[email protected]>  S:250 [email protected]

  ···  Sender  ok C:RCPT TO: <[email protected] ... Recipient ok C:DATA S:354 Enter mail, end with "." on a line by itself C:Do you like ketchup? C:How about pickles? C:. S:250 Message accepted for delivery C:QUIT S:221 hamburger.edu closing connection

在客戶機向伺服器傳送資料時,客戶機向伺服器傳送了5條命令:HELO(Hello的縮寫)、MAIL FROM、RCPT TO、 DATA以及QUIT。這些命令都是自解釋的。客戶機發送一個只包含一個句點的行,告訴伺服器該報文結束了(按照ASCII碼的表示方法,每個報文用CRLF.CRLF結束,其中的CR和LF分別表示回車和換行)。需要指出的是SMTP用的是持久連線:如果傳送郵件的伺服器有幾個報文發往同一個接收郵件的伺服器,他可以通過同一個TCP連線傳送所有這些報文。對每個報文,客戶機都用一個新的MAIL FROM:crepes.fr開始,類似,獨立的一個句點表示報文傳送結束,當所有郵件傳送完成後才傳送QUIT。