在 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 上显示与邮件提示相同的信息。所以我的问题是
有什么方法可以进入邮件提示并从中读取信息吗?
如果否,查找联系人电子邮件地址是否为 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 有帮助的文章。
我目前在使用 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 上显示与邮件提示相同的信息。所以我的问题是
有什么方法可以进入邮件提示并从中读取信息吗?
如果否,查找联系人电子邮件地址是否为 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 有帮助的文章。