VSTO Outlook Addin:Application_ItemSend参数中的有线Item对象

时间:2017-01-07 06:37:17

标签: c# vsto outlook-addin

我为Outlook 2016(办公室365的一部分)编写了一个简单的VSTO插件,以检查我们公司外部是否有某些电子邮件地址混合在收件人列表中。 我简化了如下代码:

      int countExternalAddress;
      string externalAddresses;
      string internalDomain=“@example.com”; 
     //indicates the email domain of our company, we use exchange server.

     private void Application_ItemSend(object Item, ref bool Cancel)
     {

        countExternalAddress = 0;
        externalAddresses="";

        Outlook.MailItem item = (Outlook.MailItem)Item;

        foreach (Outlook.Recipient recp in item.Recipients)
        {
             ConvertExchangeAddrToSMTPAddr(recp.AddressEntry.Address);
             //by access ExchangeUser.PrimarySmtpAddress
             CheckTheAddress(recp.AddressEntry.Address);
        }

        if (countExternalAddress > 0)
        {
           Warn();
        }

     }

代码大部分时间都没有问题,但有时Warn()函数会根据最后一封电子邮件的收件人(部分)显示警告,而不是CURRENT收件人。 这个问题不能一直重现,但一旦发生,程序就像:

  1. 向内部收件人(我的同事,交换地址)发送电子邮件,交换地址已成功转换为SMTP地址,因为它们被预定义为"内部"地址,邮件将在没有警告的情况下发送。
  2. 向其他一些内部收件人发送另一封电子邮件,该程序显示警告"外部地址混合"以及"外部"地址来自先前发送的电子邮件(在上面的1中提到,并非所有地址都只是其中之一),并且,检测到的外部地址是Exchange地址格式,应该转换为SMTP格式。 奇怪的是,我找不到当前电子邮件的收件人列表中的地址。 如果我保存当前的电子邮件并重新启动Outlook,当我选择已保存的电子邮件并尝试重新发送时,没有这样的"外部"地址将再次被检测到。

    看起来ItemSend事件传递的Item对象包含一些不仅属于当前电子邮件的收件人,而且还来自之前发送的收件人,但它们在当前电子邮件中不可见,而且我找不到这样的收件人在发送的电子邮件中也是如此。 我正在使用的工作PC没有调试环境,所以我的手段已经用完了。请提前谢谢你,给我你的帮助。

1 个答案:

答案 0 :(得分:0)

这与你做>

有什么关系

if (countExternalAddress > 0) { Warn(); }

而不是 ==

if (countExternalAddress == 0)
    {
       Warn();
    }

看起来很奇怪,但会留下一封电子邮件来警告你。