【问题标题】:Outlook interop System.ArgumentException on send but not on displayOutlook 互操作 System.ArgumentException 发送但未显示
【发布时间】:2021-07-07 16:38:10
【问题描述】:

自上个月以来,多个 Outlook 安装 Office 365 或 Office 2016 在通过互操作发送邮件时出现问题。 我们通过互操作创建一个 mailitem,然后尝试通过 mailitem.Send() 发送邮件 现在我们从 Microsoft.Outlook.Interop.Outlook._MailItem.Send() 得到一个 System.ArgumentException 我们从几年前开始使用此代码,在不同的 Office 版本中没有任何问题。

使用 mailItem.Display 作为例外。 一种解决方法是在之后使用 mailItem.Display 和 mailItem.Send,但这有点难看,因为窗口会出现几分之一秒。 这个问题是否已知,是否有更好的解决方案来解决这个问题?

附加信息: 无论前景是开放的还是关闭的。 我们使用的是 .NET 4.7.2,但框架版本无关紧要。

void TestMail(string to, string subject, string body, string attachment, bool useWorkaround = false)
{
    var outlook = new Microsoft.Office.Interop.Outlook.Application();
    var mail = outlook.CreateItem(OlItemType.olMailItem) as MailItem;
    Inspector oInspector = mail?.GetInspector; // https://stackoverflow.com/questions/11330101/can-only-send-email-via-outlook-if-outlook-is-open 
    if (mail == null)
        throw new Exception();
    mail.Subject = subject;
    mail.HTMLBody = body + mail.HTMLBody;
    Microsoft.Office.Interop.Outlook.Recipient recipient = mail.Recipients.Add(to);
    recipient.Type = (int)OlMailRecipientType.olTo;
    if (!mail.Recipients.ResolveAll())
        throw new Exception();
    if (!string.IsNullOrEmpty(attachment)
        mail.Attachments.Add(attachment);
    if (useWorkaround)
        mail.Display();
    mail.Send();
 }

【问题讨论】:

    标签: .net outlook interop


    【解决方案1】:

    您说的完全正确,在这种情况下,.net 框架版本无关紧要。在 Outlook 中发生这种情况的原因有多种。

    首先,我建议在提交电子邮件之前先尝试使用Save 方法并解析收件人(ResolveAllResolve 方法)。请参阅non-helpful exception flagged on _MailItem.Send() 了解更多信息。

    其次,您可以尝试关闭 Outlook 对象模型上的安全防护,或者只使用 Outlook 所基于的低级 API 以避免 Outlook 中的安全问题。例如,Outlook Security Manager 组件是一种单行编程工具,可让您绕过安全设置并避免与 Microsoft Outlook 交互的加载项和应用程序中的安全警告、警报或提示。您也可以尝试使用扩展 MAPI 或围绕该 API 的任何其他包装器,例如 Redemption。低级代码不会像 OOM 那样触发安全问题。

    这不是何时何地调用 Send 方法以及使用哪个代码创建该项目。

    【讨论】:

    • 感谢您的提示。 ResolveAll 已被调用并返回 true。我尝试在调用 Send 之前使用 Save,但出现了同样的问题。
    • 当您从外部应用程序自动化 Outlook 时,您是否尝试避免来自 OOM 的安全问题?您是否尝试使用加载项或 VBA 宏中的 Send 方法?你得到相同的结果吗?
    • 保安不是问题。我通过强制激活它进行了尝试,并出现了弹出窗口,但错误仍然存​​在。我还没有在插件中尝试过。
    • 你的代码是什么?如何添加收件人并解决它们?
    【解决方案2】:

    我通过删除代码让它工作了

    Inspector oInspector = mail?.GetInspector; // https://stackoverflow.com/questions/11330101/can-only-send-email-via-outlook-if-outlook-is-open 
    

    我不知道为什么这条线会导致问题,但有趣的是,这条线现在与它的预期完全相反。

    【讨论】:

      【解决方案3】:

      我通过在您执行发送之前发出 myInspector.Close(olSave) 使其工作。这仅在 Outlook 打开时有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-10
        • 2015-04-08
        • 1970-01-01
        • 1970-01-01
        • 2013-08-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多