網絡協議研究(二)POP3
上一次我們詳細討論了SMTP的方方面面,作為郵件發送中的基礎協議,SMTP發揮了巨大的作用,是目前發送郵件的標準。SMTP是一個推送協議,將報文從用戶推送到服務器。為了讀取郵件,我們還需要將郵件拉取到客戶,即今天研究的POP3和下一次將測試的IMAP。
POP3,全名為"Post Office Protocol - Version 3",即"郵局協議版本3"。是TCP/IP協議族中的一員,由RFC 1939 定義。本協議主要用于支持使用客戶端遠程管理在服務器上的電子郵件。提供了SSL加密的POP3協議被稱為POP3S。
POP 協議支持"離線"郵件處理。其具體過程是:郵件發送到服務器上,電子郵件客戶端調用郵件客戶機程序以連接服務器,并下載所有未閱讀的電子郵件。這種離線訪問模式是一種存儲轉發服務,將郵件從郵件服務器端送到個人終端機器上,一般是 PC 機或 MAC。一旦郵件發送到 PC 機或 MAC 上,郵件服務器上的郵件將會被刪除。但目前的POP3郵件服務器大都可以"只下載郵件,服務器端并不刪除",也就是改進的POP3協議。
一、POP3 RFCs
-
RFC 1939 - "Post Office Protocol - Version 3"
-
RFC 2195 - "IMAP/POP AUTHorize Extension for Simple Challenge/Response"
-
RFC 2449 - "POP3 Extension Mechanism"
-
RFC 1734 - "POP3 AUTHentication command"
-
RFC 2222 - "Simple Authentication and Security Layer (SASL)"
-
RFC 3206 - "The SYS and AUTH POP Response Codes"
-
RFC 2595 - "Using TLS with IMAP, POP3 and ACAP"
-
RFC 937 - "POST OFFICE PROTOCOL - VERSION 2"
-
RFC 918 - "POST OFFICE PROTOCOL"
二、POP3流程
三、獲取郵件并分析
.NET中沒有對POP3的相關操作進行封裝,故我采用了第三方解決方案,LumiSoft.Net類庫。
LumiSoft.Net是由Ivar Lumi開發的免費,開放源碼的.Net網絡協議庫,包含了DNS Client, FTP Client/Server, ICMP, IMAP Client/Server, MIME, NNTP, POP3 Client/Server, SMTP Client/Server等協議/規范的實現。你可以在這里下載所有的源碼/二進制文件/文檔,也可以在LumiSoft.Net Forum里獲取支持。
SVN:
https://svn.lumisoft.ee:8443/svn/LumiSoft_Net/
User: readonly
Password: readonly
還是打開VS2010,建立一個控制臺項目,寫入如下代碼:
代碼
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;
using LumiSoft.Net.Mime;
using LumiSoft.Net.POP3.Client;
using System.IO;
namespace POP3Demo
{
class Program
{
private void POP3Test()
{
using (POP3_Client pop3 = new POP3_Client())
{
//與Pop3服務器建立連接
pop3.Connect("pop.163.com", 110, false);
//驗證身份
pop3.Authenticate("undead_47@163.com", "******", false);
FileStream fs = new FileStream("mail.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
StreamWriter sw = new StreamWriter(fs);
//get all messages
foreach (POP3_ClientMessage info in pop3.Messages)
{
byte[] bytes = info.MessageToByte();
Mime mime = Mime.Parse(bytes);
sw.Write(mime.BodyText + "\n\n");
}
sw.Flush();
fs.Flush();
sw.Close();
fs.Close();
}
}
static void Main(string[] args)
{
Program p = new Program();
p.POP3Test();
}
}
}
打開WireShark,Filter輸入POP,運行代碼,可以看到相關的報文:
我將讀取的郵件保存在了mail.txt中:
四、POP3常見命令
以下對幾個常用的pop3命令作一個簡單的介紹:
|
命令 |
參數 |
狀態 |
描述 |
|
user |
username |
認可 |
此命令與下面的pass命令若成功,將導致狀態轉換 |
|
pass |
password |
認可 |
|
|
apop |
name,digest |
認可 |
一種安全傳輸口令的辦法,digest是md5消息摘要,執行成功導致狀態轉換,請參見RFC 1321 |
|
stat |
none |
處理 |
請求服務器發回關于郵箱的統計資料,如郵件總數和總字節數 |
|
uidl |
[msg#] |
處理 |
返回郵件的唯一標識符,pop3會話的每個標識符都將是唯一的 |
|
list |
[msg#] |
處理 |
返回郵件數量和每個郵件的大小 |
|
retr |
[msg#] |
處理 |
返回由參數標識的郵件的全部文本 |
|
dele |
[msg#] |
處理 |
服務器將由參數標識的郵件標記為刪除,由quit命令執行 |
|
rset |
none |
處理 |
服務器將重置所有標記為刪除的郵件,用于撤消dele命令 |
|
top |
[msg#],n |
處理 |
服務器將返回由參數標識的郵件前n行內容,n必須是正整數 |
|
noop |
none |
處理 |
服務器返回一個肯定的響應,不做任何操作。 |
|
quit |
none |
更新 |
退出 |
小結:
POP3目前也被幾乎所有郵件服務提供商所支持,國內除了新浪免費郵箱不支持POP3加密外,其他主流服務商均提供POP3加密。POP3很簡單,但是功能有限。如POP3不能在下載郵件之前檢查郵件的頭部、搜索郵件內容,無法自定義服務器郵箱等。而這些正是IMAP的優點,正因如此,目前廣泛使用的郵件協議為SMTP/IMAP,POP3并不常用。關于IMAP的介紹請參閱后續篇章。


浙公網安備 33010602011771號