2

当社の webapp には、ユーザーが特定のメール アドレスにメールを送信してデータをインポートできる機能があります。電子メールがアプリによって受信されると、送信者に応じて異なる方法で処理されます。メールの「送信者」フィールドを調べて、データベース内のユーザーと照合します。メールを送信したユーザーが特定されると、そのメールはそのユーザーの個人設定に基づいて処理されます。

これは通常、ほとんどのユーザーにとって問題なく機能しています。ただし、一部のユーザーは、メールが処理されていないと不満を漏らしていました。調査したところ、メール サーバーが送信者のメール アドレスに情報を追加していたことがわかりました。これにより、メール アドレスがデータベースのユーザー テーブルにあるものと一致しなくなりました。たとえば、ユーザーの電子メールtestuser@example.comはデータベースにあるかもしれませんが、受信した電子メールの「送信者」フィールドは次のようになりますbtv1==502867923ab==testuser@example.com。一部の調査では、送信者のサーバーで使用されているBounce Address Tag Validation (BATV)が原因であることが示唆されました。

提供された「送信者」フィールドから正規の電子メールアドレスを抽出できる必要があるため、それをユーザーテーブルと照合できます。ここにいる他の開発者の 1 人が、これを行うための関数を作成し、コード レビューのために提出してくれました。これは彼が書いたものです(C#):

private static string SanitizeEmailSender(string sender)
{
    if (sender == null)
        return null;
    return System.Text.RegularExpressions.Regex.Replace(
        sender, 
        @"^((btv1==.{11}==)|(prvs=.{9}=))", 
        "", 
        System.Text.RegularExpressions.RegexOptions.None);
} 

ここでの正規表現パターンは、メール ログで確認された特定のケースをカバーしています。私の懸念は、正規表現が具体的すぎるかもしれないということです。これらのタグで使用されているプレフィックスはbtv1とだけですか? prvsの後には常に正確に 9 文字ありprvs=ますか? BATV 以外に注意が必要な電子メール送信者のタグ付けスキームはありますか? 私が望んでいないのは、考慮していない他のケースがあったため、来月に再度修正する必要があることを知るために、この修正を本番環境に置くことです.

私の本能は、メール アドレスをトリミングして、最後の=. ただし、調査によると、これは=電子メール アドレスで有効な文字であり、ユーザーの正規の電子メール アドレスの一部である可能性があります。個人的には=、ある種のタグ付けやサブアドレス スキーム以外の電子メール アドレスで使用されているのを見たことがありませんが、あなたにはわかりません。マーフィーの法則は、ユーザーの電子メール アドレスに特定の文字が含まれていないと私が想定した瞬間に、その種のアドレスを持つ誰かがすぐにサインアップすることを示唆しています。

私の質問は次のとおりです。BATV やその他のタグを含む可能性のある長いアドレスを指定して、ユーザーの正規の電子メール アドレスを抽出する業界で受け入れられている信頼できる方法はありますか? これに失敗した場合、これまでに得た方法よりも信頼性の高い方法が少なくともありますか? それとも、私たちが実際に持っているもので十分ですか?

4

2 に答える 2

1

BATV によって追加された情報は常に BATV タグの前にあり、情報を2 つの ==文字列で区切っているため、これを使用する必要があります。

((btv1|prvs)==([^=]|=[^=])*==))

もちろん、=記号が電子メール アドレスの有効な文字として認められているという意味では正しいのですが、それこそが (有効な電子メール アドレスを形成するために) そのシーケンスを使用する理由です。

電子メールに関連する RFC をもう少し掘り下げてみると、MIME が引用印刷可能機能を使用して非 ASCII 文字を電子メール アドレスに許可する構造を追加していることがわかります。これらのことに適切に対処する方法を選択するには、RFC を少し読む必要があります。

最後に、あなたの質問に答えるために、メールサーバーはエンベロープアドレスを変更/書き換えることが許可されているため、これらはメールメッセージのルーティングに使用される制御プロトコル SMTP のアドレスです--- (sendmail はメールの中でもそれを行うことができますヘッダー フィールド) あなたの質問に対する正しい答えは、送信者の正規の電子メール アドレスを抽出する信頼できる方法 (業界で受け入れられているかどうかにかかわらず) がないということです。メッセージがターゲット受信者に到達するにつれてアドレスが書き換えられ、途中で情報が失われます。使用された元のアドレスを回復することはできません。

最後に、少し説明します。

  • 送信者フィールドは、エンベロープ送信者のアドレス (FROM: <sender@address.com>元の SMTP プロトコル メッセージで使用されるアドレス) を電子メールに含めるために、最終的な SMTP 受信者によって追加されます。
  • Fromフィールドは、メッセージの発信元を識別するために元のメール クライアントによって追加されます。この動作は、メッセージが再送信された場合に備えて、Resent-fromまたはResent-senderフィールドの存在によって変更できます。これらは、メッセージの再送信を識別します。
  • 最後に、送信者はReply-toヘッダーを使用して、応答がそのアドレスに送信されることを示すことができます。

SMTP プロトコルがどのように機能するかを理解するには、詳細な RFC-2821 (SMTP プロトコル) および RFC-2822 (インターネット メール メッセージの形式) のドキュメントを読んでください。

于 2015-04-10T05:29:05.593 に答える