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