在 Outlook VSTO 中获取收件人的电子邮件地址 + 阅读邮件提示

Get email address of a recipient in Outlook VSTO + Read MailTips

我目前在使用 VSTO 为 2010 年创建的 Outlook 加载项时遇到问题,该加载项是我开发的,用于识别电子邮件地址是位于组织内部还是位于组织外部。

在发送电子邮件时,我正在使用下面的 MAPI 属性 来读取收件人的电子邮件地址。其中 addr 是 AddressEntry 对象。

Microsoft.Office.Interop.Outlook.PropertyAccessor pa = addr.PropertyAccessor;
smtpAddress = pa.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x39FE001E").ToString();

这适用于交换联系人和本地联系人。但是,如果您创建本地联系人并从全球地址簿中选择电子邮件地址,则该 MAPI 属性 不会出现在该特定联系人中。我只需要知道查找联系人(电子邮件地址)是在组织内部还是在组织外部的最佳方法是什么(这种方法也会降低性能,我的组织中有人会向 500 多个人发送电子邮件用户,通过上述 MAPI 属性 处理 internal/external 电子邮件扫描需要 10 多分钟)。我知道 outlook 已经在 "New Email" window 上显示与邮件提示相同的信息。所以我的问题是

  1. 有什么方法可以进入邮件提示并从中读取信息吗?

  2. 如果否,查找联系人电子邮件地址是否为 inside/outside 组织的最佳方法是什么(考虑到性能)

Outlook 对象模型不提供任何用于阅读邮件提示的内容。

尝试改用以下代码:

private string GetSenderSMTPAddress(Outlook.MailItem mail)
{
    string PR_SMTP_ADDRESS =
       @"http://schemas.microsoft.com/mapi/proptag/0x39FE001E";
    if (mail == null)
    {
        throw new ArgumentNullException();
    }
    if (mail.SenderEmailType == "EX")
    {
       Outlook.AddressEntry sender =
          mail.Sender;
       if (sender != null)
       {
           //Now we have an AddressEntry representing the Sender
           if (sender.AddressEntryUserType ==
               Outlook.OlAddressEntryUserType.olExchangeUserAddressEntry
               || sender.AddressEntryUserType ==                    Outlook.OlAddressEntryUserType.olExchangeRemoteUserAddressEntry)
           {
               //Use the ExchangeUser object PrimarySMTPAddress
               Outlook.ExchangeUser exchUser =
                   sender.GetExchangeUser();
               if (exchUser != null)
               {
                   return exchUser.PrimarySmtpAddress;
               }
               else
               {
                   return null;
               }
           }
           else
           {
               return sender.PropertyAccessor.GetProperty(
                   PR_SMTP_ADDRESS) as string;
           }
       }
       else
       {
           return null;
       }
   }
   else
   {
       return mail.SenderEmailAddress;
   }
}

请参阅 How to: Get the SMTP Address of the Sender of a Mail Item. Also you may find the HowTo: Convert Exchange-based email address into SMTP email address 有帮助的文章。