【问题标题】:Read from .msg files [closed]从 .msg 文件中读取 [关闭]
【发布时间】:2010-09-06 03:56:36
【问题描述】:

我需要使用 COM API for Outlook 读取 .NET 中的 Outlook .MSG 文件(因为它不会安装在我的应用程序将运行的机器上)。有没有免费的第三方库可以做到这一点?我想提取 From、To、CC 和 BCC 字段。发送/接收日期字段如果也存储在 MSG 文件中会很好。

【问题讨论】:

    标签: c# outlook email message msg


    【解决方案1】:

    如果您在文本编辑器中打开 .MSG 文件,我相信您会发现您所获取的信息以纯文本形式存储在文件中。 (至少在我检查过的所有消息上都有)

    编写一些代码来解析文件以查找以“From:”或“To:”等开头的行然后提取您需要的信息会很容易。

    如果您还需要电子邮件的正文,那可能会有点复杂。

    【讨论】:

    • 我相信 .eml 文件 .msg 是二进制的
    • 他们是,但他是对的。试试看自己看看
    【解决方案2】:

    Microsoft 记录了这一点:.MSG File Format Specification

    【讨论】:

      【解决方案3】:

      更新:我找到了一个名为Outlook Redemption 的第三方 COM 库,目前它对我来说运行良好。如果您通过 .NET 中的 COM-Interop 使用它,请不要忘记在完成后释放每个 COM 对象,否则您的应用程序会随机崩溃。

      【讨论】:

        【解决方案4】:

        这是一个“结构化存储”文档。过去我已经成功地使用Andrew Peace's code 来阅读这些内容,即使在.NET 下(使用C++/CLI)也是如此——它很干净而且相当容易理解。基本上,你需要弄清楚你需要哪些记录,然后查询这些记录——这有点麻烦,因为不同版本的 Outlook 和不同类型的消息会导致不同的记录......

        【讨论】:

          【解决方案5】:

          CodeProject 上有代码可用于在没有 COM 的情况下读取 .msg 文件。见here

          【讨论】:

          • 它还不错(它的免费和开源!)但不支持消息上的任何日期字段(还)
          • 稍微修改一下也可以保存附件(现在只显示有没有,大小)。
          • @Steve 一位评论者在这里分享了获取发送/接收日期的说明:codeproject.com/Articles/32899/…(滚动到末尾)
          • @Ciaran 哇,过去的爆炸。谢天谢地,从那时起,我就再也不需要去前景附近的任何地方了;)
          【解决方案6】:

          这是 Huseyint 找到的使用 Outlook Redemption 的一些示例 VBA 代码。

          Public Sub ProcessMail()
          
             Dim Sess As RDOSession
             Dim myMsg As RDOMail
             Dim myString As String
          
             Set Sess = CreateObject("Redemption.RDOSession")
             Set myMsg = Sess.GetMessageFromMsgFile("C:\TestHarness\kmail.msg")
          
             myString = myMsg.Body
             myMsg.Body = Replace(myString, "8750", "XXXX")
          
             myMsg.Save
          
          End Sub
          

          【讨论】:

          • 这不是 C# 主题吗?
          【解决方案7】:

          您可以尝试我们的(商业)Rebex Secure Mail 库。它可以读取 Outlooks MSG 格式。以下代码显示了如何:

          // Load message
          MailMessage message = new MailMessage();
          message.Load(@"c:\Temp\t\message.msg");
          
          // show From, To and Sent date
          Console.WriteLine("From: {0}", message.From);
          Console.WriteLine("To: {0}", message.To);
          Console.WriteLine("Sent: {0}", message.Date.LocalTime);
          
          // find and try to parse the first 'Received' header
          MailDateTime receivedDate = null;
          string received = message.Headers.GetRaw("Received");
          if (received != null)
          {
              int lastSemicolon = received.LastIndexOf(';');
              if (lastSemicolon >= 0)
              {
                  string rawDate = received.Substring(lastSemicolon + 1);
                  MimeHeader header = new MimeHeader("Date", rawDate);
                  receivedDate = header.Value as MailDateTime;
              }
          }
          
          // display the received date if available
          if (receivedDate != null)
              Console.WriteLine("Received: {0}", receivedDate.LocalTime);
          

          有关发送和接收日期以及它们在邮件中的表示方式的更多信息,请访问http://forum.rebex.net/questions/816/extract-senttime-receivetime-and-time-zones

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-07-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多