Outlook VSTO 加载项:无法解析收件人姓名

Outlook VSTO Add-In: Can not resolve recipientname

我正在编写 outlook 加载项。 我想在发送前修改邮件。因此,在发送电子邮件之前,我已经为我注册了一个活动。我可以修改它,但是当我尝试更改邮件的收件人时(所以 mail.To),它给我一个错误(不是在我的代码是 运行 时,而是在 outlook 尝试发送邮件时)。

错误说:'...无法解析接收者名称'(我已经翻译了它所以它不是真正的错误文本但接近它)

这是我的代码:

void Application_ItemSend(object item, ref bool cancel)
    {
        if (item is Outlook.MailItem mail)
        {
            var to = mail.To;
            var body = mail.Body;
            var editedBody = to + "#" + body;
            mail.Body = editedBody;
            mail.To = @"<another email>";
        }
    }


private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        //Register the new event
        Globals.ThisAddIn.Application.ItemSend += Application_ItemSend;
    }

您需要通过将 cancel 参数设置为 true 来取消操作,并安排使用新电子邮件地址重新发送操作。在主线程上触发 Tick 事件的计时器可以帮助完成该任务。

您也可以考虑复制电子邮件,更改收件人(对副本进行任何更改)并提交。在这种情况下,您将必须区分此类消息并在 ItemSend 事件处理程序中跳过它们。为了让它工作,你可以使用 UserProperties.

您正在重置所有收件人。那是你真正想做的吗?尝试使用 MailItem.Recipients.Add(返回 Recipient 对象),然后使用 Recipient.Resolve

您还设置纯文本 Body 属性 清除所有格式。考虑改用 HTMLBody,请记住两个 HTML 字符串必须合并而不是连接起来才能生成有效的 HTML.

成功了:

                    var to = string.Empty;

                    mail.Recipients.ResolveAll();

                    foreach (Outlook.Recipient r in mail.Recipients)
                    {
                        to += r.Address + ";";
                    }
                    if (to.Length > 0)
                        to = to.Substring(0, to.Length - 1);

                    mail.Body = to + "#" + mail.Body;

                    //Modify receiver
                    mail.To = string.Empty;
                    Outlook.Recipient recipient = mail.Recipients.Add("<email>");
                    recipient.Resolve();