网络协议研究(三)IMAP
IMAP(Internet Message Access Protocol,因特网邮件读取协议)是一个应用层协议,用来从本地邮件客户端访问远程服务器上的邮件。
IMAP和POP3是邮件访问最为普遍的Internet标准协议。事实上绝大多数现代的邮件客户端和服务器都对两者给予支持。IMAP现在的版本是"IMAP第四版第一次修订版"(IMAP4rev1),在RFC3501中定义。
相对于POP3,IMAP提供了一些重要的功能:
1、支持连接和断开两种操作模式。
2、支持多个客户同时连接到一个邮箱。
3、支持访问消息中的MIME部分和部分获取。
4、支持在服务器保留消息状态信息。
5、支持在服务器上访问多个邮箱。
6、支持服务器端搜索。
7、支持一个定义良好的扩展机制。
不像大多数旧的Internet协议,IMAP4原生支持加密注册机制。IMAP4中也支持明文传输密码。因为加密机制的使用需要客户端和服务器双方的一致,明文密码的使用是在在一些客户端和服务器类型不同的情况下(例如Microsoft Windows客户端和非Windows服务器)。使用SSL也可以对IMAP4的通信进行加密,通过将在SSL上的IMAP4通信通过993端口传输或者在IMAP4线程创建的时候声明 " " "、"STARTTLS"。
IMAP4使用端口143在TCP/IP连接上工作。
.NET 框架中没有封装IMAP的相关操作,故继续使用第三方组件LumiSoft.Net。
LumiSoft.Net是一个开源的组件,实现了很多协议,源代码是学习网络协议的不错的参考资料。
测试代码:
{
IMAP_Client client = new IMAP_Client();
FileStream log = new FileStream(@"C:\log.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
StreamWriter sw = new StreamWriter(log);
try
{
//连接邮件服务器通过传入邮件服务器地址和用于IMAP协议的端口号
client.Connect("imap.gmail.com", 993, true);
client.Login("mymbrooks", "******");
IMAP_Client_FetchHandler fetchHandler = new IMAP_Client_FetchHandler();
fetchHandler.Rfc822 += new EventHandler<IMAP_Client_Fetch_Rfc822_EArgs>(delegate(object s, IMAP_Client_Fetch_Rfc822_EArgs e)
{
MemoryStream storeStream = new MemoryStream();
e.Stream = storeStream;
e.StoringCompleted += new EventHandler(delegate(object s1, EventArgs e1)
{
storeStream.Position = 0;
Mail_Message mime = Mail_Message.ParseFromStream(storeStream);
sw.WriteLine(mime.BodyText);
});
});
//获取邮件
IMAP_SequenceSet seqSet = new IMAP_SequenceSet();
seqSet.Parse("1:*");
IMAP_r_u_List[] list = client.GetFolders(null);
foreach (IMAP_r_u_List l in list)
{
client.SelectFolder(l.FolderName);
client.Fetch(
true,
seqSet,
new IMAP_Fetch_DataItem[]{
new IMAP_Fetch_DataItem_Rfc822()
},
fetchHandler
);
}
}
catch
{
}
finally
{
sw.Flush();
sw.Close();
log.Close();
}
}
我将Gmail中的邮件写入到了C:\log.txt文件里:
hMail Server 配置
hMail Server 是Windows下的一款免费邮件服务器,支持SMTP、POP3、IMAP协议,官方主页:http://www.hmailserver.com/
我使用的是最新测试版:hMailServer 5.3.4 - 1913
支持SQL Server、MySQL、PgSQL数据库,安装时需要注意一下,SQL Server很简单,若使用的MySQL,需要将MySQL x86 lib目录下的一个dll复制过去,PgSQL 我在Windows Server 2008 R2 SP1上无法安装成功,有点bug。
首先添加一个domain:
由于只是测试,我使用了127.0.0.1,添加了两个测试账户:user1@127.0.0.1、user2@127.0.0.1。
配置一下 SMTP、POP3、IMAP协议:
其他选项默认即可,可扩展性很强,可以配置访问规则、DNS、反病毒、日志等,功能很强大。结合DNS服务器完全可以当做一个小型的企业级邮件服务器使用。
配置好了服务端,下面配置一下客户端,我用的ThunderBird:
将刚才设置的user1、user2添加进来:
发送邮件试试:
可以看到,顺利收到了邮件:
小结:
IMAP是目前获取邮件的事实上的标准,绝大多数邮件服务提供商均支持加密的IMAP服务,建议在工作生活中使用IMAP(SSL、TLS)来收取邮件。LumiSoft.Net提供了大量封装好的组件,很有研究价值,有兴趣的朋友可以深入研究。最后简单介绍了下hMail Server的安装与配置,在Windows下可以快速的搭建一个小型的企业级邮件服务器,给很多中小企业带来了福音。