将 2007 NDR 交换到公用文件夹
Q1。您确实必须将其更改为 multipart/alternative,而且,您应该找到“Content-Type: message/delivery-status”并将其更改为 text/plain 但它不是必需的
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"));
}
}
}