[英]Exchange 2007 NDRs to public Folders
如果目标是公用文件夹,则Exchange删除未送达报告(NDR)。
我想编写一个传输代理(SMTPReceiveAgent,c#)来绕过此行为。 目的是将NDR更改为“普通”邮件,不要通过交换删除。 我测试了一些对此的想法,但没有找到解决方案。 现在我需要帮助。
这里有一些问题:
识别NDR很容易。
内容类型:多部分/报告; report-type =交付状态;
但是,我必须在邮件中更改将其转换为“普通”邮件的内容? 更改为多部分/替代无效或不足。
或者,我可以创建一条新消息,其中包含从NDR捕获的所有信息。 在SMTReceiveAgents.OnSubmitted事件中执行此操作的最佳方法是什么?
要为普通用户从公用文件夹NDR创建副本,我尝试了args.Mailitem.Recipients.Add(new RoutingAddress("username@mydomain.com"))
。 这行不通。 为什么?
有任何答案,提示或解决方案吗?
Q1。 您确实必须将其更改为多部分/替代,但是,您还应该找到“ Content-Type:消息/传递状态”并将其更改为文本/纯文本,但这不是必需的
Q2。 您可以这样做,但“原始”邮件的唯一选择是拒绝发件人,隔离或允许它。.没有删除/删除选项..但是由于它将进入公用文件夹,因此将其丢弃。
如果走这条路线,则在EndOfHeadersEvent期间枚举标头和正文,然后生成一个新的MailMessage对象,并包括原始的标头和正文
Q3。 那应该行..我能看到它行不通的唯一原因是,如果您尝试发送到服务器上不接受域的外部收件人/域,。如果这就是您要执行的操作,那么您需要使用您的真实外部地址创建一个邮件联系人,然后将NDR抄送给该外部联系人
以下是我能够完成您想要执行的操作的代码。 我挂在onRcpt和onEndOfHeaders上的原因是检查输入的收件人是否是公用文件夹地址。我发现它比枚举末尾的rcpt列表快
void UserSendCounterSmtpReceiveAgent_OnRcptCommand(ReceiveCommandEventSource source, RcptCommandEventArgs e)
{
if(source == null || e == null)
{
return;
}
String recipient = e.RecipientAddress.ToString();
if (recipient.Equals("publicfolder@domain.com"))
{
this.testOnEndOfHeaders = true;
}
}
void UserSendCounterAgent_OnEndOfHeaders(ReceiveMessageEventSource source, EndOfHeadersEventArgs e)
{
if (source == null || e == null)
{
return;
}
if (testOnEndOfHeaders)
{
this.testOnEndOfHeaders = false;
Header obj = e.Headers.FindFirst("Content-Type");
if (obj.Value.Equals(@"multipart/report"))
{
obj.Value = @"multipart/alternative";
e.MailItem.Recipients.Add(new RoutingAddress("forwardto@domain.com"));
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.