0

如果目标是公用文件夹,Exchange 将删除未送达报告 (NDR)。

我想编写一个传输代理(SMTPReceiveAgent,c#)来绕过这种行为。目标是将 NDR 更改为“正常”邮件,不会通过交换删除。我对此进行了一些测试,但没有找到解决方案。现在我需要帮助。

这里有一些问题:

  1. 识别 NDR 很容易。

    内容类型:多部分/报告;报告类型=交付状态;

    但是我必须在邮件中更改什么才能将其转换为“普通”邮件?更改为 multipart/alternative 不起作用或不够。

  2. 作为替代方案,我可以使用从 NDR 捕获的所有信息创建一条新消息。在 SMTReceiveAgents.OnSubmitted 事件中执行此操作的最佳方法是什么?

  3. 要从公用文件夹 NDR 为普通用户创建副本,我 args.Mailitem.Recipients.Add(new RoutingAddress("username@mydomain.com")) 在 EndOfDataHandler 中尝试过。这不起作用。为什么?

有任何答案、提示或解决方案吗?

4

1 回答 1

0

将 2007 NDR 交换到公用文件夹

Q1。您确实必须将其更改为 multipart/alternative,而且,您应该找到“Content-Type: message/delivery-status”并将其更改为 text/plain 但它不是必需的

Q2。您可以这样做,但对于“原始”邮件,您唯一的选择是将其拒绝给发件人、隔离它或允许它。没有删除/删除选项。但由于它会进入公用文件夹,因此将被丢弃.

如果您走这条路线,则在 EndOfHeadersEvent 期间枚举标头和正文,然后生成一个新的 MailMessage 对象并包含原始标头和正文

Q3。那应该可以工作..我可以看到它不起作用的唯一原因是,如果您尝试发送到不是服务器上接受域的外部收件人/域..如果那是您要尝试做的事情,那么您'将需要使用您的真实外部地址创建一个邮件联系人,然后将 NDR 抄送给外部联系人

下面是我能够完成你想要做的事情的代码。我挂钩 onRcpt 和 onEndOfHeaders 的原因是检查输入的收件人是否是公用文件夹地址。我发现它比在标题末尾枚举 rcpt 列表更快

NDR 保存到公用文件夹

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"));
                    }

                }

        }
于 2012-09-07T22:22:02.410 回答