【问题标题】:Do Exchange emails always include SMTP addresses in the headers?Exchange 电子邮件是否始终在标头中包含 SMTP 地址?
【发布时间】:2018-08-20 22:00:38
【问题描述】:

以下是关于 Outlook 插件开发的基本问题:

  1. SMTP MIME 标头是否可用于所有邮件项目?甚至是“内部”Exchange 电子邮件(Exchange 用户到 Exchange 用户)?

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

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

  2. 这些标头是否始终在 From:、CC: 和类似字段中包含有效的 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>
    

    与 Active Directory 专有名称相反,例如...

    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 地址。我必须遵循类似于此帖子的过程:Extract SMTP address from Exchange User in the FROM field of a message

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 电子邮件地址?

感谢您的建议。

【问题讨论】:

  • “这些标头是否总是包含有效的 SMTP 电子邮件地址”?不,我可以编写一些错误的代码并发送一封电子邮件,其中地址 = 一些乱码,您的服务器仍然会接收它。并且取决于您拥有的邮件服务器,它可能会或可能不会丢弃邮件
  • 感谢您的回复。我不担心边缘情况或这样的滥用。所以为了澄清,我想知道日常使用,有效的 SMTP 消息(即非格式错误)。有问题的邮件服务器是 Exchange。那么 Exchange 是否会简单地发送标头和 SMTP 地址,即使它们在技术上是有效的?

标签: c# outlook smtp exchange-server outlook-addin


【解决方案1】:

我在 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 对象系列中执行此操作。

    李>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 2020-01-21
    • 2011-08-22
    • 2016-02-21
    • 2013-05-01
    • 2021-02-10
    • 1970-01-01
    • 2011-03-11
    相关资源
    最近更新 更多