用SMTP/POP3訪問郵箱暨SMTP/POP3原理
Exchange早期版本設計時側重於在企業內部提供郵件服務,郵件傳輸以MAPI爲主;Exchange的後續版本增強了對Internet郵局的支持,現在Exchange2003可以作爲一個標準的Internet郵局爲用戶提供服務,也可以和互聯網上的其他Internet郵局進行交互。本文我們將介紹以下內容:
一 如何用Outlook Express作客戶端軟件,通過SMTP,POP3協議訪問郵箱
二 Exchange和其他互聯網郵局通信時注意事項
三 SMTP,POP3原理分析
四 ESMTP
五 BASE64編碼
實驗拓撲如下圖,Florence是域控制器和CA服務器,Berlin是Exchange服務器,Istanbul是客戶機
一 如何用Outlook Express作客戶端軟件,通過SMTP,POP3協議訪問郵箱
標準的互聯網郵局包括SMTP和POP3兩個組件,SMTP負責郵件的出站/入站,POP3負責郵件存儲。我們可以利用SMTP把郵件發送出去,也可以利用POP3從自己的郵箱中下載郵件。Exchange2003的SMTP來源於Win2003中的IIS,POP3倒是和Win2003的POP3服務沒有任何關係。Exchange2003的POP3服務默認是禁用狀態,所以首先要啓動POP3服務。在Exchange服務器上,開始-管理工具-服務,找到“Microsoft Exchange POP3” 服務,將POP3服務的啓動類型改爲自動,然後啓動POP3服務。
這時Exchange服務器已經可以提供SMTP和POP3服務了,我們在客戶機Istanbul上,以Outlook Express(以後簡稱OE)作爲客戶端軟件,測試一下SMTP和POP3的訪問狀況。啓動OE後,在工具菜單中選擇賬戶,在“郵件”標籤下,選擇 添加“郵件”
填寫郵件發送者的名稱,在此我們填寫一個用戶名,如下圖所示
接下來要寫用戶的郵件地址
最重要的參數,分別對SMTP和POP3服務器進行描述,可以用NETBIOS名稱,域名或是IP地址
輸入用戶名和口令就可以完成郵件賬號的設置了
配置完郵件賬戶後,啓動OE,點擊“創建郵件”,給administrator發一封測試信看看
,如下圖所示
看看管理員的郵箱,是不是已經收到信了,這證明SMTP工作正常。
管理員回封信,看看dufei能否收到,在 OE的“發送/接收”下拉菜單中選擇“接收全部郵件”,看看收件箱裏有沒有回信,如下圖所示,已收到回信,POP3工作正常。
二 Exchange和其他互聯網郵局通信時注意事項
做完上述操作後,我們在Exchange郵局內部已經可以正常使用SMTP,POP3了,但要和其他的互聯網郵局通信還需要注意以下兩點:
1 設置DNS中的MX記錄
2 設置SMTP服務器的中繼
如果DNS服務器中沒有正確設置MX記錄,那麼我們的郵局將無法收到其他郵局發來的郵件。SMTP服務器向其他郵局發送郵件時,要通過查詢DNS的MX記錄來定位接收郵局的郵件服務器,否則互聯網上這麼多主機,SMTP服務器怎麼知道哪臺可以接收郵件?早期的電子郵件地址格式是郵箱名@郵件服務器名,這種郵件地址中已經包含了郵件服務器的完全合格域名,因此SMTP服務器直接將郵件發送給郵件服務器就可以了。現在的電子郵件地址格式改成了郵箱名@域名,不再直接指明接收郵件的服務器,因此SMTP服務器就只能依靠MX記錄來定位接收郵件服務器了。
Exchange服務器中的SMTP中繼默認對所有未通過身份驗證的用戶都是禁用的,所以如果我們向向外網發一封郵件,例如發到[email protected],我們會看到如下圖錯誤提示,提示中明確指出 “Unable to relay”,不能中繼。那如何修改設置呢?
在Exchange服務器上,開始-程序-Microsoft Exchange-系統管理器-服務器-協議-SMTP-默認SMTP虛擬服務器-屬性-訪問-中繼,如下圖
當前的中繼設置如下圖所示,只有通過身份驗證的郵件發送者纔可以將郵件中繼到其他郵局
修改中繼設置,允許192.168.2.0子網內的計算機進行郵件中繼,不要設置成允許任何人進行郵件中繼,那會招致大量的垃圾郵件發送
改完中繼設置後,重啓SMTP服務,可以把信發往其他的互聯網郵局了。
三 SMTP,POP3原理分析
我們用SMTP,POP3在互聯網上進行郵件收發,郵件傳遞的過程是什麼樣的?我們假設163郵局的User1準備給263郵局的User2發信,大致過程如下
1 User1通過郵件客戶端軟件用SMTP協議把待發郵件提交到163郵局的SMTP服務器
2 163郵局的SMTP服務器通過查詢DNS的MX記錄,定位263郵局的郵件服務器,然後通過SMTP協議把郵件中繼到263郵局的SMTP服務器
3 263郵局的SMTP服務器將郵件入站後,把郵件轉給POP3服務器
4 POP3服務器把郵件存儲在User2的郵箱中
5 User2利用郵件客戶端軟件通過POP3協議訪問263郵局的POP3服務器,並從自己的郵箱中把郵件下載到本機計算機
接下來我們具體分析一下第一步和第五步,看看OE如何利用SMTP協議提交郵件,以及如何利用POP3協議訪問郵箱。
先分析SMTP,根據RPC821,SMTP協議提供了一些簡單的四個字符原語操作指令,OE就利用了這些指令發送郵件。常用的SMTP命令有
HELO :發件方問候收件方,後面是發件人的IP地址或計算機名。收件方回答OK時標識自
己的身份。問候和確認過程表明兩臺機器可以進行通信。
MAIL FROM: 這個命令用來開始傳送郵件,命令後面的參數是發件人郵件地址。
RCPT TO: 這個命令告訴收件方收件人的郵箱。當有多個收件人時,需要多次使用該命令,
每次只能指明一個人。
DATA :收件方把該命令之後的數據作爲發送的數據,數據被加入數據緩衝區中。
RSET :這個命令用來通知收件方復位,所有已存入緩衝區的收件人數據,發件人數據和待
傳送的數據都必須清除,接收放必須回答OK。
NOOP :空操作,不影響任何參數,只是要求接收方回答OK
QUIT :SMTP要求接收放必須回答OK,然後中斷傳輸
OE發送郵件時,首先連接郵件服務器的25端口,我們在命令行下模擬這個過程
telnet berlin 25
Helo Istanbul (客戶端進行自我介紹,我的名字是Istanbul)
rcpt to:[email protected] (客戶機描述這封信的收件地址)
data (客戶機表示要開始輸入信件內容)
subject:mail test! (客戶機輸入郵件主題 mail test!)
Just testting! (客戶機輸入郵件內容 Just testting!)
敲一下回車 敲一下.(點) 再敲一下回車 郵件內容結束,郵件開始進入發送隊列
上述過程如下圖所示:
檢查一下管理員的郵箱,有沒有收到這樣一封信,如下圖所示,真的收到了,而且以爲是sina的管理員發來的,要記住,郵件是很容易欺騙的。
這樣我們就用SMTP命令發了一封電子郵件,是不是很簡單呢?其實我們可以來看一下OE發信的過程,打開OE,在 “工具”菜單中選擇“選項”,點擊“維護”標籤,在疑難解答下選擇“郵件”,這樣OE發送郵件時的過程會記錄在日誌文件中供我們分析使用。
在OE中發送一封郵件,測試一下。
郵件發出去了,檢查下圖路徑中的smtp.log,這就是發送郵件時的日誌文件
打開日誌文件,裏面記錄了OE與SMTP服務器交互的全過程,[rx]代表OE收到的數據,[tx]代表OE發出的數據,仔細看看,OE作的操作和我們剛剛在命令行中作的完全一樣。
我們再來分析一下OE利用POP3協議從Exchange郵件服務器收信的過程,POP3和SMTP類似,根據RFC1939也定義了一些四字符的原語命令,常用的POP3命令有
USER : 輸入郵箱名
PASS : 輸入郵箱密碼
STAT : 顯示郵箱狀態
LIST : 列出郵箱中的郵件
RETR : 讀取郵件內容
DELE: 將郵件標記爲刪除
NOOP : 空操作,僅返回一個迴應
RSET: 中斷當前操作,將標記爲刪除的郵件恢復
QUIT 退出POP3會話
STAT : 顯示郵箱狀態
LIST : 列出郵箱中的郵件
RETR : 讀取郵件內容
DELE: 將郵件標記爲刪除
NOOP : 空操作,僅返回一個迴應
RSET: 中斷當前操作,將標記爲刪除的郵件恢復
QUIT 退出POP3會話
我們舉例從dufei郵箱收信,我們使用下列指令
telnet berlin 110
user dufei (準備訪問dufei的郵箱)
pass passW0rd (輸入dufei的郵箱口令)
list (列出郵箱中的郵件)
Retr 1 (顯示第一封郵件的內容)
dele 1 (刪除第一封郵件)
quit (退出)
過程如下圖所示,有興趣的話大家可以結合OE中的POP3日誌進行分析。
四 ESMTP
從前面的SMTP原理分析中我們可以看出,SMTP在設計時完全沒有考慮安全問題,任何人都可以很方便地利用SMTP服務器發送郵件,這種處於安全真空的設計在互聯網的初期是成立的,畢竟那時無孔不入的商業還不曾***進這片專屬於科研人員的淨土。但現在如果在公網上放置這麼一個服務器,那肯定會後果很嚴重,垃圾郵件立刻就會把你淹沒。因此,ESMTP對SMTP進行了升級,主要是在郵件的發送過程中支持身份驗證,而且在傳輸郵件內容時也支持用SSL進行加密,大大提高了安全性。
在Exchange中把SMTP升級到ESMTP很容易,只要在SMTP服務器上禁止匿名訪問,再選擇一種身份驗證方式就可以了。在Exchange服務器上,開始-程序-Microsoft Exchange-系統管理器-服務器-協議-SMTP-默認SMTP虛擬服務器-屬性-訪問-身份驗證,如下圖所示
我們取消“匿名訪問”和“集成Windows身份驗證”,只保留“基本身份驗證“,現在這就是一臺ESMTP服務器了,重新啓動SMTP服務,然後在Istanbul上我們發送一封郵件測試一下,如下圖所示,發信出問題了,錯誤提示告訴我們由於沒有進行身份驗證,我們沒有權限進行郵件發送
既然要求身份驗證,那我們就滿足這個條件,在OE的工具菜單中選擇賬戶,點擊郵件標籤,查看郵件賬戶的屬性,如下圖所示,勾選“我的服務器要求身份驗證”,點擊“設置”
在設置中,我們填寫了用戶名和口令,再來試試,發出去了!
調出日誌smtp.log查看一下發送細節,看到了一個奇怪的現象,如下圖紅框標示處顯示的是用戶名,但我們填寫的用戶名是dufei,怎麼在這裏成了ZHVmZWk=?不要着急,這就是我們下面要講到的BASE64編碼
五 BASE64編碼
BASE64編碼其實很簡單,它把常用的64個字符重新做了個編碼表。每個BASE64編碼用6個2進制數表示,BASE64的編碼表如下
1 B 18 S 35 j 52 0
3 D 20 U
4 E 21 V
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J
10 K 27 b 44 s 61 9
13 N 30 e 47 v
14 O
15 P
16 Q 33 h 50 y
從ASCII碼向BASE64的轉換過程中,ASCII碼會每3個爲一組轉換爲4個BASE64編碼,因爲每個ASICC碼爲8位二進制數,3×8=24,每個BASE64編碼是6位二進制數,24÷6=4。
如果ASCII碼字符不正好是3的倍數,例如dufei是5個ASCII碼,這該怎麼辦呢?系統會自動用0進行填充,將ASCII碼湊成3的倍數。如果有1個ASCII碼是被填充的,BASE64編碼中會出現一個=符號,如果有2個ASCII嗎是被填充的,BASE64編碼中會出現兩個=號,不可能有三個=出現的,大家仔細想想爲什麼?
以dufei爲例,dufei的ASCII碼爲 100 117 102 101 105, ASCII碼爲100 117 102 101 105 。展開成二進制是 01100100 01110101 01100110 01100101 01101001,每6個一組形成BASE64編碼是 011001 000111 010101 100110 011001 010110 1001,由於dufei只有5個ASCII碼,系統會用0填充爲6個ASICC碼,填充的結果是011001 000111 010101 100110 011001 010110 100100 000000,藍色部分爲系統填充內容。用10進製表示就是 25 7 21 38 25 22 36 ,查詢BASE64編碼表 可知分別對應 ZHVmZWK,最後那個由填充產生的000000用一個=表示。所以最後我們看到的BASE64編碼是ZHVmZWk= 。