我们使用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)
所以它必须是客户端的东西。我猜也许与线程有关?
答案 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中的先前活动(包括通过执行上述代码显示的电子邮件)之后待处理(此过程由相应的托盘指示任务栏中的图标,直到它消失。)
在执行新电子邮件之前,您需要先关闭窗口或等待托盘图标消失。