我有一个分发列表,它几乎完全由我的组织之外的收件人组成。由于其中一个收件人邮件主机出现问题,他们拒绝所有带有From
标头的邮件,这些邮件来自其网络外部。因此,如果user1@company.com向列表发送消息,则user2@company.com将永远不会收到该消息。因此,我编写了一个传输代理来修改邮件项目的P1和P2 SMTP和邮件信封中的From
和Sender
,使其成为分发列表本身的邮件项目。在大多数情况下,一切都很好。
为了能够知道谁将电子邮件发送到通讯组列表,我让传输代理将P2邮件信封的显示名称设置为发件人的真实电子邮件地址。如果我组织外的某人向列表发送电子邮件,但如果发件人在我的组织内,则不会发生这种情况。我已经尝试将其实现为RoutingAgent
和SmtpReceiveAgent
并且行为相同。从我的日志记录中,我可以看到正在为组织内部的发件人处理邮件。
有谁知道这不符合预期的行为?
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));
}
}
答案 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),并且只应该对那些将被路由到有问题的目的地的消息采取行动。