2011-05-17 95 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

相關問題