SMTP協議
目錄
1SMTP協議簡介編輯
SMTP目前已是事實上的在
Internet傳輸
E-Mail的標准,是一個相對簡單的基於
文本的協議。在其之上指定了一條消息的一個或多個接收者(在大多數情況下被確定是存在的),然后消息文本就傳輸了。
可以很簡單地通過Telnet程序來測試一個SMTP服務器
,
SMTP
使用
TCP
端口25。要為一個給定的域名決定一個
SMTP
服務器,需要使用
MX(Mail eXchange)DNS
。
SMTP協議發展
在20世紀80年代早期
SMTP開始被廣泛地使用。當時它只是作為
UUCP的補充,
UUCP更適合於處理在間歇連接的機器間傳送郵件。相反
SMTP在發送和接收的機器始終都聯網的情況下工作得最好。
SMTP獨立於特定的傳輸子系統,且只需要可靠有序的
數據流信道支持。
SMTP重要特性之一是其能跨越
網絡傳輸郵件,即“
SMTP郵件中繼”。通常,一個網絡可以由公用因特網上
TCP可相互間訪問的
主機、防火牆分隔的
TCP/IP網絡上
TCP可相互訪問的主機,以及其他
LAN/WAN中的主機利用非
TCP
傳輸層協議組成。使用
SMTP,可實現相同網絡上
處理機之間的郵件傳輸,也可通過
中繼器或
網關是實現某處理機與其他網絡之間的郵件傳輸。
SMTP的作用
Sendmail是最早實現
SMTP的郵件傳輸代理之一。到2001年至少有50個程序將
SMTP 實現為一個
客戶端(消息的發送者)或一個服務器(消息的接受者)。一些其他的流行的
SMTP服務器包括
Philip Hazel 的
exim,IBM的
Postfix,D.J.Bernstein的
Qmail,以及
Mi
crosoft Exchange Server.
由於這個協議開始是基於純
ASCⅡ文本的,在
二進制文件上處理得並不好。后來開發了用來編碼二進制文件的標准,如
MIME,以使其通過
SMTP來傳輸。今天,大多數
SMTP服務器都支持8位
MIME擴展,它使二進制文件的傳輸變得幾乎和純文本一樣簡單。
( 注意:
SMTP是一個"推"的協議,它不允許根據需要從遠程服務器上“拉”來消息。要做到這點,
郵件客戶端必須使用
POP3或
IMAP上。另一個,
SMTP服務器可以使用
ETRN(
Extended Turn,擴展回車)命令在
SMTP上觸發一個發送。)
SMTP協議的局限
垃圾郵件仍然是個重要的問題。
原始的SMTP協議的 局限之一在於它沒有為發送方進行認證的功能。因此定義了SMTP-AUTH 擴展。
由於
SMTP
巨大安裝基礎的
網絡效應
,廣闊地修改
SMTP
或者完全替代它被認為是不現實的。
Internet Mail
2000
就是這樣一個為替換而做的建議。
IRTF
的
反垃圾郵件
研究小組正在研究一些提供簡單、靈活、輕量級的、可升級的源端認證的建議。最有可能被接受的建議是
Sender Policy Framework
協議。
2SMTP協議命令及工作原理編輯
SMTP命令
SMTP命令是發送於
SMTP
主機之間的
ASCⅡ信息,可能使用到的命令如下表所示。
SMTP協議命令
命令
|
描述
|
DATA
|
開始信息寫作
|
EXPN<string>
|
驗證給定的郵箱列表是否存在,擴充郵箱列表,也常被禁用
|
HELO<domain>
|
向服務器標識用戶身份,返回郵件服務器身份
|
HELP<command>
|
查詢服務器支持什么命令,返回命令中的信息
|
MAIL FROM<host>
|
在主機上初始化一個郵件會話
|
NOOP
|
無操作,服務器應響應OK
|
QUIT
|
終止郵件會話
|
RCPT TO<user>
|
標識單個的郵件接收人;常在MAIL命令后面可有多個rcpt to:
|
RSET
|
重置會話,當前傳輸被取消
|
SAML FROM<host>
|
發送郵件到用戶終端和郵箱
|
SEND FROM<host>
|
發送郵件到用戶終端
|
SOML FROM<host>
|
發送郵件到用戶終端或郵箱
|
TURN
|
接收端和發送端交換角色
|
VRFY<user>
|
用於驗證指定的用戶/郵箱是否存在;由於安全方面的原因,服務器常禁止此命令
|
SMTP協議工作原理
SMTP是工作在兩種情況下:一是
電子郵件從客戶機傳輸到服務器:二是從某一個服務器傳輸到另一個服務器。
SMTP也是個請求/響應協議,命令和響應都是基於
ASCⅡ文本,並以
CR和
LF符結束。響應包括一個表示返回狀態的三位數字代碼。
SMTP在
TCP協議25號
端口監聽連續請求。
smtp連接和發送過程
(1)建立TCP 連接。
(2)
客戶端發送HELO命令以標識發件人自己的身份,然后客戶端發送MAIL命令;服務器端正希望以OK作為響應,表明准備接收。
(4)協商結束,發送郵件,用命令DATA發送。
(5)以“.”號表示結束輸入內容一起發送出去,結束此次發送,用QUIT命令退出。
SMTP協議的郵件路由過程及個人SMTP郵件服務器簡單配置
SMTP協議的郵件路由過程
SMTP服務器基於
域名服務DNS中計划收件人的域名來
路由
電子郵件。SMTP服務器基於DNS中的MX記錄來路由
電子郵件,MX記錄注冊了域名和相關的SMTP中繼
主機,屬於該域的電子郵件都應向該主機發送。若SMTP服務器 mail.abc.com收到一封信要發到shuer@sh.abc.com,則執行以下過程:
(1)Sendmail 請求DNS給出
主機sh.abc.com的CNAME 記錄,如有,假若CNAME(別名記錄)到shmail.abc.com,則再次請求shmail.abc.com的CNAME記錄,直到沒有為止。
(2)假定被CNAME到shmail.abc.com,然后sendmail請求@abc.com域的DNS給出shmail.abc.com的MX記錄(郵件
路由及記錄),shmail MX 5 shmail.abc.com10 shmail2.abc.com。
(3)Sendmail組合請求DNS給出shmail.abc.com的A記錄(
主機名(或域名)對應的IP地址記錄),即IP地址,若返回值為1.2.3.4(假設值)。
(4)Sendmail與1.2.3.4連接,傳送這封給shuser@sh.abc.com的信到1.2.3.4 這台服務器的SMTP后台程序。
個人SMTP郵件服務器簡單配置
一、安裝POP3和SMTP服務組件
Windows Server 2003默認情況下是沒有安裝POP3和SMTP服務組件的,因此我們要手工添加。
1.安裝
POP3服務組件
以系統管理員身份登錄Windows Server 2003 系統。依次進入“
控制面板→
添加或刪除程序→添加/刪除Windows組件”,在彈出的“Windows組件向導”對話框中選中“
電子郵件服務”選項,點擊“詳細信息”按鈕,可以看到該選項包括兩部分內容:POP3服務和POP3服務Web管理。為方便用戶遠程Web方式管理
郵件服務器,建議選中“POP 3服務Web管理”。
2.安裝SMTP服務組件
選中“應用程序服務器”選項,點擊“詳細信息”按鈕,接着在“Internet信息服務(IIS)”選項中查看詳細信息,選中“SMTP Service”選項,最后點擊“確定”按鈕。此外,如果用戶需要對
郵件服務器進行遠程Web管理,一定要選中“萬維網服務”中的“遠程管理(HTML)”組件。完成以上設置后,點擊“下一步”按鈕,系統就開始安裝配置POP3和SMTP服務了。
二、配置POP3服務器
1.創建郵件域
點擊“開始→管理工具→POP3服務”,彈出POP3服務控制台窗口。選中左欄中的POP3服務后,點擊右欄中的“新域”,彈出“添加域”對話框,接着在“域名”欄中輸入
郵件服務器的域名,也就是郵件地址“@”后面的部分,如“MAIL.COM”,最 后點擊“確定”按鈕。
2.創建用戶郵箱
選中剛才新建的“MAIL.COM”域,在右欄中點擊“添加郵箱”,彈出添加郵箱對話框,在“郵箱名”欄中輸入郵件用戶名,然后設置用戶密碼,最后點擊“確定”按鈕,完成郵箱的創建。
三、配置SMTP服務器
完成POP3服務器的配置后,就可開始配置SMTP服務器了。點擊“開始→程序→管理工具→Internet信息服務(IIS)管理器”,在“IIS管理器”窗口中右鍵點擊“默認SMTP
虛擬服務器”選項,在彈出的菜單中選中“屬性”,進入“默認SM TP虛擬服務器”窗口,切換到“常規”標簽頁,在“IP地址”下拉列表框中選中
郵件服務器的IP地址即可。點擊“確定”按鈕,此時SMTP服務器默認的是匿名訪問,打開切換到“訪問”標簽頁,點擊“
身份驗證”按鈕,在對話框中去掉“匿名訪問“選項,選中”基本身份驗證(Basic authentication)“。這樣一個簡單的
郵件服務器就架設完成了。
[1]
3SMTP服務擴展編輯
smtp服務的意義
SMTP提供一種可靠的有效的傳送機制,它用於傳送
電子郵件。雖然十幾年來,它的作用已經有目共睹,可是對它功能的擴充也是必不可少的。對SMTP服務的擴展我們介紹一下:在SMTP轉發的郵件中包括信封和內容這兩種東西。我們寫信也寫信封和信皮,我們可以借生活中的信件來幫助理解。
(1)SMTP信封比較容易理解,它被作為一系列的SMTP協議單元傳送,它包括發送者地址,傳送模式,還有一個或多個接收者地址。如果有不清楚的地方,請參閱《SMTP協議標准》。
(2)至於內容,它是由兩部分組成的,一部分是信頭,一部分是信體,信頭是由一個個的域/值對(一個域,一個值)組成的,如果信體有結構的話,它的結構是以MIME構造的。內容從根本上來說是文本的,一般也是由ASCII碼構成的,但是由於使用了MIME,所以這個限制應該也是沒有了,但信頭卻不行,一般都應該使用ASCII碼表示。雖然SMTP協議是一個不錯的協議,可是對它的擴展還是不可避免,本文主要說明了一種擴展方法,使用這種擴展方法,服務器和用戶之間可以相互知道對方使用了擴展,使用了多少,如果進行通信。
這里我們希望讓大家知道
網絡協議中的一個經驗:
參數越多,死得越快;參數越少,越能持久。
參數太多了,根本不利於使用,無法推廣,早晚會被別的協議取代。這也符合科學的基礎原理,簡單。這說明在實現時一定要小心,如果不小心會便得到的遠遠小於付出的,有時根本不能提供任何益處。
EHLO命令
支持SMTP服務擴展的客戶應該以EHLO命令開始SMTP會話,而不是通常的HELO命令。如果服務器也支持,那就返回確認響應,如果不支持就返回失敗響應。因為引入了EHLO命令,因此會話開始的第一條命令可以是HELO或EHLO。
因此引入了新的參數,所以SMTP的MAILFROM和RCPTTO命令行長度也能再是512字節了,但是引入新參數的長度必須加以說明,以便實現者准備
緩沖區。
命令格式如下:
ehlo-cmd::="EHLO"SPdomainCRLF
在命令成功是,服務器返回代碼250,如果失敗返回代碼550,如果出錯,返500,501,502,504或421。對比《SMTP協議標准》,EHLO命令可以出現在任何HELO命令出現的地方,在成功發送一個HELO或EHLO命令后再次發送它會使服務器返回503。客戶這時不能
緩存服務器返回的任何信息。這里一定要注意的是,每次開始SMTP擴展服務會話的時候必須發送EHLO命令。如果服務器能夠處理EHLO命令,它會返回代碼250。這樣,服務器和客戶就處於初始狀態了,也就是說,所有的狀態表和
緩沖區已經准備完畢。通常這種響應是多行的,每行響應包括一個關鍵字,如果有的話,還有一個或多個參數,響應的語法如下:
ehlo-ok-rsp::="250"domain[SPgreeting]CRLF
/("250-"domain[SPgreeting]CRLF
*("250-"ehlo-lineCRLF)
"250"SPehlo-lineCRLF)
greeting::=1*<除了CR或LF的所有字符>
ehlo-line::=ehlo-keyword*(SPehlo-param)
ehlo-keyword::=(字母/數字)*(字母/數字/"-")
ehlo-param::=1*<隨了空格和
控制字符外的字符>
ALPHA::=<大寫A到Z,小寫A到Z>
DIGIT::=<0到9>
CR::=<回車,ASCII碼13>
LF::=<換行,ASCII碼10>
SP::=<空格,ASCII碼32>
雖然EHLO
關鍵字可以是大寫,小寫,大小寫混合的,但是對它的處理是大小寫敏感的,這是與原來規定不同的。IANA支持SMTP服務擴展注冊,相對於每個擴展都有一個相應的EHLO關鍵字值,每個在IANA注冊的服務擴展必須在一個RFC中定義。如果一個關鍵字以X開頭,它指的是這個服務擴展是雙方約定的,不是標准的。
如果出於某種原因,服務器不能列出它所支持的服務擴展,就返回代碼554。在接收到這個代碼后,客戶要么發送HELO,要么發送QUIT命令。有時候服務器接收到EHLO命令,可是命令參數不可接受,它就返回代碼501。如果服務器識別了EHLO,但對服務器擴展未實現,則返回代碼502。
如果服務器不再提供服務擴展,則返回代碼421。在接收到這個代碼后,客戶要么發送HELO,要么發送QUIT命令。如果服務器不支持服務擴展,則返回500,服務器保持現有狀態,在接收到這個代碼后,客戶要么發送HELO,要么發送QUIT命令。
有時候,SMTP服務器會在接收到EHLO命令后因為某種原因關閉連接,這種情況在原來的SMTP協議標准中未涉及。為了處理這種情況,客戶必須能夠確認服務器是否能夠工作,它可以重新連接並發送HELO或EHLO命令。有些服務器在接收到一個EHLO命令后會拒絕接收新的HELO命令,這時可以利用RSET命令重新啟動,然后再發送HELO。如果客戶不注意這樣的小細節,會收到失敗代碼。
下面我們來看一下MAILFROM和RCPTTO參數。許多服務擴展是在MAILFROM和RCPTTO命令后加入一些參數來實現的。下面我們看一下這兩個命令的格式:
esmtp-cmd::=inner-esmtp-cmd[SPesmtp-parameters]CRLF
esmtp-parameters::=esmtp-parameter*(SPesmtp-parameter)
esmtp-parameter::=esmtp-keyword["="esmtp-value]
esmtp-keyword::=(字母/數字)*(字母/數字/"-")
esmtp-value::=1*<除了空格,"="和控制字符的所有字符>
inner-esmtp-cmd::=("MAILFROM:"返回路徑)/("RCPTTO:"轉發路徑)
如果服務器不能識別或實現一個或多個MAILFROM或RCPTTO參數,它應該返回代碼555。如果這種情況只是暫時的,服務器返回代碼455。其它返回代碼請查閱相關資料,這里不再詳述了。服務器以服務擴展處理時,它處理的任何信息都應該在
包頭上加上“服務擴展標記”以示區別。
下面是一個例子:
(1)雙方交互:S是服務器,C是客戶。
S:<等待連接在TCP端口25>
C:<連接到服務器>
S:220dbc.mtview.ca.usSMTPserviceready
C:EHLOymir.claremont.edu
S:250dbc.mtview.ca.ussayshello
...
(2)下面也是一個例子:
S:<等待連接在TCP端口25>
C:<連接到服務器>
S:220dbc.mtview.ca.usSMTPserviceready
C:EHLOymir.claremont.edu
S:250-dbc.mtview.ca.ussayshello
S:250-EXPN
S:250-HELP
S:250-8BITMIME
S:250-XONE
S:250XVRB
...
這說明服務器實現了服務擴展EXPN和HELP,這兩個是標准的服務擴展,另外兩個以X開頭的是非標准的。
(3)最后,我們來看看服務器不支持服務擴展時的情況:
S:<等待連接在TCP端口25>
C:<連接到服務器>
S:220dbc.mtview.ca.usSMTPserviceready
C:EHLOymir.claremont.edu
S:500Commandnotrecognized:EHLO
...
代碼500表示服務器不支持服務擴展。