文字列が有効な電子メール アドレスであることを検証する最もエレガントなコードは何ですか?
ベストアンサー1
これはどうですか?
bool IsValidEmail(string email)
{
var trimmedEmail = email.Trim();
if (trimmedEmail.EndsWith(".")) {
return false; // suggested by @TK-421
}
try {
var addr = new System.Net.Mail.MailAddress(email);
return addr.Address == trimmedEmail;
}
catch {
return false;
}
}
Stuart のコメントによると、これは常に true を返すのではなく、最終的なアドレスを元の文字列と比較します。MailAddress は、スペースを含む文字列を「表示名」と「アドレス」の部分に解析しようとするため、元のバージョンでは誤検知が返されていました。
明確に言うと、この質問は、特定の文字列が電子メール アドレスの有効な表現であるかどうかを尋ねているのであって、電子メール アドレスがメッセージの送信先として有効であるかどうかを尋ねているのではありません。その場合、唯一の現実的な方法は、確認のためにメッセージを送信することです。
電子メール アドレスは、最初に想像するよりも寛容であることに注意してください。以下はすべて完全に有効な形式です。
- 歯車
- 「オレンジ色の歯車」@example.com
- 123@$.xyz
ほとんどのユースケースでは、誤った「無効」は誤った「有効」よりもユーザーや将来の保証にとってはるかに悪いです。かつては受け入れられた答えであった記事この質問に対する回答(その後、この回答は削除されました)には、より詳しい情報と、問題を解決するための他のアイデアがいくつか記載されています。
健全性チェックを提供することは、ユーザー エクスペリエンスの観点からは依然として良いアイデアです。電子メール アドレスが有効であると仮定すると、既知のトップレベル ドメインを検索し、ドメインの MX レコードをチェックし、一般的なドメイン名 (gmail.cmo) のスペル エラーをチェックするなどできます。次に、警告を表示して、ユーザーに「はい、私のメール サーバーは、電子メール アドレスとして ������ を本当に許可しています」と答える機会を与えます。
ビジネス ロジックに例外処理を使用することについては、避けるべきことであることに同意します。ただし、これは利便性と明確さが教義を上回る可能性があるケースの 1 つです。
また、メールアドレスを他の用途に使う場合は、おそらくそれをMailAddressに変換することになるでしょう。この関数を使わない場合でも、おそらく同じパターンを使うことになるでしょう。特定の種類の失敗をチェックするには、異なる例外: null、空、または無効な形式です。
- - 参考文献 - -