网络协议研究(二)POP3
来源:互联网 发布:远程木马监控软件 编辑:程序博客网 时间:2024/05/17 07:30
上一次我们详细讨论了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的介绍请参阅后续篇章。
- 网络协议研究(二)POP3
- POP3协议详细介绍(二)
- POP3协议详细介绍(二) .
- POP3、SMTP、IMTP4协议的研究分析
- JavaMail邮件开发-体验smtp和pop3协议(二)
- 网络协议(二)
- 网络协议(二)
- 网络编程之POP3协议邮箱收信
- POP3协议
- pop3协议
- POP3协议
- POP3协议
- pop3协议
- POP3协议
- pop3协议
- 【网络协议】互联网协议入门(二)
- 【网络协议】互联网协议入门(二)
- 【网络协议】互联网协议入门(二)
- Android布局属性全面剖析
- 字段类型的存储(char和varchar)比较
- 【转贴】如何在C++中集成Lua脚本(LuaPlus篇)
- longint/int64上需要注意的
- JVMTI使用方案-C++
- 网络协议研究(二)POP3
- Oracle误删除表数据后的恢复详解
- 使用AppWidgetProvider类
- Statement、PreparedStatement和CallableStatement
- String.format一些用法例子、功能强
- 【翻译】使用IPython增强交互式体验
- "0x0055cde3"指令引用的内存"0x0000ffff"
- android之MultiAutoCompleteTextView控件的使用
- 类方法、作用域