【问题标题】:save System.Net.mail.MailMessage as .msg file将 System.Net.mail.MailMessage 保存为 .msg 文件
【发布时间】:2011-01-26 06:54:15
【问题描述】:

我正在构建一个应用程序,我有义务创建一个 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 文件?

【问题讨论】:

    标签: c# .net email mailmessage msg


    【解决方案1】:

    HereRyan 提出了一种简单而好方法,无需任何努力。

    您实际上可以配置 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>
    

    【讨论】:

    • 是的,这是真的,但是 MailMessage 被保存为 .eml 文件我希望它被保存为 .msg 文件
    • 盖比,你有答案吗?
    • 杰森,我不认为这个仅链接的答案会变得无效,因为链接是另一个 SO 页面,但是我已经添加了报价 ;)
    【解决方案2】:

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

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

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

    对不起,

    戴夫

    【讨论】:

      【解决方案3】:

      如果您指的是 Outlook MSG 文件格式,请检查 MSG format specification published by Microsoft。关注similar question 的回答可能也会有所帮助。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          Microsoft 支持知识库文章: INFO: Save Message to MSG Compound File

          【讨论】:

          • 这个例子是 C++,不是 .NET
          【解决方案6】:

          查看这个使用 Outlook 互操作库 Creating an Outlook Message File with C# 的简短示例。这并不完全符合您的要求,但有一种方法可以将值从一个复制到另一个 - 手动。

          【讨论】:

          • Outlook Interop 对于安装了 Office 的客户端设置很有用,但在服务器端场景中几乎不可用。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-23
          • 1970-01-01
          • 2011-09-11
          • 2022-11-03
          • 1970-01-01
          • 2016-05-31
          • 2010-11-18
          相关资源
          最近更新 更多