SMTP協議


SMTP協議
SMTP(Simple Mail Transfer Protocol)即 簡單郵件傳輸協議,是一種提供可靠且有效 電子郵件傳輸的協議。SMTP是建立在FTP 文件傳輸服務上的一種郵件服務,主要用於傳輸系統之間的郵件信息並提供與來信有關的通知。

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的作用

smtp這種方式下,郵件的發送可能經過從發送端到接收端路徑上的大量中間 中繼器網關 主機。域名服務系統( DNS)的郵件交換服務器可以用來識別出傳輸郵件的下一跳 IP地址。
Sendmail是最早實現 SMTP的郵件傳輸代理之一。到2001年至少有50個程序將 SMTP 實現為一個 客戶端(消息的發送者)或一個服務器(消息的接受者)。一些其他的流行的 SMTP服務器包括 Philip Hazel 的 exim,IBMPostfix,D.J.BernsteinQmail,以及 Mi crosoft Exchange Server.
由於這個協議開始是基於純 ASCⅡ文本的,在 二進制文件上處理得並不好。后來開發了用來編碼二進制文件的標准,如 MIME,以使其通過 SMTP來傳輸。今天,大多數 SMTP服務器都支持8位 MIME擴展,它使二進制文件的傳輸變得幾乎和純文本一樣簡單。
( 注意: SMTP是一個"推"的協議,它不允許根據需要從遠程服務器上“拉”來消息。要做到這點, 郵件客戶端必須使用 POP3IMAP上。另一個, 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Ⅱ文本,並以 CRLF符結束。響應包括一個表示返回狀態的三位數字代碼。 SMTPTCP協議25號 端口監聽連續請求。

smtp連接和發送過程

(1)建立TCP 連接。
(2) 客戶端發送HELO命令以標識發件人自己的身份,然后客戶端發送MAIL命令;服務器端正希望以OK作為響應,表明准備接收。
(3) 客戶端發送RCPT命令,以標識該 電子郵件的計划接收人,可以有多個RCPT行;服務器端則表示是否願意為收件人接收郵件。
(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表示服務器不支持服務擴展。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM