在.Net中將MailMessage儲存為本地eml檔案(轉)
最近因故需要用.Net(C#)將郵件資訊儲存為本地eml檔案,看起來是個費勁的活:首先得讀懂MIME協議(RFC 2045~2049),然後寫程式碼。還好,以前有朋友也有過這樣的需求,並有現成解決方案,呵呵:System.Net.Mail名稱空間裡已經實現了MailWriter,只不知道為啥沒有公開而已。
用Xenocode Fox 2007(Community Edition)載入System.dll,找到System.Net.Mail.SmtpClient類,可看到其Send(MailMessage)方法中有這麼兩句程式碼:
MailWriter writer;
writer = GetFileMailWriter(PickupDirectoryLocation);
我們來看看GetFileMailWriter方法:
internal MailWriter GetFileMailWriter (string pickupDirectory)
{
string path;
...do
{
Guid guid1 = Guid.NewGuid();
string path2 = guid1.ToString() + ".eml";
path = Path.Combine(pickupDirectory, path2);
}
while (File.Exists(path));
return new MailWriter(new FileStream(path, FileMode.CreateNew));
}
再往深裡看便可知:MailWriter直接將MailMessage內容寫成了“.eml”檔案,而且是按MIME協議寫入的,Yeah!
那接下來要做的就是用上MailWriter這個內部(internal)類,當然這是很簡單的事:
public static byte[] MailMessageToArray(MailMessage msg)
{
const BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy;
using (var ms = new MemoryStream())
{
var assembly = typeof (System.Net.Mail.SmtpClient).Assembly;
var writerType = assembly.GetType("System.Net.Mail.MailWriter");
var writer = Activator.CreateInstance(writerType, flags, null, new object[] {ms},
CultureInfo.InvariantCulture);
msg.GetType().GetMethod("Send", flags).Invoke(msg, new[] {writer, true});
return ms.ToArray();
}
}
如果我們使用的是C#3.0以後的版本,還可以為MailMessage新增擴充套件方法,這樣使用起來更為自然。程式碼如下:
//定義擴充套件方法
public static class MailMessageExtend
{
public static byte[] ToArray(this MailMessage msg)
{
const BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy;
using (var ms = new MemoryStream())
{
var assembly = typeof(System.Net.Mail.SmtpClient).Assembly;
var writerType = assembly.GetType("System.Net.Mail.MailWriter");
var writer = Activator.CreateInstance(writerType, flags, null, new object[] { ms },
CultureInfo.InvariantCulture);
msg.GetType().GetMethod("Send", flags).Invoke(msg, new[] { writer, true });
return ms.ToArray();
}
}}
//呼叫
private void button1_Click(object sender, EventArgs e)
{
var msg = new MailMessage();
...
var content = msg.ToArray();
...
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-677249/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 儲存CSDN 中的部落格文章為本地檔案
- 儲存檔案到本地
- Matlab將.mat檔案儲存為.txt檔案Matlab
- C#/VB.NET 將OFD儲存為PDF檔案流C#
- Android從外部儲存裝置中儲存和載入本地檔案Android
- 將動態aspx頁面,儲存為靜態htm檔案 (轉)
- 如何將html程式碼儲存為Pdf檔案HTML
- javascript如何將檔案儲存到本地JavaScript
- eml檔案解析
- 在vue中,localStorage本地儲存應用。Vue
- spark在IDEA的本地無法使用saveAsTextFile儲存檔案SparkIdeaAST
- 將FileSystem轉換為ASM儲存ASM
- 在應用程式中將OJB作為一個儲存層使用(一) (轉)
- 在應用程式中將OJB作為一個儲存層使用(二) (轉)
- 在應用程式中將OJB作為一個儲存層使用(三) (轉)
- 在應用程式中將OJB作為一個儲存層使用(四) (轉)
- 在應用程式中將OJB作為一個儲存層使用(六) (轉)
- 在應用程式中將OJB作為一個儲存層使用(五) (轉)
- 將座標系統儲存為一個檔案.prj
- Android將程式崩潰資訊儲存本地檔案傳送至伺服器Android伺服器
- 如何將MAC的檔案儲存至NAS網路儲存?Mac
- 塊儲存 檔案儲存 物件儲存物件
- 將Chrome偵錯程式裡的JavaScript變數儲存成本地JSON檔案ChromeJavaScript變數JSON
- vista alv儲存本地檔案錯誤
- Android中的資料儲存之檔案儲存Android
- 檔案儲存
- 資料儲存--檔案儲存
- Serverless 使用阿里雲OOS將http檔案轉存到物件儲存Server阿里HTTP物件
- 將Schema檔案轉換為Java檔案Java
- 將圖片檔案儲存到Oracle的儲存過程Oracle儲存過程
- ios 將NSLog日誌重定向輸出到檔案中儲存iOS
- Word在Normal.dot模板檔案中儲存預設資訊ORM
- 本地儲存
- Android下載網路pdf檔案儲存至本地Android
- eml是什麼檔案格式 eml用什麼軟體開啟
- 如何將.ipynb檔案轉換為.py檔案
- RAC中誤將資料檔案建立在本地盤時的修正
- CSV檔案儲存