3

我们使用 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)

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

4

3 回答 3

2

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

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

于 2012-08-03T18:09:42.810 回答
0

首先,代码是正确的,不需要额外的发布。最明显的原因是您的 Outlook 在连接到 Exchange Online 时无法创建邮件项目。您可以使用以下 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(插件快速团队)

于 2012-06-28T16:01:00.147 回答
0

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

您需要先关闭窗口或等待托盘图标消失,然后再执行创建新电子邮件。

于 2016-06-02T10:33:24.960 回答