摘要:本文介紹了一種采用SMTP協議規范并通過直接使用SMTP協議命令而在程序中實現電子郵件傳送的方法。并在VC++開發環境下給出了部分關鍵的實現代碼。
前言
電子郵件服務作為Internet上應用最多和最廣的服務項目得到了非常廣泛的應用,在網絡應用中也起到非常重要的作用。如同其他的網絡服務,電子郵件系統也有其使用的傳輸協議,包括SMTP(SimpleMailTransferProtocol,簡單郵件傳輸協議)、POP(PostOfficeProtocol,郵局協議)和IMAP(InternetMessageAclearcase/" target="_blank" >ccessProtocal,消息訪問協議)等,這些協議應用于電子郵件的發送和接收。一些郵件處理軟件如OutLookExpress和FoxMail等就是按照SMTP和POP3協議結合WindowsSockets套接字進行設計來收發郵件的。本文以SMTP協議為研究對象,在VisualC++6.0編程環境下按照SMTP協議通過套接字發送SMTP命令,接收并處理郵件服務器的反饋信息,從而實現對電子郵件的發送。
SMTP協議的通訊模型和會話流程
SMTP協議通訊模型
SMTP協議是TCP/IP協議族中的一員,主要對如何將電子郵件從發送方地址傳送到接收方地址,也即是對傳輸的規則做了規定。SMTP協議的通信模型并不復雜,主要工作集中在發送SMTP和接收SMTP上:首先針對用戶發出的郵件請求,由發送SMTP建立一條連接到接收SMTP的雙工通訊鏈路,這里的接收SMTP是相對于發送SMTP而言的,實際上它既可以是最終的接收者也可以是中間傳送者。發送SMTP負責向接收SMTP發送SMTP命令,而接收SMTP則負責接收并反饋應答??纱笾掠孟旅娴耐ㄓ嵞P褪疽鈭D來表示:
SMTP協議的命令和應答
從前面的通訊模型可以看出SMTP協議在發送SMTP和接收SMTP之間的會話是靠發送SMTP的SMTP命令和接收SMTP反饋的應答來完成的。在通訊鏈路建立后,發送SMTP發送MAIL命令指令郵件發送者,若接收SMTP此時可以接收郵件則作出OK的應答,然后發送SMTP繼續發出RCPT命令以確認郵件是否收到,如果接收到就作出OK的應答,否則就發出拒絕接收應答,但這并不會對整個郵件操作造成影響。雙方如此反復多次,直至郵件處理完畢。SMTP協議共包含10個SMTP命令,列表如下:
SMTP命令命令說明
HELLO<domain><CRLF>識別發送方到接收SMTP的一個HELLO命令
MAILFROM:<reverse-path><CRLF><reverse-path>為發送者地址。此命令告訴接收方一個新郵件發送的開始,并對所有的狀態和緩沖區進行初始化。此命令開始一個郵件傳輸處理,最終完成將郵件數據傳送到一個或多個郵箱中。
RCPTTO:<forward-path><CRLF><forward-path>標識各個郵件接收者的地址
DATA<CRLF>
接收SMTP將把其后的行為看作郵件數據去處理,以<CRLF>.<CRLF>標識數據的結尾。
REST<CRLF>退出/復位當前的郵件傳輸
NOOP<CRLF>要求接收SMTP僅做OK應答。(用于測試)
QUIT<CRLF>要求接收SMTP返回一個OK應答并關閉傳輸。
VRFY<string><CRLF>驗證指定的郵箱是否存在,由于安全因素,服務器多禁止此命令。
EXPN<string><CRLF>驗證給定的郵箱列表是否存在,擴充郵箱列表,也常禁止使用。
HELP<CRLF>查詢服務器支持什么命令
注:<CRLF>為回車、換行,ASCII碼分別為13、10(十進制)。
SMTP協議的每一個命令都會返回一個應答碼,應答碼的每一個數字都是有特定含義的,如第一位數字為2時表示命令成功;為5表失??;3表沒有完成。一些較復雜的郵件程序利用該特點,首先檢查應答碼的首數字,并根據其值來決定下一步的動作。下面將SMTP的應答碼列表如下:
應答碼說明
501參數格式錯誤
502命令不可實現
503錯誤的命令序列
504命令參數不可實現
211系統狀態或系統幫助響應
214幫助信息
220<domain>服務就緒
221<domain>服務關閉
421<domain>服務未就緒,關閉傳輸信道
250要求的郵件操作完成
251用戶非本地,將轉發向<forward-path>
450要求的郵件操作未完成,郵箱不可用
550要求的郵件操作未完成,郵箱不可用
451放棄要求的操作;處理過程中出錯
551用戶非本地,請嘗試<forward-path>
452系統存儲不足,要求的操作未執行
552過量的存儲分配,要求的操作未執行
553郵箱名不可用,要求的操作未執行
354開始郵件輸入,以"."結束
554操作失敗