代码之家  ›  专栏  ›  技术社区  ›  juliushuck

Outlook VSTO加载项:无法解析RecipientName

  •  1
  • juliushuck  · 技术社区  · 8 年前

    我正在编程一个outlook加载项。 我想在邮件发送前修改它。因此,在电子邮件发送之前,我已经注册了一个活动。我可以修改它,但当我试图更改邮件收件人(so 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;
        }
    
    3 回复  |  直到 8 年前
        1
  •  0
  •   Dmitry Streblechenko    8 年前

    您正在将全部重置为收件人。你真的想这么做吗?尝试使用 MailItem.Recipients.Add (b) Recipient 对象)后跟 Recipient.Resolve .

    您还设置了纯文本 Body 属性删除所有格式。考虑使用 HTMLBody 相反,只要记住两个html字符串必须合并而不是连接才能生成有效的html。

        2
  •  0
  •   Eugene Astafiev    8 年前

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

    您也可以考虑制作电子邮件的副本,更改收件人(对副本做任何更改)并提交它。在这种情况下,您必须区分这些消息,并在 ItemSend 事件处理程序。你可以用它来工作 UserProperties .

        3
  •  0
  •   juliushuck    8 年前

    开始工作了:

                        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();