如何将MailMessage对象保存为* .eml或* .msg文件

如何将MailMessage对象保存到磁盘? MailMessage对象不公开任何Save()方法。

如果以任何格式保存* .eml或* .msg,我都没有问题。 任何想法如何做到这一点?

为了简单起见,我只会引用Connect项目的解释:

您实际上可以configurationSmtpClient将电子邮件发送到文件系统而不是networking。 您可以使用以下代码以编程方式执行此操作:

SmtpClient client = new SmtpClient("mysmtphost"); client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory; client.PickupDirectoryLocation = @"C:\somedirectory"; client.Send(message); 

你也可以在你的应用程序configuration文件中这样设置:

  <configuration> <system.net> <mailSettings> <smtp deliveryMethod="SpecifiedPickupDirectory"> <specifiedPickupDirectory pickupDirectoryLocation="C:\somedirectory" /> </smtp> </mailSettings> </system.net> </configuration> 

发送电子邮件后,您应该看到电子邮件文件被添加到您指定的目录中。 然后您可以有一个单独的进程以批处理模式发送电子邮件。

你应该可以使用空的构造函数而不是列出的,因为它不会发送它。

这是将MailMessage转换为包含EML数据的stream的扩展方法。 它使用文件系统显然是一个黑客,但它的工作原理。

 public static void SaveMailMessage(this MailMessage msg, string filePath) { using (var fs = new FileStream(filePath, FileMode.Create)) { msg.ToEMLStream(fs); } } /// <summary> /// Converts a MailMessage to an EML file stream. /// </summary> /// <param name="msg"></param> /// <returns></returns> public static void ToEMLStream(this MailMessage msg, Stream str) { using (var client = new SmtpClient()) { var id = Guid.NewGuid(); var tempFolder = Path.Combine(Path.GetTempPath(), Assembly.GetExecutingAssembly().GetName().Name); tempFolder = Path.Combine(tempFolder, "MailMessageToEMLTemp"); // create a temp folder to hold just this .eml file so that we can find it easily. tempFolder = Path.Combine(tempFolder, id.ToString()); if (!Directory.Exists(tempFolder)) { Directory.CreateDirectory(tempFolder); } client.UseDefaultCredentials = true; client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory; client.PickupDirectoryLocation = tempFolder; client.Send(msg); // tempFolder should contain 1 eml file var filePath = Directory.GetFiles(tempFolder).Single(); // stream out the contents using (var fs = new FileStream(filePath, FileMode.Open)) { fs.CopyTo(str); } } } 

然后,您可以将返回的stream按照您的需要进行处理,包括保存到磁盘上的另一个位置或存储在数据库字段中,甚至可以作为附件发送电子邮件。