C#- 基于Lumisoft.NET组件的POP3邮件接管和删除操纵
Lumisoft.NET组件是一个很是强大的邮件发送、邮件接管等功能的开源组件,一般用它来处理惩罚邮件的相干操纵,是很是合适的。之前也写过一些该组件的漫笔文章,不过主如果哄骗来发送邮件居多,比来因为项目须要,须要哄骗该组件来接管邮件,邮件经由过程POP3和谈进行接管到本地,故对该组件进行了周全的懂得和应用。本文主如果在此靠山上,介绍该组件的POP3和谈处理惩罚类的应用。Lumisoft.NET组件2013年作者有做了必然的更新,修复了一些题目,本文是基于该组件的最新版本进行开辟应用。
1、POP3登录及头部信息获取
应用POP3,必须创建一个POP3_Client的对象,然后经由过程Connect和Login进行连接和登录处理惩罚,相干的代码如下所示。
using (POP3_Client popClient = new POP3_Client()) { popClient.Logger = new Logger(); popClient.Logger.WriteLog += new EventHandler<WriteLogEventArgs>(WriteLog); popClient.Connect(pop3Server, pop3Port, pop3UseSsl); popClient.Login(username, password); }
POP3的的邮件经由过程POP3_Client 对象的属性Messages对象进行,每个POP3_ClientMessage代表一份完全的邮件信息,一开端应当是只是获取一些简单的邮件信息(此中包含邮件的独一标识UID),如许才干进步POP3和谈的处理惩罚速度,如下代码所示。
foreach (POP3_ClientMessage message in popClient.Messages)
为了进一步获取邮件头部信息,那么须要进行下面的转换
Mail_Message mime_header = Mail_Message.ParseFromByte(message.HeaderToByte());
转换后Mail_Message承载了邮件头部文件的很多必备信息,如发送人,发送人名称,接管地址,抄送人地址,邮件题目,邮件日期等等信息。
这些邮件地址的信息,都是经由过程Mail_t_Mailbox对象来记录,一般包含邮件地址的Address和显示名称DisplayName,如许很是便哄骗来显示,如我们可以进行转义,记录到数据库里面。
if (mime_header.From != null) { //伍华聪(wuhuacong@163.com) string displayname = mime_header.From[0].DisplayName; string = mime_header.From[0].Address;// DecodeString(mime_header.From[0].Address); if (!string.IsNullOrEmpty(displayname)) { info.From = string.Format("{0}({1})", displayname, ); } else { info.From = string.Format("{0}", ); } } if (mime_header.To != null) { StringBuilder sb = new StringBuilder(); foreach (Mail_t_Mailbox recipient in mime_header.To.Mailboxes) { string displayname = recipient.DisplayName; string address = recipient.Address; if (!string.IsNullOrEmpty(displayname)) { sb.AppendFormat("{0}({1});", displayname, address); } else { sb.AppendFormat("{0};", address); } } info.Senders = sb.ToString().Trim("";""); } if (mime_header.Cc != null) { StringBuilder sb = new StringBuilder(); foreach (Mail_t_Mailbox recipient in mime_header.Cc.Mailboxes) { string displayname = recipient.DisplayName; string address = recipient.Address; if (!string.IsNullOrEmpty(displayname)) { sb.AppendFormat("{0}({1});", displayname, address); } else { sb.AppendFormat("{0};", address); } } info.Carboncopy = sb.ToString().Trim("";""); }
每封Email会有一个在Pop3办事器局限内独一的Id,搜检这个Id是否存在就可以知道以前有没有接管过这封邮件info.MailUid = message.UID;
每份邮件的头部信息,都邑包含一个日期的,如下可以获取到该日期info.Date = mime_header.Date;
题目信息可以经由过程下面代码获取
info.Title = mime_header.Subject;
2、邮件正文信息和附件信息的获取
若是须要进一步获取邮件的正文内容,则须要对信息进行进一步的转换,把message对象进行MessageToByte操纵,然后哄骗函数Mail_Message.ParseFromByte进行转换。
byte[] messageBytes = message.MessageToByte(); Mail_Message mime_message = Mail_Message.ParseFromByte(messageBytes); if (mime_message == null) continue;info.Body = mime_message.BodyText; try { if (!string.IsNullOrEmpty(mime_message.BodyHtmlText)) { info.Body = mime_message.BodyHtmlText; } } catch { //樊篱编码呈现错误的题目,错误在BodyText存在而BodyHtmlText不存在的时辰,接见BodyHtmlText会呈现 }
邮件的附件是经由过程MIME_Entity来承载信息的,所以我们须要把对象经由过程mime_message.GetAttachments(true, true)进行获取,转换为附件信息。
#region 邮件附件内容
foreach (MIME_Entity entity in mime_message.GetAttachments(true, true))
{
if (entity.ContentDisposition != null &&
entity.ContentDisposition.Param_FileName != null)
{
//Console.WriteLine("Attachment: " + entity.ContentDisposition.Param_FileName);
string fileName = entity.ContentDisposition.Param_FileName;
若是须要进一步获取附件里面的文件字节俭,那么还须要进行进一步的转换为MIME_b_SinglepartBase对象。
MIME_b_SinglepartBase byteObj = (MIME_b_SinglepartBase)entity.Body;
if (byteObj != null)
{
FileUtil.CreateFile(filePath, byteObj.Data);
fileSize = byteObj.Data.Length;
若是要区分邮件里面的附件是内嵌附件还是真正的附件,那么可以经由过程下面代码进行断定,若是是MIME_DispositionTypes.Attachment的就是通俗附件,MIME_DispositionTypes.Inline的就是内嵌正文的附件。
entity.ContentDisposition.DispositionType == MIME_DispositionTypes.Attachment
3、邮件的删除操纵
办事器上的邮件,可以经由过程POP3的和谈体式格式进行删除,删除操纵很简单,主如果经由过程mail.MarkForDeletion进行标识即可,实例操纵代码如下所示
using (POP3_Client c = new POP3_Client()) { c.Connect(pop3Server, pop3Port, pop3UseSsl); c.Login(username, password); if (c.Messages.Count > 0) { foreach (POP3_ClientMessage mail in c.Messages) { try { if (toDeleteMailUidList.Contains(mail.UID)) { mail.MarkForDeletion(); dList.Add(mail.UID); } } catch (Exception ex) { LogTextHelper.Error(ex); } } } }
原文:http://www.byywee.com/page/M0/S864/864500.html