问题 将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文件?


2657
2018-03-11 09:00


起源



答案:


这里 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>

4
2018-03-11 09:07



是的,这是真的,但MailMessage保存为.eml文件我希望它保存为.msg文件 - Gaby
为什么贬低这个?这不是“答案”,但这是一个很好的建议...... - Andrea Antonangeli
盖比,你有答案吗? - zipi
杰森,我不认为这个仅限链接的答案可能会变得无效,因为该链接是另一个SO页面,但我添加了引用;) - Arsen Mkrtchyan


答案:


这里 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>

4
2018-03-11 09:07



是的,这是真的,但MailMessage保存为.eml文件我希望它保存为.msg文件 - Gaby
为什么贬低这个?这不是“答案”,但这是一个很好的建议...... - Andrea Antonangeli
盖比,你有答案吗? - zipi
杰森,我不认为这个仅限链接的答案可能会变得无效,因为该链接是另一个SO页面,但我添加了引用;) - Arsen Mkrtchyan


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


3
2017-09-21 16:05





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

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

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

抱歉,

戴夫


2
2018-03-11 13:25





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


2
2017-11-14 08:17



Outlook Interop对于安装Office的客户端设置很有用,但在服务器端方案中几乎不可用。 - saille


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


1
2017-11-14 07:59



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


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


0
2017-09-21 06:12