[解決済み] 電子メールアドレスの検証を行うC#コード
質問
ある文字列が有効な電子メールアドレスであることを検証するための最もエレガントなコードは何でしょうか?
どのように解決するのですか?
これについてはどうですか?
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のいずれかになります。
--- さらに読む ---
関連
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み] JavaScriptでメールアドレスを検証するのに最適な方法は何ですか?
-
[解決済み] ディープクローンオブジェクト
-
[解決済み] C#で文字列のエンコーディングを手動で指定せずに、一貫性のあるバイト表現を得るには?
-
[解決済み] C#でHashtableよりDictionaryが好まれる理由とは?
-
[解決済み] 有効なメールアドレスの最大長を教えてください。
-
[解決済み] 電子メールアドレスに使用できる文字は何ですか?
-
[解決済み] メール送信インテント
-
[解決済み】大文字・小文字を区別しない「Contains(string)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み】Nullableオブジェクトは値を持たなければならない?
-
[解決済み] 有効なメールアドレスの最大長を教えてください。
-
[解決済み】iOSでメールアドレスが有効であることを確認する【重複あり