深入Lumisoft.NET組件POP3郵件接收與刪除操作的使用詳解_.Net教程

      編輯Tag賺U幣

      推薦:ASP.NET26個常用性能優化方
      訪問數據庫資源需要創建連接、打開連接和關閉連接幾個操作。這些過程需要多次與數據庫交換信息以通過身份驗證,比較耗費服務器資源。 ASP.NET中提供了連接池(Connection Pool)改善打開和關閉數據庫對性能的影響。系統將用戶的數據庫連接放在連接池中,需要時取出,關閉

      Lumisoft.NET組件是一個非常強大的郵件發送、郵件接收等功能的開源組件,一般用它來處理郵件的相關操作,是非常合適的。之前也寫過一些該組件的隨筆文章,不過主要是利用來發送郵件居多,最近由于項目需要,需要利用該組件來接收郵件,郵件通過POP3協議進行接收到本地,故對該組件進行了全面的了解和使用。本文主要是在此背景上,介紹該組件的POP3協議處理類的使用。Lumisoft.NET組件2013年作者有做了一定的更新,修復了一些問題,本文是基于該組件的最新版本進行開發使用。

      1、POP3登錄及頭部信息獲取

      首先使用POP3,必須創建一個POP3_Client的對象,然后通過Connect和Login進行連接和登錄處理,相關的代碼如下所示。

      復制代碼 代碼如下:www.wf0088.com

      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協議的處理速度,如下代碼所示。
      復制代碼 代碼如下:www.wf0088.com

      foreach (POP3_ClientMessage message in popClient.Messages)

      為了進一步獲取郵件頭部信息,那么需要進行下面的轉換
      復制代碼 代碼如下:www.wf0088.com

      Mail_Message mime_header = Mail_Message.ParseFromByte(message.HeaderToByte());

      轉換后Mail_Message承載了郵件頭部文件的很多必備信息,如發送人,發送人名稱,接收地址,抄送人地址,郵件標題,郵件日期等等信息。

      這些郵件地址的信息,都是通過Mail_t_Mailbox對象來記錄,一般包含郵件地址的Address和顯示名稱DisplayName,這樣非常方便用來顯示,如我們可以進行轉義,記錄到數據庫里面。

      復制代碼 代碼如下:www.wf0088.com

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

      復制代碼 代碼如下:www.wf0088.com

      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是否存在就可以知道以前有沒有接收過這封郵件
      復制代碼 代碼如下:www.wf0088.com

      info.MailUid = message.UID;

      每份郵件的頭部信息,都會包含一個日期的,如下可以獲取到該日期
      復制代碼 代碼如下:www.wf0088.com

      info.Date = mime_header.Date;

      標題信息可以通過下面代碼獲取
      復制代碼 代碼如下:www.wf0088.com

      info.Title = mime_header.Subject;/

      2、郵件正文信息和附件信息的獲取

      如果需要進一步獲取郵件的正文內容,則需要對信息進行進一步的轉換,把message對象進行MessageToByte操作,然后利用函數Mail_Message.ParseFromByte進行轉換。
      復制代碼 代碼如下:www.wf0088.com

      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)進行獲取,轉換為附件信息。
      復制代碼 代碼如下:www.wf0088.com

      #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對象。
      復制代碼 代碼如下:www.wf0088.com

      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的就是內嵌正文的附件。
      復制代碼 代碼如下:www.wf0088.com

      entity.ContentDisposition.DispositionType == MIME_DispositionTypes.Attachment

      3、郵件的刪除操作

      服務器上的郵件,可以通過POP3的協議方式進行刪除,刪除操作很簡單,主要是通過mail.MarkForDeletion進行標識即可,實例操作代碼如下所示
      復制代碼 代碼如下:www.wf0088.com

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

      分享:ASP.NET中如何對頁面輸出緩存
      最簡單的緩存機制,把整個Aspx頁面保存在服務器端內存中,用戶請求頁面時,直接從服務器端內存中提取數數據,不在經歷頁面的生命周期。主要用于不經常更新和修改,而在第一次編譯是時要經過大量處理的數據。頁面輸出緩存是緩存的整個頁面。 使用很簡單%@ OutPutCache D

      來源:模板無憂//所屬分類:.Net教程/更新時間:2013-05-08
      相關.Net教程