0

メールが配信不能な場合に送信される NDR (配信不能レポート) を解析する csharp アプリを作成しようとしています。目標は、無効になったメーリング リストからメール アドレスの登録を解除することです。

Exchange Web サービス API (EWS) を使用して Exchange サーバーに接続するコードを書くことができました。メッセージ本文を取得します。私がやりたいことは、電子メール アドレスとエラー コードを照合して、電子メール アドレスとエラーのレポートを生成し、手動で確認できるようにすることです。

メッセージの本文の内容は次のようになります。

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
    <body>
    <p><b><font color="#000066" size="3" face="Arial">Delivery has failed to these recipients or groups:</font></b></p>
    <font color="#000000" size="2" face="Tahoma">
    <p><a href="mailto:email@domain.com">email@domain.com</a><br>
    A communication failure occurred during the delivery of this message. Please try resending the message later. If the problem continues, contact your helpdesk.<br>
    </p>
    </font><br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <font color="#808080" size="2" face="Tahoma">
    <p><b>Diagnostic information for administrators:</b></p>
    <p>Generating server: WEB16.domain.net</p>
    <p>email@domain.com<br>
    #&lt; #5.5.0 smtp;554 Sending address not accepted due to spam filter&gt; #SMTP#</p>
    <p>Original message headers:</p>
    <pre>Received: from WEB12 ([192.168.33.64]) by WEB16.domain.net with Microsoft
     SMTPSVC(7.5.7601.17514);    Sun, 8 Jul 2012 09:27:42 -0400
    Thread-Topic: domain.com order 178014 has been received and is pending
    thread-index: Ac1dDXyHxyN&#43;loq8SeaIzTsVoLE/3g==
    From: &lt;sender@domain.com&gt;
    To: &lt;recipient@domain.com&gt;
    CC:
    BCC:
    Subject: domain.com order 178014 has been received and is pending
    Date: Sun, 8 Jul 2012 09:27:56 -0400
    Message-ID: &lt;22C1C2F24E1744D4B51C1A5EF9DE3E50@domain.net&gt;
    MIME-Version: 1.0
    Content-Type: text/plain
    Content-Transfer-Encoding: 7bit
    X-Mailer: Microsoft CDO for Windows 2000
    Content-Class: urn:content-classes:message
    Importance: normal
    Priority: normal
    X-MimeOLE: Produced By Microsoft MimeOLE V6.1.7601.17609
    Return-Path: sender@domain.com
    X-OriginalArrivalTime: 08 Jul 2012 13:27:42.0955 (UTC) FILETIME=[743A53B0:01CD5D0D]
    </pre>
    </font>
    </body>
    </html>

送信された電子メールアドレスとそれに付随するエラーメッセージに一致する正規表現を考え出そうとしています.

            // First we set the input string.
            string body = message.Body.Text;

            // Regex string
            Regex emailregex = new Regex("^<p>(.+?)</a><br>$");

            var match = emailregex.Match(body);

            if (match.Success)
                 Console.WriteLine(match.Groups[1].Value);

            // Regex string
            Regex errorregex = new Regex("</a><br>\n(.+?)<br>$");

            match = errorregex.Match(body);

            if (match.Success)
                Console.WriteLine(match.Groups[1].Value);

私が設定した正規表現はどちらも機能していないようです。私は正規表現の第一人者ではありません。誰かが私が間違っている方向に私を向けることができますか?

ありがとうブラッド

4

1 に答える 1

0

さまざまな電子メール リレー ソフトウェアが非常に異なる電子メール形式を生成するため、これは非常に複雑な作業です。最終的には、エラー電子メール テンプレートの複雑なセットと、単純な (ただしコードに関してはおそらく異なる) マッチング アルゴリズムを作成する必要があります。さらに悪いことに、新しいテンプレートが登場し続けるため、パーサーを更新し続ける必要があります。単純な正規表現の一致でこれらすべてを処理できるとは思わないでください。

最後の正規表現

"To: &lt;(.+?)&gt;")

タスクに適しているように見えますが、この特定の返された電子メール テンプレートでのみです。それ以外の場合は、(返信されたメッセージから) 他の電子メール アドレスを検出するのと同じくらい悪い場合があります。

この部分を自分でプログラミングするのではなく、自動的に登録解除を処理できるメーリング リスト マネージャーに切り替えることをお勧めします。

これができない場合は、テンプレートから失敗したアドレスを抽出するのではなく、合理的な確実性で認識された特定の既知のテンプレートをチェックするコード ブロックを追加する必要があります。

于 2012-07-08T16:01:36.627 に答える