協(xié)議介紹 :
電子郵件是一個非常有用和"古老"的應用 , 目前情況下 , 它遵循了三種協(xié)議 :
- SMTP協(xié)議
- 主要應用于發(fā)送郵件 , 全稱為 :
Simple Mail Transfer Protocol
- 主要應用于發(fā)送郵件 , 全稱為 :
- POP3協(xié)議
- 主要應用于接收郵件 , 全稱為 :
Post Office Protocol - Version 3
- 主要應用于接收郵件 , 全稱為 :
- IMAP協(xié)議
- 一種比SMTP和POP協(xié)議都要新的協(xié)議 , 支持更多的功能和操作(對郵件的搜索等) , 主要應用于郵件的接收
實戰(zhàn)一 : (利用Telnet/nc手動發(fā)送郵件)
- Windows環(huán)境下 : (可以使用Telnet命令)
- 首先我們需要打開Windows的Telnet功能 , 需要在
控制面板-程序-啟用或關(guān)閉Windows功能-Telnet客戶端
- 然后我們就可以使用Telnet命令 , 我們需要使用Telnet連接到我們的郵件服務器上 , 然后通過SMTP支持的命令進行郵件的發(fā)送
- 這里我們使用163郵箱的smtp服務器 , 服務器的地址 :
smtp.163.com
, 端口25
- 我們在命令行中輸入 :
telnet smtp.163.com 25
- 成功連接到163的SMTP服務器
- 這里需要了解的是SMTP協(xié)議是
Command/Response
模式的 , 這個和HTTP協(xié)議有一點不同 , HTTP 協(xié)議基于Request/Response
- 這個時候我們需要輸入命令(Command)
- 向服務器發(fā)送握手數(shù)據(jù)
HELO 163.com
- 向服務器請求登陸
AUTH LOGIN
- 輸入Base64編碼以后的用戶名
-
Base64(YourUsername)
注意這里的用戶名不包含@163.com
- 輸入Base64編碼以后的"密碼"
-
Base64(YourPassword)
注意這里的密碼并不是163郵箱的登陸密碼 , 而是需要你登陸網(wǎng)頁版的163郵箱打開SMTP服務的時候配置的密碼 - 如果這個時候服務器返回成功 , 則說明我們已經(jīng)成功登陸
- 然后我們就可以輸入發(fā)送郵件的命令了
- 首先需要設置發(fā)送方
-
MAIL FROM: <Your Email Address>
例如 : 你的郵箱是 sunshine@163.com , 那么這里你要輸入的就是MAIL FROM: <sunshine@163.com>
- 設置接收方
RCPT TO: <Receiver's Email Address>
- 然后輸入郵件 , 這里說的
郵件
包含兩個部分 , 郵件頭和郵件主 , 郵件頭中可以定義 :Subject , From , To
這些屬性 , 分別對應的就是 :主題 發(fā)件人 收件人
, 郵件頭結(jié)束以后需要添加一個空行 , 用于分割郵件頭和郵件正文(主體) , 注意這里郵件的主體在結(jié)束的時候需要在一個空行中鍵入一個英文的句號.
, 用來表示郵件已經(jīng)結(jié)束 , 最后鍵入回車換行即可提交給郵件服務器 , 加入郵件服務器的待發(fā)送隊列中 , 一般很快就會收到郵件Subject:Hello world! From:Your Email Address To:Receiver's Email Address Across the Great Wall we can reach every corner in the world. .
- 然后屏幕就會顯示發(fā)送狀態(tài) , 如果發(fā)送成功會有ok的字樣 , 如果發(fā)送失敗 , 也會有錯誤碼 , 我們可以根據(jù)這個錯誤碼去查詢失敗的原因然后修正
-
整個流程截圖如下 :
-
注意 : 下圖中的郵件頭和郵件主體(正文)之間少了一個空行 , 這樣的話會導致郵件的正文不能正常發(fā)送 , 發(fā)送后顯示正文為空 , 筆者之后才發(fā)現(xiàn) , 之前一直納悶這個問題 , 希望這張圖不要給大家誤導(已修復)
-
這個時候我們就可以查看我們的郵箱 , 這里我使用了自己的163郵箱 , 將發(fā)件人和收件人都填寫成了同一個 , 我們登陸看看有沒有成功收到郵件 :
- Linux環(huán)境下 : (可以使用Telnet/nc命令)
- Linux環(huán)境下 , 使用nc命令也是和Telnet非常類似 :
nc smtp.163.com 25
, 然后成功登陸163的SMTP服務器之后的操作就和Windows完全沒有區(qū)別了 , Telnet也是和Windows沒有任何區(qū)別 , 這里不再贅述
實戰(zhàn)二 : (利用Telnet/nc手動接收并操作郵件 , 例如獲取所有郵件/刪除某個郵件等)
這次我們還是利用剛才的那個郵箱 , 我們首先登陸網(wǎng)頁客戶端來看一下郵箱里面的郵件列表
我們可以看到收件箱里面總共有三封郵件
我們現(xiàn)在開始使用命令來連接郵件服務器 , 并獲取收件箱列表 , 同樣 , 由于Windows和Linux系統(tǒng)在這里的操作并沒有什么區(qū)別 , 這里就直接使用Windows下的Telnet客戶端進行演示 :
- 首先使用Telnet連接到郵件服務器(POP3)
-
Telnet pop3.163.com 110
POP3使用的默認端口是110 - 連接成功后 , 進入交互界面 , 由于這里我們需要獲取用戶的收件箱列表 , 因此肯定需要一個認證的過程
-
User:YourUsername
用戶名是明文 , 不需要Base64編碼, 注意不要添加多余的空格 -
Pass:yourPassword
密碼是明文 , 不需要Base64編碼, 注意不要添加多余的空格 - 如果認證成功的話 , 會有相應的提示 , 并且會顯示收件箱的郵件個數(shù) , 還有所有郵件的內(nèi)容長度總和
- 現(xiàn)在我們可以對郵件的列表進行獲取
List
- 這樣就會顯示收件箱中的所有郵件的編號和內(nèi)容長度
- 可以使用
Retr 郵件編號
來獲取郵件的內(nèi)容 , 包括郵件頭 , 郵件正文 - 可以使用
Dele 郵件編號
來刪除某個制定的郵件 , 注意 : 這里的刪除指的是 : 從服務器刪除 - 可以使用
Quit
退出并斷開與服務器的連接 -
截圖 :
關(guān)于POP3和SMTP協(xié)議的命令還有很多 , 這里只介紹了最簡單常用的幾個 , 大家有興趣可以參考Wiki上的介紹 , 很詳細 , 也可以去參考RFC的官方文檔
SMTP狀態(tài)碼 :
Code | 英文描述 | 中文描述 |
---|---|---|
211 | System status, or system help reply | 系統(tǒng)狀態(tài)或顯示系統(tǒng)幫助讲逛。 |
214 | Help message | 顯示系統(tǒng)幫助召川,通常用于顯示非標準命令的幫助螟蒸。 |
220 | Service ready | 服務就緒瑟慈。 |
221 | Service closing transmission channel | 服務關(guān)閉了傳輸通道薪寓。 |
250 | Requested mail action okay, completed | 所要求的郵件動作完成半醉,可以繼續(xù)郵件對話谚中。通常在EHLO/HELO命令后會通過“250-”來描述服務器所支持的特性饰恕。 |
251 | User not local; will forward to | 收件人非本地用戶牲览,將轉(zhuǎn)發(fā)到 墓陈。 |
354 | Start mail input; end with . | 開始接收郵件內(nèi)容輸入,以.(即單行一個點)結(jié)束輸入第献。 |
421 | Service not available, closing transmission channel | 無法提供正常服務贡必,關(guān)閉傳輸管道。郵件保留在本地庸毫,可能會嘗試重新投遞仔拟。通常這種情況發(fā)生在服務器遇到問題,必須關(guān)閉傳輸飒赃。 |
450 | Requested mail action not taken: mailbox unavailable | 所要求的郵件動作無法執(zhí)行:郵箱不可用利花。郵件保留在本地科侈,可能會嘗試重新投遞。通常這種情況發(fā)生在郵箱忙或被拒絕等炒事。 |
451 | Requested action aborted: local error in processing | 要求動作中斷:本地端發(fā)生錯誤臀栈。郵件保留在本地,可能會嘗試重新投遞挠乳。通常這種情況發(fā)生在系統(tǒng)投遞時遇到意外的錯誤权薯。 |
452 | Requested action not taken: insufficient system storage | 要求動作無法執(zhí)行:系統(tǒng)空間不足。郵件保留在本地欲侮,可能會嘗試重新投遞崭闲。通常這種情況發(fā)生在郵箱限額滿肋联。 |
500 | Syntax error, command unrecognized | 命令格式錯誤威蕉,不可識別。當命令行太長時也會發(fā)生這樣的錯誤橄仍。 |
501 | Syntax error in parameters or arguments | 命令參數(shù)錯誤韧涨。 |
502 | Command not implemented | 命令尚未實現(xiàn)。 |
503 | Bad sequence of commands | 錯誤的命令順序侮繁。 |
504 | Command parameter not implemented | 命令的參數(shù)尚未實現(xiàn)虑粥。 |
550 | Requested action not taken: mailbox unavailable | 所要求動作無法執(zhí)行:信箱不存在。不再嘗試投遞宪哩。 |
551 | User not local; please try | 收件人不屬于本地用戶娩贷,轉(zhuǎn)發(fā)到。不再嘗試投遞锁孟。 |
552 | Requested mail action aborted: exceeded storage allocation | 所要求的動作中斷:超出所分配的儲存空間彬祖。不再嘗試投遞。 |
553 | Requested action not taken: mailbox name not allowed | 所要求的動作未執(zhí)行:不接受該信箱品抽。通常發(fā)生在郵件地址錯誤储笑、被作為垃圾郵件拒收。不再嘗試投遞圆恤。 |
554 | Transaction failed | 傳輸失敗突倍。 |
參考資料 :