原文地址: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服务器的信息。
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信箱的摘要信息,现在我们就要步入正题,如何接受邮件,请看下列演示代码。
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对象,实现一种跟简单的接受邮件方式。请看下面的代码:
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用以将邮件内容保存为文件,请看下面代码。
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方法用于获取邮件头部信息,请参照如下代码:
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方法删除服务器上的邮件,请看下面代码。
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,进行简化操作。
MailMessage.Message[] messages;
messages = Pop3Express.DeleteAllMessages (
new Pop3Server("pop.mailserver.com", "user", "pass"));