狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

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

admin
2017年11月7日 16:56 本文熱度 7534
.NET 自從2.0開始,大大提升了 Mail.SmtpClient 的功能,對于發郵件,可謂游刃有余了。但是,美中不足的是沒有提供保存郵件內容為eml文件的功能。

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

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

SmtpClient.Send

 

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

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

System.Net.Mail.MailWriter

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

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

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

SmtpClient.Send

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

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

using System;
using ADODB;
using CDO;
using System.Net.Mail;
using System.IO;
using System.Globalization;
using System.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 = "你好,我是點晴";
msg.From = new MailAddress("cs@clicksun.cn");
msg.To.Add("service@clicksun.cn");
msg.Body = "歡迎訪問點晴官網:";
SaveToEml(msg, @"d:\test.eml");

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


該文章在 2017/11/7 17:23:46 編輯過

全部評論1

admin
2017年11月7日 23:41

C#將MailMessage保存為本地eml文件續(.Net+SmtpClient)

在上一篇 MailMessage保存為eml文件(C#+SmtpClient) 中,我們使用了反射(Reflection)的方式,調用System.Net.Mail的內部對象 MailWriter 實現了將 MailMessage 的內容保存為 eml 文件。

通過上次的實現,主要是學習反射Reflection的使用思路,起到個拋磚引玉的作用吧。今天,偶爾看到了上次的代碼,又重新發現了一個新大陸,使得保存eml文件的工作,變得異常簡單了。

.NET 的 SmtpClient 對于 DeliveryMethod 為 SpecifiedPickupDirectory PickupDirectoryFromIis 的情況,所做的只是 在特定的目錄下,生成一個EML文件而已

對于 PickupDirectoryFromIis 的情況,需要IIS支持,不是我們要的,我們需要的,是SpecifiedPickupDirectory 這個。對于這種情況再簡單不過了,實例代碼如下:

SmtpClient smtp = new SmtpClient();
smtp.EnableSsl = false; //必須為 false
smtp.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
smtp.PickupDirectoryLocation = @"d:\mail\"; //自定義目錄
MailMessage msg = new MailMessage();
msg.Subject = "hello, i am deltacat";
msg.From = new MailAddress("deltacat@microsoft.com");
msg.To.Add("zu14.cn@live.cn");
msg.Body = "welcome to www.zu14.cn";
smtp.Send(msg);

上面的方式,根本不需要配置 smtp 服務器等等的,很是方便;缺點是生成的EML文件名,是一個GUID,不能自己控制。

好了,就寫這些,希望對大家有幫助吧


該評論在 2017/11/7 23:43:32 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved