Exchange传输代理 - 无法更改邮件信封的DisplayName

时间:2017-12-16 01:53:57

标签: c# email exchange-server distribution-list exchange-server-2016

我有一个分发列表,它几乎完全由我的组织之外的收件人组成。由于其中一个收件人邮件主机出现问题,他们拒绝所有带有From标头的邮件,这些邮件来自其网络外部。因此,如果user1@company.com向列表发送消息,则user2@company.com将永远不会收到该消息。因此,我编写了一个传输代理来修改邮件项目的P1和P2 SMTP和邮件信封中的FromSender,使其成为分发列表本身的邮件项目。在大多数情况下,一切都很好。

为了能够知道谁将电子邮件发送到通讯组列表,我让传输代理将P2邮件信封的显示名称设置为发件人的真实电子邮件地址。如果我组织外的某人向列表发送电子邮件,但如果发件人在我的组织内,则不会发生这种情况。我已经尝试将其实现为RoutingAgentSmtpReceiveAgent并且行为相同。从我的日志记录中,我可以看到正在为组织内部的发件人处理邮件。

有谁知道这不符合预期的行为?

public void OnEndOfDataHandler(ReceiveMessageEventSource source, EndOfDataEventArgs eodArgs)
{
    MailItem mailItem = eodArgs.MailItem;
    EmailMessage message = mailItem.Message;
    EnvelopeRecipient distributionList = AddressedToDistributionList(mailItem);

    if(distributionList != null)
    {
        mailItem.FromAddress = distributionList.Address;

        if (message.From.DisplayName == message.From.SmtpAddress)
            message.From = new EmailRecipient(message.From.SmtpAddress.Replace("@", " at "), distributionList.Address.GetAddress(true));
        else
            message.From = new EmailRecipient(message.From.DisplayName + " (" + message.From.SmtpAddress.Replace("@", " at ") + ")", distributionList.Address.GetAddress(true));

        if (message.Sender.DisplayName == message.Sender.SmtpAddress)
            message.Sender = new EmailRecipient(message.Sender.SmtpAddress.Replace("@", " at "), distributionList.Address.GetAddress(true));
        else
            message.Sender = new EmailRecipient(message.Sender.DisplayName + " (" + message.Sender.SmtpAddress.Replace("@", " at ") + ")", distributionList.Address.GetAddress(true));
    }
}

1 个答案:

答案 0 :(得分:0)

更改显示名称无法正常工作,因为当邮件传递到Store Exchange时,将始终解析电子邮件地址,并使用GAL中的EX地址条目。这是设计的,你不会改变这种行为。我的建议是你的代理人,你应该只在消息扩展后采取行动(例如,查看fork https://msdn.microsoft.com/en-us/library/microsoft.exchange.data.transport.routing.queuedmessageeventsource.fork%28v=exchg.80%29.aspx),并且只应该对那些将被路由到有问题的目的地的消息采取行动。