现在的位置: 首页 > 综合 > 正文

网络协议研究(三)IMAP

2012年08月21日 ⁄ 综合 ⁄ 共 3390字 ⁄ 字号 评论关闭

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是一个开源的组件,实现了很多协议,源代码是学习网络协议的不错的参考资料。


 

 

测试代码:

 

        private static void fnIMAPDemo()
        {
            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"993true);
                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 ServerMySQLPgSQL数据库,安装时需要注意一下,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下可以快速的搭建一个小型的企业级邮件服务器,给很多中小企业带来了福音。

抱歉!评论已关闭.