簡體   English   中英

System.Runtime.InteropServices.COMException (0x80004004): 操作中止 (0x80004004 (E_ABORT))

[英]System.Runtime.InteropServices.COMException (0x80004004): Operation aborted (0x80004004 (E_ABORT))

我們有一個導出實用程序,可以將 Outlook 中的所有電子郵件導出到本地目錄。 我們的工具工作得非常好。 但是現在我們正在遷移到 O365,從那時起我們就看到了該工具的問題。

從技術上講,它可以讀取所有電子郵件及其屬性,如主題、發件人、收件人等,還可以保存或移動到 Outlook O365 中的其他文件夾。

但是我一執行 SAVEAS,就會收到錯誤“System.Runtime.InteropServices.COMException (0x80004004): Operation aborted (0x80004004 (E_ABORT))”。

下面是示例代碼

        public static void ReadEmails()
        {
            try
            {
                Outlook.Application oApp = new();

                // Get the MAPI namespace.
                Outlook.NameSpace oNs = oApp.GetNamespace("MAPI");

                oNs.Logon("*****@*****.com", System.Reflection.Missing.Value,
                System.Reflection.Missing.Value, System.Reflection.Missing.Value);

                Outlook.Folders fols = oNs.Folders;

                Outlook.MAPIFolder inboxFolder = fols["****"].Folders["Inbox"];

                foreach (Outlook.Folder fol in inboxFolder.Folders)
                {
                    MessageBox.Show(fol.Name);
                    Outlook.Items items = fol.Items;  

                    foreach(Outlook.MailItem mailItem in items)
                    {
                        MessageBox.Show(mailItem.Subject);

                        try
                        {
                            //mailItem.Move(inboxFolder); -- this works
                            mailItem.SaveAs("test.msg", Outlook.OlSaveAsType.olMSG);
                        }
                        catch (System.Exception ex)
                        {
                            MessageBox.Show(ex.ToString());
                        }
                    }
                }                

                oNs.Logoff();
            }
            catch (System.Exception e)
            {
                Console.WriteLine("{0} Exception caught: ", e);
            }
        }

那么我需要做一些特別的事情嗎?

僅供參考,該工具在用戶筆記本電腦上作為用戶在他自己的 email 帳戶上執行。

代碼看起來不錯。 我看不出有什么奇怪的地方。 但以下異常可能表明存在多個問題:

System.Runtime.InteropServices.COMException (0x80004004): 操作中止 (0x80004004 (E_ABORT))

您很可能在 Outlook 中遇到過安全問題。 "Security" in this context refers to the so-called "object model guard" that triggers security prompts and blocks access to certain features in an effort to prevent malicious programs from harvesting email addresses from Outlook data and using Outlook to propagate viruses and spam. 這些問題或提示不能簡單地關閉,除非在 Outlook 2007 中運行了防病毒應用程序。

以下策略可用於避免 Outlook 中的安全提示/問題:

  1. Outlook 基於的低級 API - 擴展 MAPI(或圍繞該 API 的任何其他第三方包裝器,例如,兌換)

  2. Outlook 安全管理器是一種編程工具,可讓您抑制由與 Microsoft Outlook 2000 - 2013 交互的應用程序或加載項的代碼調用的安全警報。

  3. 在公司環境中,管理員可以選擇為部分或所有用戶放松 Outlook 安全性。

  4. 開發一個受信任的 COM 插件並調用它來保存電子郵件,而不是直接使用 OOM。 該加載項可以訪問不會觸發安全問題的安全應用程序 object。

另一個可能的原因是 Microsoft 目前不推薦也不支持從任何無人值守的非交互式客戶端應用程序或組件(包括 ASP、ASP.NET、DCOM 和 NT 服務)自動化 Microsoft Office 應用程序,因為 Office 可能表現出不穩定Office 在此環境中運行時出現的行為和/或死鎖。 以下是 MS 對此類情況的說明:

如果您正在構建在服務器端上下文中運行的解決方案,您應該嘗試使用已確保無人值守執行安全的組件。 或者,您應該嘗試找到允許至少部分代碼在客戶端運行的替代方案。 如果您使用來自服務器端解決方案的 Office 應用程序,該應用程序將缺少許多成功運行所需的功能。 此外,您將承擔整體解決方案穩定性的風險。

Office 服務器端自動化的注意事項文章中閱讀有關此內容的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM