我需要在.NET 中读取 Outlook .MSG 文件,而不使用 COM API for Outlook(因为它不会安装在我的应用程序将运行的机器上)。有没有免费的第三方库可以做到这一点?我想提取 From、To、CC 和 BCC 字段。如果它们也存储在 MSG 文件中,发送/接收日期字段会很好。
7 回答
CodeProject 上有代码可用于在没有 COM 的情况下读取 .msg 文件。见这里。
更新:我找到了一个名为Outlook Redemption的第 3 方 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 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
如果您在文本编辑器中打开 .MSG 文件,我相信您会发现您所获取的信息以纯文本形式存储在文件中。(至少在我检查过的所有消息中)
编写一些代码来解析文件以查找以“From:”或“To:”等开头的行,然后提取您需要的信息,这将非常容易。
如果您还需要电子邮件的正文,那可能会更复杂一些。