如果目标是公用文件夹,则Exchange将删除未送达报告(NDR)。
我想编写传输代理(SMTPReceiveAgent,c#)来绕过此行为。目标是将NDR更改为“正常”邮件,不要通过交换删除。我测试一些人围绕这个想法,没有找到解决方案。现在我需要帮助。
这里有一些问题:
识别NDR很容易。
内容类型:multipart / report; 报告类型=递送状态;
但是我必须在邮件中改变 将此转换为“正常”邮件?更改为multipart / alternative 不工作或不够。
作为替代方案,我可以创建一条新消息,捕获所有信息 来自NDR。什么是最好的方式来做到这一点 SMTReceiveAgents.OnSubmitted Event?
要为普通用户创建公用文件夹NDR的副本,我尝试args.Mailitem.Recipients.Add(new RoutingAddress("username@mydomain.com"))
在EndOfDataHandler中。这不起作用。为什么呢?
任何答案,提示或解决方案?
答案 0 :(得分:0)
Exchange 2007 NDRs to public Folders
Q1。您必须将其更改为multipart / alternative,但是,您应该找到“Content-Type:message / delivery-status”并将其更改为text / plain但不是必需的
Q2。你可以这样做,但你对“原始”消息的唯一选择是拒绝它给发件人,隔离它或允许它..没有删除/删除选项..但是因为它将进入公共文件夹,它将被丢弃
如果你走这条路线然后在EndOfHeadersEvent期间枚举标题和正文,然后生成一个新的MailMessage对象并包含原始的标题和正文
Q3。这应该工作..唯一的原因我可以看到它不会工作是如果你试图发送到服务器上不是一个接受域的外部收件人/域..如果你正在尝试做那么你将需要使用您的真实外部地址创建邮件联系人,然后将NDR CC连接到外部联系人
以下是我能够完成你想要做的事情的代码。我挂钩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"));
}
}
}