我们目前正在进行概念验证,创建一个从Microsoft.Exchange.Data.Transport.Routing.RoutingAgent
派生的传输代理。我们使用OnResolvedMessage
事件将电子邮件重新路由到外部电子邮件服务器(非Exchange服务器)。这一切都很好,我们可以将电子邮件重新路由到外部服务器。然而,如果一封电子邮件同时包含内部和外部收件人,则该电子邮件将被拆分为两封单独的电子邮件,并导致两封电子邮件进入外部电子邮件服务器。虽然这两封电子邮件包含相同的内容,只是RCPT TO标头不同,但这将导致外部电子邮件服务器处理同一封电子邮件两次,这对我们的项目来说是不理想的。
这是我第一次创建传输代理,我正在尝试确定exchange服务器是否有一些设置需要更改,以阻止符合此标准的电子邮件被拆分为多个电子邮件?
我们的传输代理的主要目标是允许发送给内部收件人的电子邮件由外部电子邮件服务器处理,因为它们目前将未经处理地放入内部用户的邮箱。这可能与我们的发送/接收连接器有关,如有任何关于这些连接器的指导,我们将不胜感激。如果路由代理不是这个问题的正确解决方案,我们对其他可能性持开放态度。
我们的事件处理程序代码段:
private void OnOnResolvedMessage(ResolvedMessageEventSource source, QueuedMessageEventArgs queuedMessageEventArgs)
{
var mailItem = queuedMessageEventArgs.MailItem;
var origSubject = mailItem.Message.Subject;
mailItem.Message.Subject = "RouteAgent: " + origSubject;
foreach (var recipient in mailItem.Recipients)
{
var newRouteDomain = new RoutingDomain("externalSendConnectorAddressSpace.com");
var dest = new RoutingOverride(newRouteDomain, DeliveryQueueDomain.UseOverrideDomain);
source.SetRoutingOverride(recipient, dest);
}
}
当在传输管道中调用OnResolved Message时,收件人将得到解决,消息将发生分叉,其规则主要在https://technet.microsoft.com/en-us/library/bb430743(v=exchg.150).aspx。EdgeTransport.exe.config是可以进行传输管道配置的地方,但我不认为有任何配置选项可以满足您的要求。
如果您在OnSubmission事件中捕获消息,这将允许您在进行任何分类之前获取消息。在这一点上,你可以或多或少地对消息做你想做的事情。但是,作为分类过程的一部分,还会发生其他事情,例如内容转换https://technet.microsoft.com/en-us/library/bb232174(v=不包括150).aspx
然而,如果一封电子邮件同时包含内部和外部收件人,则该电子邮件将被拆分为两封单独的电子邮件,并导致两封电子邮件进入外部电子邮件服务器。虽然这两封电子邮件包含相同的内容,只是RCPT TO标头不同,但这将导致外部电子邮件服务器处理同一封电子邮件两次,这对我们的项目来说是不理想的。
这对外部服务来说应该不是什么大不了的事情,因为这应该是在处理电子邮件的任何过程中都会预料到的事情,例如外部服务使用Internet MessageId进行关联很容易。
干杯Glen