深入Lumisoft.NET組件POP3郵件接收與刪除操作的使用詳解_.Net教程
推薦:ASP.NET26個常用性能優(yōu)化方訪問數(shù)據(jù)庫資源需要創(chuàng)建連接、打開連接和關(guān)閉連接幾個操作。這些過程需要多次與數(shù)據(jù)庫交換信息以通過身份驗證,比較耗費(fèi)服務(wù)器資源。 ASP.NET中提供了連接池(Connection Pool)改善打開和關(guān)閉數(shù)據(jù)庫對性能的影響。系統(tǒng)將用戶的數(shù)據(jù)庫連接放在連接池中,需要時取出,關(guān)閉
Lumisoft.NET組件是一個非常強(qiáng)大的郵件發(fā)送、郵件接收等功能的開源組件,一般用它來處理郵件的相關(guān)操作,是非常合適的。之前也寫過一些該組件的隨筆文章,不過主要是利用來發(fā)送郵件居多,最近由于項目需要,需要利用該組件來接收郵件,郵件通過POP3協(xié)議進(jìn)行接收到本地,故對該組件進(jìn)行了全面的了解和使用。本文主要是在此背景上,介紹該組件的POP3協(xié)議處理類的使用。Lumisoft.NET組件2013年作者有做了一定的更新,修復(fù)了一些問題,本文是基于該組件的最新版本進(jìn)行開發(fā)使用。
1、POP3登錄及頭部信息獲取
首先使用POP3,必須創(chuàng)建一個POP3_Client的對象,然后通過Connect和Login進(jìn)行連接和登錄處理,相關(guān)的代碼如下所示。
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對象進(jìn)行,每個POP3_ClientMessage代表一份完整的郵件信息,一開始應(yīng)該是只是獲取一些簡單的郵件信息(其中包括郵件的唯一標(biāo)識UID),這樣才能提高POP3協(xié)議的處理速度,如下代碼所示。
foreach (POP3_ClientMessage message in popClient.Messages)
為了進(jìn)一步獲取郵件頭部信息,那么需要進(jìn)行下面的轉(zhuǎn)換
Mail_Message mime_header = Mail_Message.ParseFromByte(message.HeaderToByte());
轉(zhuǎn)換后Mail_Message承載了郵件頭部文件的很多必備信息,如發(fā)送人,發(fā)送人名稱,接收地址,抄送人地址,郵件標(biāo)題,郵件日期等等信息。
這些郵件地址的信息,都是通過Mail_t_Mailbox對象來記錄,一般包含郵件地址的Address和顯示名稱DisplayName,這樣非常方便用來顯示,如我們可以進(jìn)行轉(zhuǎn)義,記錄到數(shù)據(jù)庫里面。
if (mime_header.From != null)
{
//([email protected])
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服務(wù)器范圍內(nèi)唯一的Id,檢查這個Id是否存在就可以知道以前有沒有接收過這封郵件
info.MailUid = message.UID;
每份郵件的頭部信息,都會包含一個日期的,如下可以獲取到該日期
info.Date = mime_header.Date;
標(biāo)題信息可以通過下面代碼獲取
info.Title = mime_header.Subject;/
2、郵件正文信息和附件信息的獲取
如果需要進(jìn)一步獲取郵件的正文內(nèi)容,則需要對信息進(jìn)行進(jìn)一步的轉(zhuǎn)換,把message對象進(jìn)行MessageToByte操作,然后利用函數(shù)Mail_Message.ParseFromByte進(jìn)行轉(zhuǎn)換。
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
{
//屏蔽編碼出現(xiàn)錯誤的問題,錯誤在BodyText存在而BodyHtmlText不存在的時候,訪問BodyHtmlText會出現(xiàn)
}
郵件的附件是通過MIME_Entity來承載信息的,所以我們需要把對象通過mime_message.GetAttachments(true, true)進(jìn)行獲取,轉(zhuǎn)換為附件信息。
#region 郵件附件內(nèi)容
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;
如果需要進(jìn)一步獲取附件里面的文件字節(jié)流,那么還需要進(jìn)行進(jìn)一步的轉(zhuǎn)換為MIME_b_SinglepartBase對象。
MIME_b_SinglepartBase byteObj = (MIME_b_SinglepartBase)entity.Body;
if (byteObj != null)
{
FileUtil.CreateFile(filePath, byteObj.Data);
fileSize = byteObj.Data.Length;
如果要區(qū)分郵件里面的附件是內(nèi)嵌圖片附件還是真正的附件,那么可以通過下面代碼進(jìn)行判斷,如果是MIME_DispositionTypes.Attachment的就是普通附件,MIME_DispositionTypes.Inline的就是內(nèi)嵌正文的附件。
entity.ContentDisposition.DispositionType == MIME_DispositionTypes.Attachment
3、郵件的刪除操作
服務(wù)器上的郵件,可以通過POP3的協(xié)議方式進(jìn)行刪除,刪除操作很簡單,主要是通過mail.MarkForDeletion進(jìn)行標(biāo)識即可,實例操作代碼如下所示
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中如何對頁面輸出緩存最簡單的緩存機(jī)制,把整個Aspx頁面保存在服務(wù)器端內(nèi)存中,用戶請求頁面時,直接從服務(wù)器端內(nèi)存中提取數(shù)數(shù)據(jù),不在經(jīng)歷頁面的生命周期。主要用于不經(jīng)常更新和修改,而在第一次編譯是時要經(jīng)過大量處理的數(shù)據(jù)。頁面輸出緩存是緩存的整個頁面。 使用很簡單%@ OutPutCache D
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實例(可帶附件)
- js實現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實現(xiàn)
- Asp.Net 無刷新文件上傳并顯示進(jìn)度條的實現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(連接字符串的配置及獲取)
- asp.net頁面?zhèn)髦禍y試實例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實現(xiàn)分頁示例代碼
- 相關(guān)鏈接:
- 教程說明:
.Net教程-深入Lumisoft.NET組件POP3郵件接收與刪除操作的使用詳解
。