如何在C#中使用Outlook MAPI打开.eml文件?

时间:2011-05-17 08:53:38

标签: c# .net outlook mapi eml

我有一个C#应用程序,它读取.msg文件并提取正文和附件。但是当我尝试加载.eml文件时,应用程序崩溃了。我正在加载这样的文件:

MailItem mailItem = (MailItem)outlookApp.CreateItemFromTemplate(msgFileName);
mailItem.SaveAs(fullFilename, OlSaveAsType.olHTML); // save body in html format
for(int i = 0; i < mailItem.Attachments.Count; i++)
    mailItem.Attachments[i].SaveAsFile(filename); // save attachments

这适用于.msg文件,但它不适用于.eml文件。我不明白为什么.eml文件不起作用,因为我可以在Outlook 2010中打开.eml文件。

如何使用Outlook Primary Interop Assembly

加载.eml文件

4 个答案:

答案 0 :(得分:8)

答案 1 :(得分:5)

CreateItemFromTemplate仅适用于MSG / OFT文件。 在EML文件中,您需要在代码中明确解析文件或使用第三方库(例如Redemption):

以下代码将创建一个MSG文件,并使用RedemptionRDOSession对象)将EML文件导入其中:

  set Session = CreateObject("Redemption.RDOSession")
  Session.MAPIOBJECT = outlookApp.Session.MAPIOBJECT
  set Msg = Session.CreateMessageFromMsgFile("C:\Temp\temp.msg")
  Msg.Import "C:\Temp\test.eml", 1024
  Msg.Save
  MsgBox Msg.Subject

然后,您可以使用消息(RDOMail)访问各种属性(主题,正文等)

答案 2 :(得分:0)

要从.eml文件创建MailItem,您可以使用以下两个步骤:首先打开Outlook流程实例,然后使用Outlook API创建MailItem。

  string file = @"C:\TestEML\EmlMail.eml";
  System.Diagnostics.Process.Start(file);
  Outlook.Application POfficeApp = (Outlook.Application)Marshal.GetActiveObject("Outlook.Application");  // note that it returns an exception if Outlook is not running
  Outlook.MailItem POfficeItem = (Outlook.MailItem)POfficeApp.ActiveInspector().CurrentItem; // now pOfficeItem is the COM object that represents your .eml file

答案 3 :(得分:0)

虽然 Outlook可以打开EML文件,但无法以编程方式仅使用VBA。所以我创建了这个VBA宏,它循环遍历某个文件夹并使用 SHELL EXEC 打开每个EML文件。在Outlook打开EML文件之前可能需要几毫秒,因此VBA会等待,直到ActiveInspector中的某些内容打开。最后,此电子邮件将复制到某个选定的文件夹中,并且(如果成功)将删除原始EML文件。

在这里查看我的完整答案(和代码): https://stackoverflow.com/a/33761441/3606250