Outlook 互操作 System.ArgumentException 发送但不显示

Outlook interop System.ArgumentException on send but not on display

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

使用 mailItem.Display 正常工作。 解决方法是之后使用 mailItem.Display 和 mailItem.Send,但这有点难看,因为 window 只出现了几分之一秒。 这个问题是否已知,是否有更好的解决方案来解决这个问题?

附加信息: outlook 是打开还是关闭都没有关系。 我们使用的是 .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; //  
    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 Framework 版本并不重要。在 Outlook 中发生这种情况的原因有多种。

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

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

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

我通过删除代码使其正常工作

Inspector oInspector = mail?.GetInspector; //  

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

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