程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> MailMessage保存為eml文件(C#+SmtpClient)

MailMessage保存為eml文件(C#+SmtpClient)

編輯:關於.NET

.NET 自從2.0開始,大大提升了 Mail.SmtpClient 的功能,對於發郵件,可謂游刃有余了。但是,美中不足的是沒有提供保存郵件內容為eml文件的功能

實際上,SmtpClient 和 MailMessage 已經實現了這個功能,只是這個功能是 NonPublic 的,對於空間外,不可見而已。

利用 Reflector 反編譯一下 System.Net.Mail.SmtpClient 可以看到:

在 Send(MailMessage) 方法中,在MAIL被發送之前,是調用了一個 MailWriter fileMailWriter=this.GetFileMailWriter(this.PickupDirectoryLocation);

我們順籐摸瓜,繼續定位 GetFileMailWriter 這個方法

上面的代碼中,赫然醒目的顯示著 .eml ,看了裡面的邏輯,我們其實就清楚了,SmtpClient.Send 之前,也是先生成了一個臨時的eml文件,然後再發送這個文件出去的。

其中的關鍵就在 new MailWriter(new FileStream(str2, FileMode.CreateNew)) 這裡。

我們接下來定位到我們的核心 MailWriter :

從上面可以看到,MailWriter 是一個 internal 的 class,所以我們在普通的調用Mail.SmtpClient 等的命名空間下,是看不到的,這時我們就需要用到反射(Reflection) 了。

下面給出完整的實現代碼:

/// <summary>
/// 將MailMessage保存為eml文件
/// </summary>
/// <param name="msg">待保存的具有內容的MailMessage</param>
/// <param name="emlFileAbsolutePath">保存後的eml文件的路徑</param>
static void SaveToEml(MailMessage msg, string emlFileAbsolutePath)
{
const BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy;
using (MemoryStream ms = new MemoryStream())
{
Assembly assembly = typeof(System.Net.Mail.SmtpClient).Assembly;
Type tMailWriter = assembly.GetType("System.Net.Mail.MailWriter");
object mailWriter = Activator.CreateInstance(tMailWriter, flags, null, new object[] { ms }, CultureInfo.InvariantCulture);
msg.GetType().GetMethod("Send", flags).Invoke(msg, new object[] { mailWriter, true });
File.WriteAllText(emlFileAbsolutePath, System.Text.Encoding.Default.GetString(ms.ToArray()), System.Text.Encoding.Default);
}
}

使用方法:

MailMessage msg = new MailMessage();
msg.Subject = "hello, i am deltacat";
msg.From = new MailAddress("[email protected]");
msg.To.Add("[email protected]");
msg.Body = "welcome to www.zu14.cn";
SaveToEml(msg, @"d:\test.eml");

好了,完結了,祝大家好運吧!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved