早期方案:透過反射調用 `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 });
}
反編譯 `SmtpClient.Send` 發現:`DeliveryMethod` 為 `Network` 時走網絡發送;為 `PickupDirectory` 時同樣調用 `MailWriter` 寫文件。兩條路徑殊途同歸,後者更簡潔(見下篇)。