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

2007NDRをパブリックフォルダに交換する

Q1。multipart / Alternativeに変更する必要がありますが、「Content-Type:message / delivery-status」を見つけて、text / plainに変更する必要がありますが、必須ではありません。

Q2。これを行うことはできますが、「元の」メッセージの唯一のオプションは、送信者にメッセージを拒否するか、隔離するか、許可することです。削除/削除オプションはありませんが、パブリックフォルダーに移動するため、破棄されます。 。

このルートを使用する場合は、EndOfHeadersEvent中にヘッダーと本文を列挙してから、新しいMailMessageオブジェクトを生成し、元のヘッダーと本文を含めます

Q3。それはうまくいくはずです..それがうまくいかないことがわかる唯一の理由は、サーバー上で受け入れられたドメインではない外部の受信者/ドメインに送信しようとしている場合です..それがあなたがやろうとしていることなら、あなたは実際の外部アドレスを使用してメール連絡先を作成してから、NDRを外部連絡先にCCする必要があります

以下は、あなたがやろうとしていることを達成することができたコードです。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 に答える