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

11

我正在构建一个应用程序,必须创建一个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);
        }
    }

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

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

6个回答

4

这里 Ryan提供了一种简单而有效的方法,无需任何努力即可实现。

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

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

您也可以在应用程序配置文件中进行如下设置:
 <configuration>
     <system.net>
         <mailSettings>
             <smtp deliveryMethod="SpecifiedPickupDirectory">
                 <specifiedPickupDirectory pickupDirectoryLocation="C:\somedirectory" />
             </smtp>
         </mailSettings>
     </system.net>
 </configuration>

2
是的,这是真的,但MailMessage被保存为.eml文件,我希望它被保存为.msg文件。 - Gaby
Gaby,你有答案吗? - zipi
Jason,我认为这个仅包含链接的答案不会失效,因为链接指向另一个SO页面,但是我已经添加了引用;) - Arsen Mkrtchyan

3

2
如果您在提到Outlook .msg文件,那么在.NET中无法原生地完成此操作。
Outlook .msg文件是一个复合文档,因此,您需要以该格式保存它,并确保将所有适当的属性放置在其精确位置。
您需要编写自己的代码,使用第三方工具或可能的Outlook互操作性。
抱歉,
Dave

2

请查看使用Outlook Interop库的短示例用C#创建Outlook消息文件。虽然它不是您一直在寻找的完全符合要求的内容,但有一种手动将值从一个位置复制到另一个位置的方法。


2
Outlook Interop在安装了Office的客户端设置方面非常有用,但在服务器端场景中几乎无法使用。 - saille

1

4
这个例子是用C++编写的,而不是.NET。 - saille

0

Outlook 给出的错误信息是由于 .msg 扩展名引起的。我正在使用相同的方法将 MailMessage 对象保存到磁盘,并发现只有在使用 .eml 扩展名时,该文件才能在 Outlook 中打开。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接