首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 將 MailMessage 存為 EML 文件(一):反射調用 MailWriter

     編輯:關於C語言

早期方案:透過反射調用 `System.Net.Mail` 內部 `MailWriter` 類,將 `MailMessage` 序列化為 EML 格式流。

核心反射邏輯

// 獲取內部 MailWriter 建構子
Assembly asm = typeof(SmtpClient).Assembly;
Type mailWriterType = asm.GetType("System.Net.Mail.MailWriter");
ConstructorInfo ci = mailWriterType.GetConstructor(
    BindingFlags.NonPublic | BindingFlags.Instance,
    null, new[] { typeof(Stream) }, null);

// 創建 MailWriter 實例
using (FileStream fs = new FileStream("mail.eml", FileMode.Create))
using (StreamWriter sw = new StreamWriter(fs)) {
    object mailWriter = ci.Invoke(new object[] { fs });
    // 調用 MailMessage.SendWriter 內部方法
    MethodInfo mi = typeof(MailMessage).GetMethod("SendWriter",
        BindingFlags.NonPublic | BindingFlags.Instance);
    mi.Invoke(message, new object[] { mailWriter, true, true });
}

IL 分析發現

反編譯 `SmtpClient.Send` 發現:`DeliveryMethod` 為 `Network` 時走網絡發送;為 `PickupDirectory` 時同樣調用 `MailWriter` 寫文件。兩條路徑殊途同歸,後者更簡潔(見下篇)。

遺留問題

  • 依賴非公共 API,版本升級可能失效
  • 代碼複雜,維護困難
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved