Exchange 电子邮件是否始终在标头中包含 SMTP 地址?



以下是我对 Outlook 加载项开发的基本问题:

  1. SMTP MIME 标头是否适用于所有邮件项目?甚至是"内部"交换电子邮件(交换用户到交换用户)?

    我使用以下代码来获取标头,但我不确定它是否可靠:

    mailItem.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x007D001E");

  2. 这些标头是否始终在"发件人:"、抄送:"和类似字段中包含有效的 SMTP 电子邮件地址?例如:

    From: "Darth Vader" <dvader@empire.com>
    To: "Palpatine" <palps@empire.com>
    CC: "Boba Fett" <boba@empire.com>, "IG-88" <ig88@empire.com>, "Bossk" <bossk@empire.com>
    

    与活动目录可分辨名称相反,例如...

    From: /O=EMPIRE PARTNERS/OU=EXCHANGE ADMINISTRATIVE GROUP (FYDIBOHF23SPDLT)/CN=RECIPIENTS/CN=VADER, DARTHBC4
    TO: /O=EMPIRE PARTNERS/OU=EXCHANGE ADMINISTRATIVE GROUP (FYDIBOHF23SPDLT)/CN=RECIPIENTS/CN=PALPSBC4
    

以下是澄清这些问题的更多背景:

我正在开发一个 Outlook 加载项,它显示在 Outlook 中的每封电子邮件旁边。它是一个侧边栏,显示有关当前电子邮件线程中所有参与者的信息。我的外接程序需要参与者的 SMTP 电子邮件地址。

这一切都很好 - 除非线程上的用户是 Exchange 用户。在这种情况下,Outlook 不会让我直接访问他们的 SMTP 地址。我必须遵循类似于这篇文章的过程:在邮件的 FROM 字段中从 Exchange 用户中提取 SMTP 地址

String addressString = null;
try
{
ExchangeUser exchangeUser = address.GetExchangeUser();
if (exchangeUser != null)
{
addressString = exchangeUser.PrimarySmtpAddress;
}
} catch {
}
if (addressString == null)
{
addressString = address.Address;
}

这样做的问题是,如果用户的 Exchange Server 连接断开或滞后,则将此用户解析为 SMTP 地址可能会很慢。它甚至可以完全冻结Outlook。

所以回到我最初的问题 - 我是否可以可靠地期望电子邮件标头可用,如果是这样,这些标头是否始终包含有效的SMTP电子邮件地址?

感谢您的任何建议。

我从 MSDN 论坛 @ https://social.msdn.microsoft.com/Forums/en-US/2f0bd7b7-1865-42d1-9b17-86d5d91b15c1/do-exchange-emails-always-include-smtp-addresses-in-the-headers?forum=outlookdev 的回复副本


不,PR_TRANSPORT_MESSAGE_HEADERS并不总是可用。仅当邮件转换为 MIME 并通过 SMTP 连接器传递时,才会设置它。对于在同一域中的本地 Exchange 邮箱之间传递的邮件,情况并非如此。

如果我是你,我会

  1. 缓存地址 - 人帐篷与同一个人对应

  2. 在大多数情况下,SMTP 地址直接在邮件本身上可用。 例如,发件人有PidTagSenderSmtpAddress_W(DASL 名称http://schemas.microsoft.com/mapi/proptag/0x5D01001F),收件人有PR_SMTP_ADDRESS(DASL 名称http://schemas.microsoft.com/mapi/proptag/0x39FE001F)。第一个可以使用MailItem.PropertyAccesssor.GetProperty访问,第二个可以使用Recipient.PropertyAccesssor.GetProperty。您可以在OutlookSpy中看到这些属性(我是其作者) - 单击IMessage按钮。

  3. Outlook 对象模型不支持多任务处理,但您可以在扩展 MAPI(C++ 或 Delphi)或 Redemption 中的 RDO 对象系列中执行此操作(我也是其作者,任何语言)。