1. ホーム
  2. c#

[解決済み] 電子メールアドレスの検証を行うC#コード

2022-03-18 16:24:45

質問

ある文字列が有効な電子メールアドレスであることを検証するための最もエレガントなコードは何でしょうか?

どのように解決するのですか?

これについてはどうですか?

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

ほとんどのユースケースにおいて、偽の "invalid" は偽の "valid" よりもユーザーや将来の保証にとってはるかに悪いものです。以下はその例です。 以前は、このような回答が一般的でした。 という質問に対する回答です(その回答はその後削除されました)。より詳細な説明と、問題を解決するための他のアイディアがあります。

サニティチェックを提供することは、ユーザーエクスペリエンスにとってやはり良いアイデアです。メールアドレスが有効であると仮定して、既知のトップレベルドメインの検索、ドメインのMXレコードのチェック、一般的なドメイン名(gmail.cmo)からのスペルエラーのチェックなどを行うことができます。そして、警告を表示して、ユーザーに「はい、私のメールサーバーは本当に電子メールアドレスとして許可しています」と言う機会を与えます。


ビジネスロジックに例外処理を使うことについては、避けるべきことだと私も思います。しかし、これは利便性と明快さが教義を上回る場合の1つです。

それに、メールアドレスを使って何かするとしたら、おそらくそれをMailAddressにすることになるはずです。この機能を全く使わないとしても、おそらく同じパターンを使いたいはずです。をキャッチすることで、特定の種類の失敗をチェックすることもできます。 異なる例外 : null, empty, invalid formatのいずれかになります。


--- さらに読む ---

System.Net.Mail.MailAddressに関するドキュメント

有効なメールアドレスの構成について説明します。