我需要从.NET 中读取Outlook .MSG文件而不使用使用COM API for Outlook(因为它不会安装在我的应用程序将运行的计算机上)。有没有免费的第三方图书馆呢?我想提取From,To,CC和BCC字段。如果发送/接收日期字段也存储在MSG文件中,则它们会很好。
答案 0 :(得分:10)
CodeProject上有代码可用于读取没有COM的.msg文件。请参阅here。
答案 1 :(得分:9)
更新:我找到了一个名为Outlook Redemption的第三方COM库,目前我的工作正常。如果您通过.NET中的COM-Interop使用它,请不要忘记在完成后释放每个COM对象,否则您的应用程序会随机崩溃。
答案 2 :(得分:8)
以下是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
答案 3 :(得分:6)
Microsoft已将此记录为:.MSG File Format Specification
答案 4 :(得分:3)
这是一个“结构化存储”文档。我已成功使用Andrew Peace's code来阅读这些内容,即使在.NET下(使用C ++ / CLI) - 它很干净且相当容易理解。基本上,你需要弄清楚你需要哪些记录,并查询那些 - 它有点毛茸茸,因为不同版本的Outlook和不同类型的消息会产生不同的记录......
答案 5 :(得分:1)
您可以尝试我们的(商业)Rebex Secure Mail库。它可以读取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
答案 6 :(得分:0)
如果您在文本编辑器中打开.MSG文件,我相信您会发现您所访问的信息以纯文本形式存储在文件中。 (这是我至少检查过的所有信息)
编写一些代码可以很容易地解析文件,查找以“From:”或“To:”等开头的行,然后提取所需的信息。
如果您还需要电子邮件的正文,那可能会有点复杂。