0

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

为了能够知道谁将电子邮件发送到分发列表,我让传输代理将 P2 消息信封的显示名称设置为发件人的真实电子邮件地址。如果我的组织外部的人向列表发送电子邮件,则此方法有效,但如果发件人在我的组织内部,则无效。我已经尝试将它实现为 aRoutingAgent和 aSmtpReceiveAgent并且行为是相同的。从我的日志记录中,我可以看到正在为我组织内部的发件人处理邮件。

有谁知道这不符合预期?

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));
    }
}
4

1 回答 1

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)并且应该只对那些将被路由到有问题的目的地的消息采取行动。

于 2017-12-21T02:19:12.520 回答