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);
        }
    }

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

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

4

6 回答 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>
于 2010-03-11T09:07:17.223 回答
3

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

于 2010-09-21T16:05:23.030 回答
2

检查这个使用 Outlook 互操作库的简短示例使用C# 创建 Outlook 消息文件。这并不完全是您所要求的,但有一种方法可以将值从一个复制到另一个 - 手动。

于 2011-11-14T08:17:28.543 回答
2

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

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

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

对不起,

戴夫

于 2010-03-11T13:25:48.357 回答
1

Microsoft Support KB article: INFO: Save Message to MSG Compound File

于 2011-11-14T07:59:25.777 回答
0

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

于 2011-09-21T06:12:57.340 回答