2011-05-17 94 views
6

我有一个C#应用程序读取.msg文件并提取正文和附件。但是当我尝试加载.eml文件时,应用程序崩溃。我正在加载这样的文件:如何在C#中使用Outlook MAPI打开.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文件?

+1

为什么你需要使用MAPI来加载.eml文件?由于.eml文件只是一个MIME消息,因此自己解析它不应太困难(在CodePlex中搜索MIME解析器)。在这方面有什么特定的需求吗? – 2011-05-18 21:54:44

+0

这是因为我有一个应用程序与MAPI分裂.msg文件,我认为我不需要做一个更改并打开我的.eml文件,就像我用.msg文件做的那样,而无需编写新的代码。 – CubaLibre 2011-07-07 13:29:01

回答

8
+1

修订版本可用:轻松从.EML文件中检索电子邮件信息 - 修改后的http://www.codeproject。com/Articles/76607/Easily-Retrieve-Email-Information-from-EML-Files-R – danglund 2012-08-17 08:45:12

+0

@danglund修订后的版本看起来更加复杂,是3个大文件.cs文件而不是一个(一些包含不相关的东西)即使为我编译。 – MGOwen 2015-03-25 04:15:01

5

CreateItemFromTemplate只适用于MSG/OFT文件。 Fot的的EML文件,你要么需要显式地解析该文件在你的代码或使用第三方库(如赎回):

下面的代码将创建一个MSG文件,并导入EML文件到它使用RedemptionRDOSession对象):

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)来访问它的各种特性(主题,正文等)

+0

是否可以导入eml而无需兑换? – CubaLibre 2011-05-20 16:18:58

+0

当然,如果您解析EML文件并一次设置一个MailItem对象属性。 – 2013-08-05 06:57:07

+0

嗨,我想使用此代码,但我没有.msg。我需要一个假的.msg来导入一个eml? 如何直接导入/打开eml? – bobzer 2017-01-27 17:54:14

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 
+0

这将导致EML文件被显示,这可能不是OP想要的。 – 2015-10-03 19:46:05

0

虽然Outlook可以打开EML文件,有没办法只能用VBA做编程。所以我创建了这个VBA宏,它循环通过一些文件夹并使用SHELL EXEC打开每个EML文件。在Outlook打开EML文件之前可能需要几毫秒,因此VBA会一直等待,直到ActiveInspector中打开某些内容为止。最后,这封电子邮件被复制到某个选定的文件夹中,并且(如果成功),原始EML文件被删除。

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

相关问题