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

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

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

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

實(shí)際上,SmtpClient 和 MailMessage 已經(jīng)實(shí)現(xiàn)了這個(gè)功能,只是這個(gè)功能是 NonPublic 的,對(duì)于空間外,不可見而已。

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

SmtpClient.Send

 

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

我們順藤摸瓜,繼續(xù)定位 GetFileMailWriter 這個(gè)方法

System.Net.Mail.MailWriter

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

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

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

SmtpClient.Send

從上面可以看到,MailWriter 是一個(gè) internal 的 class,所以我們?cè)谄胀ǖ恼{(diào)用Mail.SmtpClient 等的命名空間下,是看不到的,這時(shí)我們就需要用到反射(Reflection) 了。

下面給出完整的實(shí)現(xiàn)代碼:

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">待保存的具有內(nèi)容的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 = "你好,我是點(diǎn)晴";
msg.From = new MailAddress("cs@clicksun.cn");
msg.To.Add("service@clicksun.cn");
msg.Body = "歡迎訪問點(diǎn)晴官網(wǎng):";
SaveToEml(msg, @"d:\test.eml");

好了 ,完結(jié)了,祝大家好運(yùn)吧!


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

全部評(píng)論1

admin
2017年11月7日 23:41

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

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

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

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

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

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 服務(wù)器等等的,很是方便;缺點(diǎn)是生成的EML文件名,是一個(gè)GUID,不能自己控制。

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


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