天道酬勤

博观而约取,厚积而薄发!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Snake.Net网络通讯模块 - IMAP4(三) (转载)

Posted on 2010-04-27 23:15  Happy Coding  阅读(323)  评论(0编辑  收藏  举报

原文地址:http://www.cnblogs.com/soulroom/archive/2005/09/12/234710.html 作者: Bruce

 

本页内容

简介
与IMAP4服务器的连接
IMAP4服务器的目录操作
在服务器上保存新邮件
下载邮件头部信息
下载邮件
设置邮件标识
删除邮件

 

 

简介

IMAP是Internet Message Access Protocol的缩写,顾名思义,主要提供的是通过Internet获取信息的一种协议。IMAP象POP那样提供了方便的邮件下载服务,让用户能进行离线阅读,但IMAP能完成的却远远不只这些。IMAP提供的摘要浏览功能可以让你在阅读完所有的邮件到达时间、主题、发件人、大小等信息后才作出是否下载的决定。
在命名空间Eastasp.Framework.Net.Mail.Imap4下,Snake.Net提供一系列类和函数,可以为开发者提供全面而完善的使用IMAP4协议接受邮件的功能。现在主要介绍Imap4Client和Imap4Express两个类是如何实现发送邮件的功能。



与IMAP4服务器的连接
下面的代码简单演示了如何与一个IMAP4服务器建立连接并选择Inbox目录为当前工作目录

//declare
Imap4Client client;

client = new Imap4Client(new Imap4Server("imap.mailserver.com", "user", "password"));

try
{
         client.Open();
         client.Capability();
         client.Noop();

         client.Select("inbox");
         client.Examine("inbox");
}

finally
{
         if(client != null){
                   client.Close();
                   client = null;
         }
}

IMAP4服务器的目录操作

Imap4Express类提供了全面的命令用于支持对IMAP4服务器上目录进行各项操作,下面依次介绍这些命令

Create 在当前目录下创建目录
Rename 变更目录名称
Delete 删除目录
Select 选择目录,将选择的目录设置为当前工作目录
Examine 检查目录, 将返回选择的目录的信息
Subscribe 订阅目录,被订阅的目录将在LSub命令下列出
Unsubscribe 取消订阅的目录
List 列出所有目录
LSub 列出被订阅的目录
Status 列出当前目录下的邮件信息。此方法将返回一个IDirectory实例,用于描述各类信息的计数。

//declare
Imap4Client client;
Imap4MailBox[] boxes;
IDictionary status;

client = new Imap4Client(new Imap4Server("imap.mailserver.com", "user", "password"));

try
{
         client.Open();
         client.Select("inbox");
         client.Examine("inbox");

         //create mailbox
         client.Create("aa");

         //rename mailbox
         client.Rename("aa", "bb");

         //select mailbox
         client.Select("bb");

         //subscribe and unsubscribe mailbox
         client.Subscribe("bb");
         client.Unsubscribe("bb");

         //delect mailbox
         client.Delete("bb");


         //list all mailbox

         boxes = client.List(string.Empty);

         for(int i = 0; i < boxes.Length; i++){
                   Console.WriteLine("{0}:\t{1}", boxes[i].Name, boxes[i].Attribute);
         }

         //list all subscribe mailbox
         boxes = client.LSub(string.Empty);
         for(int i = 0; i < boxes.Length; i++){
                   Console.WriteLine("{0}:\t{1}", boxes[i].Name, boxes[i].Attribute);
         }

         //show selected mailbox status
         status = client.Status("inbox",
                   new Imap4StatusItem[]{
                        Imap4StatusItem.Messages,
                        Imap4StatusItem.Recent,
                        Imap4StatusItem.UnSeen});

         //output
         foreach(object key in status.Keys){
                   Console.WriteLine("{0}:\t{1}", key, status[key]);
         }
}

finally
{
         if(client != null){
                   client.Close();
                   client = null;
         }
}                


在服务器上保存新邮件


IMAP4提供Append命令用于将新邮件保存到服务器上,请参见下列演示代码。

//declare
Imap4Client client = null;
HtmlMessageBuilder builder = null;

client = new Imap4Client(new Imap4Server("imap.mailserver.com", "user", "password"));


try
{
         client.CharSet = System.Text.Encoding.GetEncoding("gb2312");
         client.Open();

         builder = new HtmlMessageBuilder(
                   Address.Parse("to@mailserver.com"),
                   Address.Parse("from@ mailserver.com "));
         builder.Subject = "html test subject";
         builder.Body = "<html><body><p>test body</p></body></html>";
         client.Append(builder.ToMessage(), "inbox", Imap4Flags.Seen);
}

finally
{
         if(client != null){
                   client.Close();
                   client = null;
         }
}     

下载邮件头部信息

IMAP4对比POP3协议最大的优点是可以离线浏览邮件,而且可以获取指定邮件的到达时间、主题、发件人、大小等信息后才作出是否下载的决定。Imap4Client提供GetHeaders方法获取邮件头部内容。请看下列演示代码:

//declare
Imap4Client client;
Imap4MessageHeader[] headers = null;

client = new Imap4Client(new Imap4Server("imap.mailserver.com", "user", "password"));

try
{
         client.CharSet = System.Text.Encoding.GetEncoding("gb2312");
         client.Open();
         client.Select("inbox");
         headers = client.GetHeaders(1, int.MaxValue, false);
}

finally
{
         if(client != null){
                   client.Close();
                   client = null;
         }
}


下载邮件

从IMAP4服务器上接受邮件可以根据邮件的顺序号也可以根据邮件的唯一标识来获取。顺序号标识邮件在当前目录下当前所存在的所有邮件存在的顺序编号。而唯一记录表示当邮件被邮件服务器接受后就将获取一个唯一标识,这个标识在整个服务器上是唯一的,无论它是否被删除或者未被删除,这对于离线处理的客户端程序来说是相当有用的。Imap4Client对于这两种方式下载邮件都支持。
Imap4Client提供两个方法GetMessage和SaveMessage用于下载邮件,前者将根据顺序号或唯一标识返回一个Message对象,后者将邮件保存到指定文件。请参看演示代码。

//declare
string
path;
Imap4Client client;
Imap4MessageHeader[] headers;

path = @"c:\imap4mails";

if
(!System.IO.Directory.Exists(path)) System.IO.Directory.CreateDirectory(path);

client = new Imap4Client(new Imap4Server("imap.mailserver.com", "user", "password"));


try
{
         client.Open();
         client.Select("inbox");

         headers = client.GetHeaders(1, int.MaxValue, false);
         for(int i = 0; i < headers.Length; i++){
                   try{
                            client.SaveMessage(headers[i].Uid, true, string.Format("{0}\\{1}.eml", path, headers[i].Uid), headers[i].Charset);
                   }
                   catch{continue;}
         }
}

finally
{
         if(client != null){
                   client.Close();
                   client = null;
         }
}

设置邮件标识

根据Imap4协议存放在服务器上邮件有6种状,分别是Seen, Answered, Flagged, Deleted, Draft和Recent。Imap4提供Store命令用于更改邮件状态。
Seen表示邮件已经被阅读。
Answered表示邮件已经被回复。
Flagged表示邮件是紧急的或者特别注意的。
Deleted表示邮件被标识为删除。
Draft表示邮件还没有写完,处于草稿状态。
Recent表示邮件刚刚被接受到目录内,这一属性无法被客户端更改。

请看下列演示代码:

//declare
Imap4Client client;

client = new Imap4Client(new Imap4Server("imap.mailserver.com", "user", "password"));


try
{
         client.Open();
         client.Select(”inbox”);

         client.Store(1, 3, Imap4StoreFlags.AddingSilent, Imap4Flags.Seen, false);
         client.Store(1, 3, Imap4StoreFlags.Adding, Imap4Flags.Deleted, false);
         client.Store(2, 4, Imap4StoreFlags.Fetch, Imap4Flags.Flagged, false);
}

finally
{
         if(client != null){
                   client.Close();
                   client = null;
         }

}

删除邮件

在上一节中讲述了如何将邮件标识为删除,但这时并未把邮件真正从服务器上删除,还需调用Expunge方法,将服务器上所有标识为删除的邮件删除。当然也可以调用Imap4Express类的DeleteMessages来实现快速删除邮件的功能。请看代码。

//declare
Imap4Client client;

client = new Imap4Client(new Imap4Server("imap.mailserver.com", "user", "password"));


try
{
         client.Open();
         client.Select(”inbox”);

         client.Store(1, 3, Imap4StoreFlags.Adding, Imap4Flags.Deleted, false);
         client.Expunge();
}

finally
{
         if(client != null){
                   client.Close();
                   client = null;
         }

}