天道酬勤

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

Snake.Net网络通讯模块 - POP3(二) (转载)

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

原文地址:http://www.cnblogs.com/soulroom/archive/2005/09/09/233580.html

本页内容

简介
与POP3服务器的通讯
下载邮件
下载邮件到指定文件夹
下载邮件头部信息
删除邮件

 

 

简介

POP的全称是 Post Office Protocol ,即邮局协议,用于电子邮件的接收,它使用TCP的110端口,现在常用的是第三版 ,所以简称为 POP3。POP3仍采用Client/Server工作模式,。当客户机需要服务时,客户端的软件(OutlookExpress或FoxMail)将与POP3服务器建立TCP连接,此后要经过POP3协议的三种工作状态,首先是认证过程,确认客户机提供的用户名和密码,在认证通过后便转入处理状态,在此状态下用户可收取自己的邮件或做邮件的删除,在完成响应的操作后客户机便发出quit命令,此后便进入更新状态,将做删除标记的邮件从服务器端删除掉。到此为止整个POP过程完成。
在命名空间Eastasp.Framework.Net.Mail.Pop3下,Snake.Net提供一系列类和函数,可以为开发者提供全面而完善的使用POP3协议接受邮件的功能。现在主要介绍Pop3Client和Pop3Express两个类是如何实现发送邮件的功能。
 

与POP3服务器的通讯

让我们先来看一段代码,然后简单了解一下如何获取POP3服务器的信息。

//declare
Pop3Client client;
StatInfo statInfo;
ListInfo[] infoList;
UidInfo[] uidInfoList;

client = new Pop3Client(new Pop3Server("pop.mailserver.com", "user", "pass"));


try
{
         client.Open();

         //send noop comand
         client.Noop();

         //get box stat
        statInfo = client.Stat();

        //list mail
       infoList = client.List();
       uidInfoList = client.UidList();
}

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

从上面的代码中,我们可以看到,Pop3Client先与服务器连接,然后依次调用了三个方法Stat,List和UidList以获取服务器信息。接下来我们就简单叙述一下这三个方法的功能。
Stat方法是获取服务器上所有邮件的信息,它将返回一个StatInfo结构体,用于描述服务器上当前所有邮件的总数和占用空间。
List方法是获取服务器上单个邮件的序号(整数型)和占用空间,它将返回一个ListInfo结构体的数组。
UidList方法和List方法类似,不过返回的是单个邮件的唯一标识符(字符型)和占用的空间,它将返回一个UidInfo结构体的数组。

下载邮件

在上一节中我们了解了如何获取Pop3信箱的摘要信息,现在我们就要步入正题,如何接受邮件,请看下列演示代码。

//declare
Pop3Client client;

string
uid;
ListInfo[] infoList;
MailMessage.Message[] messages;

client = new Pop3Client(new Pop3Server("pop.mailserver.com", "user", "pass"));


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

         infoList = client.List();

         if (infoList.Length > 0){
                   messages = new MailMessage.Message[infoList.Length];
                   for(int i = 0; i < infoList.Length; i++){
                            uid = client.GetUid(infoList[i].Order);
                            messages[i] = client.GetMessage(infoList[i].Order);
                   }
         }
}

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

上面的代码我们可以看到接受邮件的过程是,先询问服务器获取一个邮件编号列表,然后根据邮件的制定编号获取邮件内容。上面的代码演示了POP3服务通讯的基本过程,在实际应用中我们不需要每次都那么麻烦,可以使用Pop3Express对象,实现一种跟简单的接受邮件方式。请看下面的代码:
 

//declare
MailMessage.Message[] messages;

messages = Pop3Express.GetAllMessages(

    new
Pop3Server("pop.mailserver.com", "user", "pass"),
    Pop3ReceiveMode.RecevieWithoutDelete);

利用Pop3Express只需调用GetAllMessages方法就可以简单实现,前段代码所实现的功能了。在这里我们要注意GetAllMessages方法的第二个参数recevieMode。它有三个值ReceiveAllThenDelete,ReceiveOneDeleteOne和RecevieWithoutDelete。顾名思义ReceiveAllThenDelete表示等下载完所有邮件在删除所有邮件,ReceiveOneDeleteOne表示下载一封邮件就删除一封邮件,RecevieWithoutDelete表示仅仅下载邮件并不对它执行删除行为。

下载邮件到指定文件夹

在上一节中我们讲述了如何下载邮件,我们可以发现Pop3Client的GetMessage方法返回的是一个MailMessage.Message对象实列,有时候我们并不需要返回这样一个对象,只需要将邮件的内容保存为单独的文件,让其他程序进行处理。因而Pop3Client还提供了另外一个方法SaveMessage用以将邮件内容保存为文件,请看下面代码。

//declare
string
savePath;
Pop3Client client;

string
uid;
ListInfo[] infoList;

savePath = @"c:\pop3mails";

client = new Pop3Server("pop.mailserver.com", "user", "pass");


try
{
         if (!Directory.Exists(savePath)) Directory.CreateDirectory(savePath);
         client.Open();
         client.Noop();

         infoList = client.List();


         if
(infoList.Length > 0){
                   for(int i = 0; i < infoList.Length; i++){
                            uid = client.GetUid(infoList[i].Order).Replace(":", "");
                            client.SaveMessage(string.Format("{0}\\{1}.eml", savePath, infoList[i].Order), infoList[i].Order);
                   }
         }
}

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

下载邮件头部信息

有些时候,我们并不想下载整个邮件,但有希望了解一下邮件大致内容。在这种情况下,我们可以先获取邮件的头部信息,然后根据标题、发件人等内容再决定是否需要下载整个邮件或者删除邮件。Pop3Client提供了GetMessageHeader方法用于获取邮件头部信息,请参照如下代码:

//declare
Pop3Client client;
ListInfo[] infoList;
Pop3MessageHeader[] headers;


try
{
         client = new Pop3Server("pop.mailserver.com", "user", "pass");

         client.Open(); client.Noop();

         infoList = client.List();
         headers = new Pop3MessageHeader[infoList.Length];
         for(int i = 0; i < headers.Length; i++){
                   headers[i] = client.GetMessageHeader(infoList[i].Order);
         }
}

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

删除邮件

使用POP3下载邮件完后,邮件副本依旧保存在服务器,需要进行删除操作。Pop3Client提供Delete方法删除服务器上的邮件,请看下面代码。

//declare
Pop3Client client;
ListInfo[] infoList;
Pop3MessageHeader[] headers;


try
{
         client = new Pop3Server("pop.mailserver.com", "user", "pass");
         client.Open(); client.Noop();
         infoList = client.List();

         headers = new Pop3MessageHeader[infoList.Length];
         for(int i = 0; i < headers.Length; i++){
                   headers[i] = client. Delete (infoList[i].Order);
         }
}

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

当然也可以使用Pop3Express,进行简化操作。

//declare
MailMessage.Message[] messages;

messages = Pop3Express.DeleteAllMessages (

    new
Pop3Server("pop.mailserver.com", "user", "pass"));