从.msg文件中读取

我需要在使用COM API for Outlook的情况下从.NET中读取.MSG文件(因为它不会安装在我的应用程序将运行的机器上)。 有没有免费的第三方图书馆呢? 我想提取From,To,CC和BCC字段。 如果它们也存储在MSG文件中,则发送/接收日期字段会很好。

CodeProject上有代码可用于读取没有COM的.msg文件。 看到这里 。

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

这是使用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 

Microsoft已经记录了这一点: .MSG文件格式规范

这是一个“结构化存储”文档。 我已成功使用Andrew Peace的代码来读取这些内容,即使在.NET下(使用C ++ / CLI) – 它很干净且相当容易理解。 基本上,你需要弄清楚你需要哪些记录,并查询那些 – 它有点毛茸茸,因为不同版本的Outlook和不同类型的消息将导致不同的记录……

您可以尝试我们的(商业) Rebex安全邮件库。 它可以读取Outlook的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

如果您在文本编辑器中打开.MSG文件,我相信您会发现您所访问的信息以纯文本forms存储在文件中。 (这是我至少检查过的所有消息)

编写一些代码来解析文件以查找以“From:”或“To:”等开头的行,然后提取所需的信息将非常容易。

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