Office365的Outlook.Application.CreateItem说:操作失败

时间:2012-06-27 19:34:04

标签: outlook office365

我们使用Add-in-Express编写了一个Outlook插件。代码:

private void CreateShowMessageUsingCreateItem(Outlook._Application OutlookApp) 
{ 
    Outlook.MailItem mail = null; 
    try 
    { 
        mail = OutlookApp.CreateItem(Outlook.OlItemType.olMailItem) as Outlook.MailItem; 
        mail.Save(); 
        mail.Display(false); 
    } 
    catch (Exception ex) 
    { 
        System.Windows.Forms.MessageBox.Show(ex.Message); 
    } 
    finally 
    { 
        if (mail != null) Marshal.ReleaseComObject(mail); 
    } 
} 

Outlook连接到Exchange时工作。失败的时候 Outlook已连接到Office365。错误:

Exception: System.Runtime.InteropServices.COMException (0x80004005): The operation failed.
   at Microsoft.Office.Interop.Outlook.ApplicationClass.CreateItem(OlItemType ItemType)
   at DocuSignInk.DSToolbox.ShowResponse(MailItem senderEmail) in C:\docusign_source\Ink_Outlook\DocuSignInk\DSToolbox.cs:line 540

某些研究表明您需要释放您的对象 在循环中进行这些调用时。但我不是在循环中。一世 甚至不能打电话去工作,所以我没有达到目的 我可以放任何东西。

使用Wireshark和Charles进行测试表明存在问题 在客户端。我试图看看是否有更详细的信息 来自服务器的错误,但服务器没有流量 一点都不。

快速Python脚本可以从命令行运行。

import win32com.client

outlook = win32com.client.Dispatch('Outlook.Application')
mail = outlook.CreateItem(win32com.client.constants.olMailItem)
mail.Save()
mail.Display(False)

所以它必须是客户端的东西。我猜也许与线程有关?

3 个答案:

答案 0 :(得分:2)

如果您尚未激活Microsoft Office(包括Outlook),则会发生这种情况。

简而言之,测试加载项如果在激活检查发生之前立即运行,则可以正常工作。 一旦激活检查发生,API调用将失败。

答案 1 :(得分:0)

首先,代码是正确的,不需要额外的释放。最明显的原因是,当您连接到Exchange Online时,Outlook无法创建邮件项目。您可以使用以下VBA宏进行检查:

Public Sub CreateEmailItem()

  Dim mail As Outlook.MailItem

  Set mail = Application.CreateItem(olMailItem)
  mail.Save
  mail.Display (False)

  Set mail = Nothing

End Sub

此致 Dmitry Kostochko(附加快车队)

答案 2 :(得分:0)

我和HResult一起有同样的例外,即-2147467259 直接原因是一个Outlook弹出窗口,告知其试用版本或Outlook关闭流程,在您关闭Outlook中的先前活动(包括通过执行上述代码显示的电子邮件)之后待处理(此过程由相应的托盘指示任务栏中的图标,直到它消失。)

在执行新电子邮件之前,您需要先关闭窗口或等待托盘图标消失。