當前位置:編程學習大全網 - 源碼下載 - smpt服務器的問題

smpt服務器的問題

壹、協議簡介

SMTP被用來在因特網上傳遞電子郵件。文件RFC821規定了該協議的所有細節。但是妳只須記住下面的內容--該協議的基本命令和方法就行了。

協議的原理很簡單。無非是壹個客戶端計算機向服務器發送命令,然後服務器向客戶端計算機返回壹些信息。客房端發送的命令以及服務器的回應都是字符串,妳並不需要特別的軟件就能讀出它們。如果妳仔細看過WinsockTerminal示例程序的源代碼,妳就會發現這壹點。現在讓我們用這個示例程序來向自己發壹封電子郵件吧。

運行示例程序,單擊"Connect"按鈕,在"Connectto..."對話框中輸入妳的電子郵件服務器的地址,選擇SMTP選項。最後按"Connect"按鈕。如果連接成功,Winsock控件會產生Connected事件,在狀態欄中也可看到連接成功的信息。在主文本窗口中妳將看到從服務器返回的文本。該文本包含壹個三位數的代碼及描述,例如:

220-ns.cinfo.ruSendmail8.6.12/8.6.9readyatWed,22Apr199822:54:41+0300

220ESMTPspokenhere

不必太過留意這些描述。因為這些描述可能會因服務器而異。妳只須要知道代碼所代表的意思就行了。代碼220表示成功建立連接,服務器等待妳的第壹個命令。

向服務器傳遞的第壹個命令是HELO.該命令包含壹個參數,即妳的郵箱名。

HELOoleg

註意:在RFC821中,HELO是壹個可選擇性命令,如果服務器不要求該命令的話,妳可以把它忽略掉。

如果命令成功,服務器會返回壹個代碼為250的回應。下壹步用MAILFROM命令告訴服務器妳想發壹封郵件。該命令以發信人的郵件地址為參數。

MAILFROM : [email]oleg@vbip.com[/email]

發完命令後,如果服務器返回壹個代碼為250回應,妳就可以向服務器發送RCPTTO命令了。該命令以收信人地址為參數,壹看便知是告訴服務器妳想將郵件發到收信人地址處。

RCPTTO : [email]somebody@domain.com[/email]

如果妳想將郵件發給多個收件人的話。妳需要多次使用RCPTTO命令,對每個命令,服務器都會返回代碼為250的回應。

現在妳可以向服務器發送郵件正文了。用DATA命令告訴服務器以下的內容為郵件正文。在妳從服務器收到代碼為354的回應後,妳就可以發送郵件正文了。郵件按行發送,每行郵件以壹個無回車的換行符結束(在VB中就是vbLf)示例程序知道何時使用換行符,何時使用回車加換行符。所以妳只須按回車鍵就行了。下面是壹個例子:

Subject : Myfirste-mailmessage.

Firstlineofamessage.

Secondline.

.

註意上面最後壹行的最後壹個字符是壹個小數點。這是正文結束的標誌。用VB代碼表示就是vbLf&"."&vbCrLf.服務器收到這個標誌後,就會立即向妳返回壹個代碼為250的回應以及該郵件的唯壹ID號。

250WAA10568Messageacceptedfordelivery

任務完成了,妳可以繼續發送下封郵件,也可以斷開同服務器的連接。如果要斷開同服務器的連接就用QUIT命令。在這種情況下,服務器會返回壹個代碼為221的回應並斷開連接。

二、SMTP協議原始命令碼和工作原理

1.SMTP是工作在兩種情況下:壹是電子郵件從客戶機傳輸到服務器;二是從某壹個服務器傳輸到另壹個

服務器

2.SMTP是個請求/響應協議,命令和響應都是基於ASCII文本,並以CR和LF符結束。響應包括壹個表示返

回狀態的三位數字代碼

3.SMTP在TCP協議25號端口監聽連接請求

4.連接和發送過程:

a.建立TCP連接

b.客戶端發送HELO命令以標識發件人自己的身份,然後客戶端發送MAIL命令

服務器端正希望以OK作為響應,表明準備接收

c.客戶端發送RCPT命令,以標識該電子郵件的計劃接收人,可以有多個RCPT行

服務器端則表示是否願意為收件人接受郵件

d.協商結束,發送郵件,用命令DATA發送

e. 以.表示結束輸入內容壹起發送出去

f.結束此次發送,用QUIT命令退出。

5.另外兩個命令:

VRFY---用於驗證給定的用戶郵箱是否存在,以及接收關於該用戶的詳細信息。

EXPN---用於擴充郵件列表。

6.郵件路由過程:

SMTP服務器基於‘域名服務DNS中計劃收件人的域名來路由電子郵件。SMTP服務器基於DNS中的MX記錄

來路由電子郵件,MX記錄註冊了域名和相關的SMTP中繼主機,屬於該域的電子郵件都應向該主機發送。

若SMTP服務器mail.abc.com收到壹封信要發到[email]shuser@sh.abc.com[/email]:

a.Sendmail請求DNS給出主機sh.abc.com的CNAME記錄,如有,假若CNAME到shmail.abc.com,則再次

請求shmail.abc.com的CNAME記錄,直到沒有為止

b.假定被CNAME到shmail.abc.com,然後sendmail請求@abc.com域的DNS給出shmail.abc.com的MX記錄,

shmail MX 5 shmail.abc.com

10 shmail2.abc.com

c. Sendmail最後請求DNS給出shmail.abc.com的A記錄,即IP地址,若返回值為1.2.3.4

d. Sendmail與1.2.3.4連接,傳送這封給[email]shuser@sh.abc.com[/email]的信到1.2.3.4這臺服務器的SMTP後臺程序

7.SMTP基本命令集:

命令 描述

------------------------------

HELO 向服務器標識用戶身份

發送者能欺騙,說謊,但壹般情況下服務器都能檢測到。

MAIL 初始化郵件傳輸

mail from:

RCPT 標識單個的郵件接收人;常在MAIL命令後面

可有多個rcpt to:

DATA 在單個或多個RCPT命令後,表示所有的郵件接收人已標識,並初始化數據傳輸,以.結束。

VRFY 用於驗證指定的用戶/郵箱是否存在;由於安全方面的原因,服務器常禁止此命令

EXPN 驗證給定的郵箱列表是否存在,擴充郵箱列表,也常被禁用

HELP 查詢服務器支持什麽命令

NOOP 無操作,服務器應響應OK

QUIT 結束會話

RSET 重置會話,當前傳輸被取消

--------------------------------

8. MAIL FROM命令中指定的地址是稱作 envelope from地址,不需要和發送者自己的地址是壹致的。

RCPT TO 與之等同,指明的接收者地址稱為envelope to地址,而與實際的to:行是什麽無關。

9.為什麽沒有RCPT CC和RCPT BCC:?

所有的接收者協商都通過RCPT TO命令來實現,如果是BCC,則協商發送後在對方接收時被刪掉信封接收者

10.郵件被分為信封部分,信頭部分和信體部分

envelope from, envelope to 與message from:, message to:完全不相幹。

evnelope是由服務器主機間SMTP後臺提供的,而message from/to是由用戶提供的。有無冒號也是區別。

11. 怎樣由信封部分檢查是否壹封信是否是偽造的?

a. received行的關聯性。

現在的SMTP郵件傳輸系統,在信封部分除了兩端的內部主機處理的之個,考慮兩個公司防火墻之間

的部分,若兩臺防火墻機器分別為A和B,但接收者檢查信封received:行時發現經過了C.則是偽造的。

b. received :行中的主機和IP地址對是否對應如:

Receibed : from galangal.org (turmeric.com [104.128.23.115] by mail .bieberdorf.edu....

c. 被人手動添加在最後面的received行:

Received : from galangal.org ([104.128.23.115]) by mail .bieberdorf.edu (8.8.5)

Received : from lemongrass.org by galangal.org (8.7.3)

Received : from graprao.com by lemongrass.org (8.6.4)

三、SMTP協議通訊模型

SMTP協議是TCP/IP協議族中的壹員,主要對如何將電子郵件從發送方地址傳送到接收方地址,也即是對傳輸的規則做了規定。SMTP協議的通信模型並不復雜,主要工作集中在發送SMTP和接收SMTP上:首先針對用戶發出的郵件請求,由發送SMTP建立壹條連接到接收SMTP的雙工通訊鏈路,這裏的接收SMTP是相對於發送SMTP而言的,實際上它既可以是最終的接收者也可以是中間傳送者。發送SMTP負責向接收SMTP發送SMTP命令,而接收SMTP則負責接收並反饋應答。可大致用下面的通訊模型示意圖來表示:

[attach]483[/attach]

四、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操作失敗

中國電腦網,為妳解決電腦難題!(2007.07.01即將重開,歡迎到時候來啊)

  • 上一篇:“Android NDK ”是什麽,在什麽情況下使用?
  • 下一篇:全面戰爭都有哪個主體的版本?還有哪些經典的mod?
  • copyright 2024編程學習大全網