【发布时间】:2010-09-06 03:56:36
【问题描述】:
我需要使用 COM API for Outlook 读取 .NET 中的 Outlook .MSG 文件(因为它不会安装在我的应用程序将运行的机器上)。有没有免费的第三方库可以做到这一点?我想提取 From、To、CC 和 BCC 字段。发送/接收日期字段如果也存储在 MSG 文件中会很好。
【问题讨论】:
标签: c# outlook email message msg
我需要使用 COM API for Outlook 读取 .NET 中的 Outlook .MSG 文件(因为它不会安装在我的应用程序将运行的机器上)。有没有免费的第三方库可以做到这一点?我想提取 From、To、CC 和 BCC 字段。发送/接收日期字段如果也存储在 MSG 文件中会很好。
【问题讨论】:
标签: c# outlook email message msg
如果您在文本编辑器中打开 .MSG 文件,我相信您会发现您所获取的信息以纯文本形式存储在文件中。 (至少在我检查过的所有消息上都有)
编写一些代码来解析文件以查找以“From:”或“To:”等开头的行然后提取您需要的信息会很容易。
如果您还需要电子邮件的正文,那可能会有点复杂。
【讨论】:
Microsoft 记录了这一点:.MSG File Format Specification
【讨论】:
更新:我找到了一个名为Outlook Redemption 的第三方 COM 库,目前它对我来说运行良好。如果您通过 .NET 中的 COM-Interop 使用它,请不要忘记在完成后释放每个 COM 对象,否则您的应用程序会随机崩溃。
【讨论】:
这是一个“结构化存储”文档。过去我已经成功地使用Andrew Peace's code 来阅读这些内容,即使在.NET 下(使用C++/CLI)也是如此——它很干净而且相当容易理解。基本上,你需要弄清楚你需要哪些记录,然后查询这些记录——这有点麻烦,因为不同版本的 Outlook 和不同类型的消息会导致不同的记录......
【讨论】:
CodeProject 上有代码可用于在没有 COM 的情况下读取 .msg 文件。见here。
【讨论】:
这是 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
【讨论】:
您可以尝试我们的(商业)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
【讨论】: