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 == nullcontinue;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

 

 

posted @ 2014-03-04 15:37  春天又来了  阅读(1349)  评论(0编辑  收藏  举报