将System.Net.mail.MailMessage保存为.msg文件

我正在构建一个应用程序,我有义务创建一个MailMessage(System.Net.mail.MailMessage)并将其保存在磁盘上,因为.msg扩展名不是.eml

下面是我用来将MailMessage保存为.msg文件的方法:

public static void Save(MailMessage Message, string FileName) { Assembly assembly = typeof(SmtpClient).Assembly; Type _mailWriterType = assembly.GetType("System.Net.Mail.MailWriter"); using (FileStream _fileStream = new FileStream(FileName, FileMode.Create)) { // Get reflection info for MailWriter contructor ConstructorInfo _mailWriterContructor = _mailWriterType.GetConstructor( BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[] { typeof(Stream) }, null); // Construct MailWriter object with our FileStream object _mailWriter = _mailWriterContructor.Invoke(new object[] { _fileStream }); // Get reflection info for Send() method on MailMessage MethodInfo _sendMethod = typeof(MailMessage).GetMethod( "Send", BindingFlags.Instance | BindingFlags.NonPublic); // Call method passing in MailWriter _sendMethod.Invoke( Message, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { _mailWriter, true }, null); // Finally get reflection info for Close() method on our MailWriter MethodInfo _closeMethod = _mailWriter.GetType().GetMethod( "Close", BindingFlags.Instance | BindingFlags.NonPublic); // Call close method _closeMethod.Invoke( _mailWriter, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { }, null); } } 

但保存的msg文件没有打开,下面是错误: “无法打开文件xyz.msg。文件文件可能不存在,您可能没有权限打开它或它可能被另一个程序打开…. “

我的问题是: 如何将System.Net.mail.MailMessage保存为msg文件?

在这里 Ryan提出了一个简单而有效的方法,无需任何努力。

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

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

您也可以在应用程序配置文件中进行设置,如下所示:

           

如果您指的是Outlook MSG文件格式,请检查Microsoft发布的MSG格式规范 。 以下回答类似问题也可能有所帮助。

如果您指的是Outlook .msg文件,则无法在.NET中本机完成此操作。

Outlook .msg文件是一个复合文档,因此,您需要以该格式保存它,并确保将所有适当的属性放在其确切位置。

您需要编写自己的,使用第三方或可能的Outlook互操作。

抱歉,

戴夫

查看使用Outlook Interop库的简短示例使用C#创建Outlook消息文件 。 这并不是你要求的,但有一种方法可以值从一个复制到另一个 – 手动。

Microsoft支持KB文章: INFO: 将消息保存到MSG化合物文件

Outlook提供的错误消息是因为.msg扩展名。 我使用相同的方法将MailMessage对象保存到磁盘,并发现该文件只在Outlook中打开,扩展名为.eml