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
方法并解析收件人(ResolveAll
或 Resolve
方法)。有关详细信息,请参阅 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 打开时有效。
自上个月以来,几个 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
方法并解析收件人(ResolveAll
或 Resolve
方法)。有关详细信息,请参阅 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 打开时有效。