• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    深入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 EventHandlerWriteLogEventArgs>(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 from = mime_header.From[0].Address;// DecodeString(mime_header.From[0].Address);
                                if (!string.IsNullOrEmpty(displayname))
                                {
                                    info.From = string.Format("{0}({1})", displayname, from);
                                }
                                else
                                {
                                    info.From = string.Format("{0}", from);
                                }
                            }

    复制代码 代码如下:

    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();

                                    deletedList.Add(mail.UID);
                                }
                            }
                            catch (Exception ex)
                            {
                                LogTextHelper.Error(ex);
                            }
                        }
                    }
                }

    您可能感兴趣的文章:
    • java使用Socket实现SMTP协议发送邮件
    • Java+Nginx实现POP、IMAP、SMTP邮箱代理服务
    • java实现基于SMTP发送邮件的方法
    • 提示Outlook/Foxmail收取163邮件失败:ERR 您没有权限使用pop3功能
    • 如何用POP3接收电子邮件?
    • 手工体验smtp和pop3协议 邮件实现详解(二)
    上一篇:深入Lumisoft.NET组件开发碰到乱码等问题的解决方法
    下一篇:深入Lumisoft.NET实现邮件发送功能的方法详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    深入Lumisoft.NET组件POP3邮件接收与删除操作的使用详解 深入,Lumisoft.NET,组件,POP3,