電子メールアドレスを検証するC#コード


461

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




文字列だけでなく、他にも多くの重要な検証があります。このSMTPサーバーにメールが存在するかどうか、ユーザーがメールを入力しているかどうかなどを確認するか、メールを確認するために処理するAPIを使用することをお勧めします。ver-email.comの
Amr Magdy

microsoftdocs.microsoft.com/en-us/dotnet/standard/base-types/…からのベストlnk
Kishore Sahasranaman

github.com/jstedfast/EmailValidationライブラリを使用できます。
Mohammad Reza Sadreddini、

回答:


784

これはどうですか?

bool IsValidEmail(string email)
{
    try {
        var addr = new System.Net.Mail.MailAddress(email);
        return addr.Address == email;
    }
    catch {
        return false;
    }
}

明確にするために、質問は特定の文字列が電子メールアドレスの有効な表現であるかどうかを尋ねているのではなく、電子メールアドレスがメッセージを送信するための有効な宛先であるかどうかを尋ねています。そのための唯一の現実的な方法は、確認のためにメッセージを送信することです。

電子メールアドレスは、最初に想定するよりも寛容であることに注意してください。これらはすべて完全に有効な形式です。

  • cog @ wheel
  • 「オレンジ色の歯車」@ example.com
  • 123@$.xyz

ほとんどのユースケースでは、偽の「無効」は、偽の「有効」よりもユーザーと将来の証明にとってはるかに悪いものです。これは、以前この質問への回答として受け入れられてい記事です(その回答は削除されています)。問題を解決するための詳細とその他のアイデアが含まれています。

健全性チェックを提供することは、依然としてユーザーエクスペリエンスにとって良いアイデアです。電子メールアドレスが有効であると想定すると、既知のトップレベルドメインを探し、ドメインのMXレコードを確認し、一般的なドメイン名(gmail.cmo)のスペルエラーを確認するなどして、ユーザーに警告を表示できます。 「はい、私のメールサーバーでは、🌮🍳🎁をメールアドレスとして使用できます。」


ビジネスロジックに例外処理を使用することに関しては、それは避けるべきことだと私は同意します。しかし、これは、便利さと明快さがドグマを上回る可能性があるケースの1つです。

その上、あなたが電子メールアドレスで何か他のことをするなら、それは恐らくそれをMailAddressに変えることを含むでしょう。この正確な関数を使用しない場合でも、おそらく同じパターンを使用する必要があります。また、null、空、無効な形式などのさまざまな例外をキャッチして、特定の種類の障害を確認することもできます。


スチュアートのコメントによると、これは常にtrueを返すのではなく、最終アドレスを元の文字列と比較します。MailAddressはスペースを含む文字列を「表示名」と「アドレス」の部分に解析しようとするため、元のバージョンは誤検知を返していました。


- - 参考文献 - -

System.Net.Mail.MailAddressのドキュメント

有効なメールアドレスを構成する要素の説明


23
実際、それは間違いではありません。a @ aは有効な電子メールアドレスです。haacked.com/archive/2007/08/21/…を参照してください 。実際、引用符付きのアドレスを使用すると、このメソッドは誤った結果を返します。
歯車

53
+1:これは、System.Net.Mailクラスを使用してメールを送信する場合の最良の答えです。これは、おそらく.NETを使用している場合と同じです。この種類の検証を使用することを決定したのは、有効なアドレスであっても、メールを送信できない電子メールアドレスを受け入れる意味がないためです。
グレッグブナ

24
私はお勧めしません。trueを返します:IsValidEmail("this is not valid@email$com");
カカシ

15
MailAddressはDisplayNameも解析しようとするため、多くの問題が発生しているようです。したがって、「single space@domain.com」はDisplayName「single」とアドレス「space@domain.com」に解析されます。これを修正するには、次のようにします。return(addr.Address == email);
スチュアート

18
私はこれが好き; 私は、強制が実際の仕様よりも制限的であることはありません。偽陰性は偽陽性よりもはるかに悪い(「私のメールが無効であることをどういう意味ですか?」)
Casey

242

これは古い質問ですが、SOで見つけたすべての回答は、最近のものも含めて、これと同じように回答されます。ただし、.Net 4.5 / MVC 4では、System.ComponentModel.DataAnnotationsから[EmailAddress]アノテーションを追加することで、フォームに電子メールアドレス検証を追加できるため、なぜからの組み込み機能を使用できないのか不思議に思っていました。一般的にネット。

これは機能しているようで、私にはかなりエレガントなようです:

using System.ComponentModel.DataAnnotations;

class ValidateSomeEmails
{
    static void Main(string[] args)
    {
        var foo = new EmailAddressAttribute();
        bool bar;
        bar = foo.IsValid("someone@somewhere.com");         //true
        bar = foo.IsValid("someone@somewhere.co.uk");       //true
        bar = foo.IsValid("someone+tag@somewhere.net");     //true
        bar = foo.IsValid("futureTLD@somewhere.fooo");      //true

        bar = foo.IsValid("fdsa");                          //false
        bar = foo.IsValid("fdsa@");                         //false
        bar = foo.IsValid("fdsa@fdsa");                     //false
        bar = foo.IsValid("fdsa@fdsa.");                    //false

        //one-liner
        if (new EmailAddressAttribute().IsValid("someone@somewhere.com"))
            bar = true;    
    }
}

4
MSが独自のドキュメントに同意できないのは残念ですが。これはjs@proseware.com9を拒否します
Casey

13
これEmailAddressAttributeSystem.Net.Mail.MailAddress、たとえばMailAddressTLDのアドレスを受け入れるよりも許容度が低いことに注意してください。あなたができる限り寛容である必要があるならば、心に留めておくべきちょうど何か。
Aaroninus、2015

5
@Cogwheel:回答がコメントのどこかにある場合、おそらく回答の本文に追加する必要があります。
hofnarwillie

6
@hofnarwillie:本体にありますが、コメントは複雑です。あなたの目標がユーザーを怒らせないことであるなら、あなたの検証は仕様以上に制限されるべきではありません。電子メールが有効かどうかを本当に確認する唯一の方法は、テストメッセージを送信することです。
Cogwheel

4
foo.IsValid(null);返品にはご注意くださいtrue
urig 2017年

62

私は私のために仕事をするこのシングルライナーメソッドを使用します

using System.ComponentModel.DataAnnotations;
public bool IsValidEmail(string source)
{
    return new EmailAddressAttribute().IsValid(source);
}

コメントによると、source(メールアドレス)がnullの場合、これは「失敗」します。

public static bool IsValidEmailAddress(this string address) => address != null && new EmailAddressAttribute().IsValid(address);

1
これは私にはうまくいきません。「「データ注釈」が存在しません...アセンブリ参照がありませんか?」追加する必要がある参照はどれですか?
B.クレイシャノン

ソースがnullの場合、これはtrueを返します。msdn.microsoft.com/en-us/library/hh192424を参照してください "指定された値が有効またはnullの場合はtrue、それ以外の場合はfalse。"
jao 2017

2
より良いバージョン:public static Boolean IsValidMailAddress(this String pThis) => pThis == null ? false : new EmailAddressAttribute().IsValid(pThis);
セバスチャンホフマン

7
またはさらに良い:public static bool IsValidEmailAddress(this string address) => address != null && new EmailAddressAttribute().IsValid(address);
Patrik Melander

1
この拡張メソッドはfalse、null文字列に対して暗黙的に返すべきではないと思います。それが私が(さらに良い)++バージョンを提案する理由です:public static bool IsValidEmailAddress(this string address) => new EmailAddressAttribute().IsValid(address ?? throw new ArgumentNullException());。私は今行って、さらに良いバージョンの改革派教会を見つけます。
Marc.2377

41

.net 4.5はSystem.ComponentModel.DataAnnotations.EmailAddressAttributeを追加しました

EmailAddressAttributeのソースを参照できます。これは、内部で使用する正規表現です。

const string pattern = @"^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$";

2
残念ながら、EmaillAddressAttributeはallowsを許可します。これは電子メールに有効な文字ではありません
BZ

16
@BZはい、そうです。なぜそうではないと思いますか?
ケーシー

@Chad Grant:これはC#バージョンです。VB.Netを提供してください。\\などの文字をエスケープするため、または文字列をそのまま提供することができます。
Nikhil Agrawal、2015年

3
これは機能しますが、RegexOptions.IgnoreCaseこのパターンでは大文字を明示的に許可しないため、忘れないでください!
Chris

1
Regexは非常に慎重であることに注意してください。「この属性は、jquery validateと同等のサーバー側の電子メール検証を提供するため、同じ正規表現を共有します」。
Ohad Schneider 2017

38

私は#1からフィルの答えを受け取り、このクラスを作成しました。次のように呼び出します。bool isValid = Validator.EmailIsValid(emailString);

ここにクラスがあります:

using System.Text.RegularExpressions;

public static class Validator
{

    static Regex ValidEmailRegex = CreateValidEmailRegex();

    /// <summary>
    /// Taken from http://haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-address-until-i.aspx
    /// </summary>
    /// <returns></returns>
    private static Regex CreateValidEmailRegex()
    {
        string validEmailPattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|"
            + @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)"
            + @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";

        return new Regex(validEmailPattern, RegexOptions.IgnoreCase);
    }

    internal static bool EmailIsValid(string emailAddress)
    {
        bool isValid = ValidEmailRegex.IsMatch(emailAddress);

        return isValid;
    }
}

5
小さなものですが、私は使用します:return(!string.IsNullOrEmpty(emailAddress))&& ValidEmailRegex.IsMatch(emailAddress);
Marc

これは単なる恐怖です:)
Alexandru Dicu

31

個人的には、@記号が含まれていることを確認する必要があります。キャラクター。さまざまな正しさで使用できる正規表現はたくさんありますが、これらのほとんどは有効なメールアドレスを除外するか、無効なものを通過させると思います。偽のメールアドレスを入力したい場合は、偽のアドレスを入力します。電子メールアドレスが正当であり、その人がその電子メールアドレスを制御していることを確認する必要がある場合は、特別なコード化されたリンクを含む電子メールを送信して、実際のアドレスであることを確認できるようにする必要があります。


6
個人的には、それよりももう少し検証を行うべきだと思います。誰かがボビーテーブルのメールアドレスまたはそれより悪いことに挑戦するのは当然です。
ルーク・キナン

31
準備済みステートメントを使用している場合、ボビーテーブルのメールアドレスの何が問題になっていますか。SQLインジェクションの問題が発生しないようにSQLクエリを正しく実行する方法など、有効なメールアドレスを構成するものとは何の関係もない、有効なメールアドレスについて話しています。
Kibbee 2009

私はあなたが誰かがそこに入れるものを知らないと思いますが、悪意のある人はその値が最終的にあなたのメールシステムに送られるかもしれないことを知っています。私は徹底的に防御を行い、少し厳格になることを好みます。
ルーク・キナン

10
それはメールシステムが心配することです。他のシステムのセキュリティ上の問題である可能性があるという理由だけで、完全に有効なメールアドレスを拒否することは避けません。電子メールサーバーがセキュリティ上の問題を引き起こす不正な電子メールアドレスしか必要としない場合は、おそらく別のサーバーに切り替える必要があります。
Kibbee 2009

4
多層防御は、セキュリティタマネギの各レベルが腐っていない場合にのみ機能します。1つの腐った層は、玉ねぎ全体を台無しにすることを意味します。Sunのµ-lawエンコーディングの脆弱性から防御したいので「foo@example.com.au」を拒否しても意味がありませんか?笑わないでください、それは私に起こりました。私がここにコメントしている理由は、メディケアオーストラリアが「.au」アドレスを許可せず、「。com」のみを許可するためです。また、Mark Swansonの「電子メールを検証しない方法」、mdswanson.com
blog / 2013/10/14 /

17

私は最良の方法は次のとおりだと思います:

    public static bool EmailIsValid(string email)
    {
        string expression = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";

        if (Regex.IsMatch(email, expression))
        {
            if (Regex.Replace(email, expression, string.Empty).Length == 0)
            {
                return true;
            }
        }
        return false;
    }

この静的関数は、一般的なクラスに含めることができます。


この回答は、ドメイン部分にTLDのあるアドレスを受け入れません。
Simone

15

短くて正確なコード

string Email = txtEmail.Text;
if (Email.IsValidEmail())
{
   //use code here 
}

public static bool IsValidEmail(this string email)
{
  string pattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|" + @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)" + @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";    
  var regex = new Regex(pattern, RegexOptions.IgnoreCase);    
  return regex.IsMatch(email);
}

2
解決策をありがとう
ジャック

私はこれを避けるためにIsValidEmail(文字列の電子メール)BOOLパブリック静的にIsValidEmail(この文字列のメール)BOOLのpublic staticを変更する必要がありました:stackoverflow.com/questions/10412233/...
Gonerダグ

@Goner Doug、この機能は次のように機能します。(bool flag = EmailAddress.IsValidEmail())
Naveen

2
「THIS」を削除して、フォームに追加したときにコンパイラの問題が発生しないようにする必要がありました。
Goner Doug、

@Goner Doug、その機能性はこのように機能します。string email = "abc@xyz.com"; if(email.IsValidEmail()){はfalseを返します。} else {trueを返す;}
Naveen

14

最もエレガントな方法は、.Netの組み込みメソッドを使用することです。

これらの方法:

  • 試され、テストされています。これらの方法は、私自身の専門プロジェクトで使用されています。

  • 信頼性が高く高速な内部で正規表現を使用します。

  • MicrosoftによってC#用に作成されました。ホイールを再発明する必要はありません。

  • ブールの結果を返します。Trueは、メールが有効であることを意味します。

.Net 4.5以上のユーザー向け

この参照をプロジェクトに追加します。

System.ComponentModel.DataAnnotations

これで、次のコードを使用できます。

(new EmailAddressAttribute().IsValid("youremailhere@test.test"));

使用例

宣言するいくつかのメソッドは次のとおりです。

protected List<string> GetRecipients() // Gets recipients from TextBox named `TxtRecipients`
{
    List<string> MethodResult = null;

    try
    {
        List<string> Recipients = TxtRecipients.Text.Replace(",",";").Replace(" ", "").Split(';').ToList();

        List<string> RecipientsCleaned = new List<string>();

        foreach (string Recipient in RecipientsCleaned)
        {
            if (!String.IsNullOrWhiteSpace(Recipient))
            {
                RecipientsNoBlanks.Add(Recipient);

            }

        }

        MethodResult = RecipientsNoBlanks;

    }
    catch//(Exception ex)
    {
        //ex.HandleException();
    }

    return MethodResult;

}


public static bool IsValidEmailAddresses(List<string> recipients)
{
    List<string> InvalidAddresses = GetInvalidEmailAddresses(recipients);

    return InvalidAddresses != null && InvalidAddresses.Count == 0;

}

public static List<string> GetInvalidEmailAddresses(List<string> recipients)
{
    List<string> MethodResult = null;

    try
    {
        List<string> InvalidEmailAddresses = new List<string>();

        foreach (string Recipient in recipients)
        {
            if (!(new EmailAddressAttribute().IsValid(Recipient)) && !InvalidEmailAddresses.Contains(Recipient))
            {
                InvalidEmailAddresses.Add(Recipient);

            }

        }

        MethodResult = InvalidEmailAddresses;

    }
    catch//(Exception ex)
    {
        //ex.HandleException();

    }

    return MethodResult;

}

...そしてそれらの動作を示すコード:

List<string> Recipients = GetRecipients();

bool IsValidEmailAddresses = IsValidEmailAddresses(Recipients);

if (IsValidEmailAddresses)
{
    //Emails are valid. Your code here

}
else
{
    StringBuilder sb = new StringBuilder();

    sb.Append("The following addresses are invalid:");

    List<string> InvalidEmails = GetInvalidEmailAddresses(Recipients);

    foreach (string InvalidEmail in InvalidEmails)
    {
        sb.Append("\n" + InvalidEmail);

    }

    MessageBox.Show(sb.ToString());

}

さらに、この例:

  • 単一の文字列を使用して、セミコロンで区切られた0個、1個、または多数の電子メールアドレスを含めるため、仕様を超えて拡張されます ;
  • EmailAddressAttributeオブジェクトのIsValidメソッドの使用方法を明確に示します。

代わりに、4.5未満のバージョンの.Netのユーザーの場合

.Net 4.5が利用できない状況では、次のソリューションを使用します。

具体的には、以下を使用します。

public static bool IsValidEmailAddress(string emailAddress)
{
    bool MethodResult = false;

    try
    {
        MailAddress m = new MailAddress(emailAddress);

        MethodResult = m.Address == emailAddress;

    }
    catch //(Exception ex)
    {
        //ex.HandleException();

    }

    return MethodResult;

}

public static List<string> GetInvalidEmailAddresses(List<string> recipients)
{
    List<string> MethodResult = null;

    try
    {
        List<string> InvalidEmailAddresses = new List<string>();

        foreach (string Recipient in recipients)
        {
            if (!IsValidEmail(Recipient) && !InvalidEmailAddresses.Contains(Recipient))
            {
                InvalidEmailAddresses.Add(Recipient);

            }

        }

        MethodResult = InvalidEmailAddresses;

    }
    catch //(Exception ex)
    {
        //ex.HandleException();

    }

    return MethodResult;

}

1
@ThomasAyoub私は、EmailAddressAttributeの回答、およびinput == .Addressをチェックしてnew MailAddress()を使用する回答を見たことがないので、かなり便利だと思います。コメントを読まなければ、受け入れられた答えはかなり間違っています。new MailAddress( "Foobar Some@thing.com")はそれを証明します。
Jan

@Jan fwiw、ManikがKnickerlessをEmailAddressAttribute4か月弱で倒しましたが、これはnull問題をキャッチします。
ルフィン

7

正直に言うと、量産コードでは、私がする最善のことは @シンボルをです。

メールを完全に検証する立場にいることは決してありません。それが本当に有効であるかどうかを私がどのように見るか知っていますか 送信された場合。そうでなければ、それは悪いことです。もしそうなら、人生は良いことです。私が知る必要があるのはそれだけです。


6

この正規表現は、@マーク以外のものをチェックすることと、奇妙なエッジケースを受け入れることの間の適切なトレードオフであることがわかりました。

^[^@\s]+@[^@\s]+(\.[^@\s]+)+$

少なくとも@マークの周りに何かを配置し、少なくとも通常のドメインを配置します。


私は同じ正規表現を思いつきました;)それでも無効な文字を許可します
ステファン

この回答は、ドメイン部分のTLDを受け入れません。
Simone

:@Simoneおそらく誰もが実際にかかわらず、ドメイン部分にTLDと電子メールアドレスを持っていませんserverfault.com/a/721929/167961のノートを、それは、これらの日を禁止することができるコメントで
マシュー・ロック

@MatthewLockこれはイントラネットアドレスですか?好きbob@companyinternal
Simone

@Simone実際にこのスキームを使用している人はいますか?
マシューロック

4

メールアドレスの検証は、見かけほど簡単ではありません。正規表現だけを使用して電子メールアドレスを完全に検証することは、実際には理論的に不可能です。

この件に関するディスカッションとFParsecを使用したF#実装については、私のブログ投稿をチェックしてください。[/ shameless_plug]


1
私はあなたに代替アプローチのリストが好きだった。とても興味深い。
ルーク・キナン

1
興味深い記事。しかし、メールアドレスに誰がコメントを入れ、そこにネストしたコメントを真剣に受けているのでしょうか?
マシューロック

3
@matthew IETFで許可されている理由はわかりませんが、それが可能なので、十分な検証を行って考慮に入れる必要があります。
Mauricio Scheffer

4

これが私の答えです-Philのソリューションは、「someone@q.com」のような1文字のドメインでは失敗します。信じられないかもしれませんが、これは=)を使用しています(たとえば、centurylinkに移動します)。

Philの答えもPCRE標準でのみ機能するので、C#がそれを採用しますが、JavaScriptが爆破します。JavaScriptには複雑すぎます。したがって、mvc検証属性にPhilのソリューションを使用することはできません。

これが私の正規表現です。MVC検証属性でうまく機能します。
-@の前のすべてが簡略化されているため、少なくともJavaScriptは機能します。Exchangeサーバーが5.1.3を提供しない限り、ここで検証を緩和しても大丈夫です。-@の後のすべては、単一文字のドメイン用に変更されたPhilのソリューションです。

public const string EmailPattern =
        @"^\s*[\w\-\+_']+(\.[\w\-\+_']+)*\@[A-Za-z0-9]([\w\.-]*[A-Za-z0-9])?\.[A-Za-z][A-Za-z\.]*[A-Za-z]$";

system.net.mail MailMessage()の使用を提案している人にとって、それは柔軟な方法です。確かに、C#は電子メールを受け入れますが、電子メールを送信しようとするとすぐに、Exchangeサーバーが5.1.3ランタイムエラーで爆弾します。


これは、最も思慮深く/合理的/現実的な答えであると思われます。ラルフに感謝します。
Fattie 14年

これが今のところ最良の答えです!basket@ball有効な電子メールアドレスとして受け入れられる悪い解決策が正解とそれらすべての賛成票を得たとは信じられません。とにかくありがとう!
障害者

ありがとうこれは最良の解決策であり、受け入れられるべき答えです。
Bat_Programmer 2018

3

メールアドレスが有効かどうかを本当に知りたい場合は、メールエクスチェンジャーにそれを証明するよう依頼してください。正規表現は必要ありません。必要に応じてコードを提供できます。

一般的な手順は次のとおりです。1.メールアドレスにはドメイン名の部分がありますか?(@> 0のインデックス)2. DNSクエリを使用して、ドメインにメールエクスチェンジャーがあるかどうかを確認します。サーバーの応答を解析します。6.これまでにメッセージを作成した場合は、メッセージを終了します。問題はありません。

これは想像できるように、時間的には非常に費用がかかり、SMTPに依存していますが、機能します。


これらのインターフェースの偽物、スタブ、モックを作成しましたか?
マークA

1
それはうまくいきません。電子メールアドレスを確認するためのsmtpプロトコルは、非推奨/使用されていません。スパマーがその機能を使用するため、メールサーバーでこれを有効にすることは悪い習慣と見なされます。
チャドグラント

私はあなたの提案をポイント2まで保ちます。既知のドメイン名パターンをチェックするよりもずっと将来性があります。
Simone

気にせずに、「メール交換機能があります」と定義しますか?MXレコードが存在しない場合、SMTPはRFC2821 / 5321に従って、A / AAAAレコードにフォールバックする必要があります。MXレコードが存在する場合でも、メールエクスチェンジャーが存在することを示していない可能性があります(RFC7505)。本当に、唯一の方法は、行動を
促すフレーズの

2

一般的に言えば、メールアドレスを検証するための正規表現は簡単に思いつくものではありません。この記事の執筆時点では、電子メールアドレスの構文は比較的多数の標準に従う必要があり、正規表現内にそれらすべてを実装することは実際には不可能です!

EmailVerify.NETを試してみることを強くお勧めします。これは、すべての電子メールアドレスを検証できる成熟した.NETライブラリです。現在ののIETF標準(RFC 1123、RFC 2821、RFC 2822、RFC 3696、RFC 4291、RFC 5321およびRFC 5322)、関連するDNSレコードをテストし、ターゲットのメールボックスがメッセージを受け入れることができるかどうかを確認し、特定のアドレスが使い捨てかどうかを確認することもできます。

免責事項:私はこのコンポーネントの主要開発者です。


印象的!「次に、指定された電子メールアドレスを担当するメールエクスチェンジャーに接続を試み、そのサーバーと偽のSMTPダイアログを開始し、実際のメールサーバーをエミュレートします。これにより、サーバーがそのアドレスの電子メールを処理できるようになります。多くのSMTPサーバーは実際にスパマーに対する保護として偽陽性の回答を返す:この問題を克服するために、EmailVerify for .NETは最終的に、異なる偽造アドレスを使用してターゲットメールエクスチェンジャーに複数回クエリを試行します。 "
Matthew Lock

ありがとう、@ MatthewLock;)
Efran Cobisi 2015年

いいですが、有料版しか表示されません。コミュニティ/オープンソース版の計画はありますか?
Ohad Schneider 2017

1
@OhadSchneiderはい:私たちは、SaaSの電子メール検証サービスであるVerifaliaを介して、電子メール検証テクノロジーの無料バージョンを提供しています。Verifaliaには、.NETを含む主要なソフトウェア開発プラットフォーム用の無料のオープンソースSDKが付属しています
Efran Cobisi 2017

2
For the simple email like goerge@xxx.com, below code is sufficient. 

 public static bool ValidateEmail(string email)
        {
            System.Text.RegularExpressions.Regex emailRegex = new System.Text.RegularExpressions.Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
            System.Text.RegularExpressions.Match emailMatch = emailRegex.Match(email);
            return emailMatch.Success;
        }

a@b.infoが有効なメールアドレスとして検証されません。
レイ・チェン

2

FluentValidationを使用している場合は、次のように簡単なものを書くことができます。

public cass User
{
    public string Email { get; set; }
}

public class UserValidator : AbstractValidator<User>
{
    public UserValidator()
    {
        RuleFor(x => x.Email).EmailAddress().WithMessage("The text entered is not a valid email address.");
    }
}

// Validates an user. 
var validationResult = new UserValidator().Validate(new User { Email = "açflkdj" });

// This will return false, since the user email is not valid.
bool userIsValid = validationResult.IsValid;

2

@Cogwheelの回答を少し変更

public static bool IsValidEmail(this string email)
{
  // skip the exception & return early if possible
  if (email.IndexOf("@") <= 0) return false;

  try
  {
    var address = new MailAddress(email);
    return address.Address == email;
  }
  catch
  {
    return false;
  }
}

これは役に立たないようです... Console.WriteLine(MailAddress("asdf@asdf.").Address);無効な "asdf @ asdf。"を出力します。
Langdon

.netには独自の有効な定義があるようです。関連ディスカッション
18年

2

ここには多くの強力な答えがあります。ただし、少し後退することをお勧めします。@Cogwheelが質問https://stackoverflow.com/a/1374644/388267に回答します。それでも、検証される電子メールアドレスの多くが無効である場合、一括検証シナリオではコストがかかる可能性があります。彼のtry-catchブロックに入る前に、少しロジックを使用することをお勧めします。次のコードはRegExを使用して記述できることは知っていますが、新しい開発者が理解するにはコストがかかる可能性があります。これは私の2ペンス相当です。

    public static bool IsEmail(this string input)
    {
        if (string.IsNullOrWhiteSpace(input)) return false;

        // MUST CONTAIN ONE AND ONLY ONE @
        var atCount = input.Count(c => c == '@');
        if (atCount != 1) return false;

        // MUST CONTAIN PERIOD
        if (!input.Contains(".")) return false;

        // @ MUST OCCUR BEFORE LAST PERIOD
        var indexOfAt = input.IndexOf("@", StringComparison.Ordinal);
        var lastIndexOfPeriod = input.LastIndexOf(".", StringComparison.Ordinal);
        var atBeforeLastPeriod = lastIndexOfPeriod > indexOfAt;
        if (!atBeforeLastPeriod) return false;

        // CODE FROM COGWHEEL'S ANSWER: https://stackoverflow.com/a/1374644/388267 
        try
        {
            var addr = new System.Net.Mail.MailAddress(input);
            return addr.Address == input;
        }
        catch
        {
            return false;
        }
    }

2

@Cogwheelから最も投票された回答が最良の回答ですが、trim()文字列メソッドを実装して、文字列の最初から最後まですべてのユーザーの空白をトリミングしようとしました。完全な例については、以下のコードを確認してください。

bool IsValidEmail(string email)
{
    try
    {
        email = email.Trim();
        var addr = new System.Net.Mail.MailAddress(email);
        return addr.Address == email;
    }
    catch
    {
        return false;
    }
}

これのリスクは、ソースとは異なる電子メールアドレスを検証しているため、指定された電子メールアドレスの(この場合は)トリミングされていないバージョンにメールを送信できると思わせることです。より適切な方法はSanitizeEmail(string email)、別のメソッドを作成し、そのメソッドの結果を使用して検証してメールを送信することです。
Marco de Zeeuw、

1
private static bool IsValidEmail(string emailAddress)
{
    const string validEmailPattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|"
                                     + @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)"
                                     + @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";

    return new Regex(validEmailPattern, RegexOptions.IgnoreCase).IsMatch(emailAddress);
}

1

メールの文字列が正しい形式か間違った形式かを次の方法で確認しますSystem.Text.RegularExpressions

    public static bool IsValidEmailId(string InputEmail)
    {
        Regex regex = new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
        Match match = regex.Match(InputEmail);
        if (match.Success)
            return true;
        else
            return false;
    }

    protected void Email_TextChanged(object sender, EventArgs e)
    {
        String UserEmail = Email.Text;
        if (IsValidEmailId(UserEmail))
        {
            Label4.Text = "This email is correct formate";
        }
        else
        {
            Label4.Text = "This email isn't correct formate";
        }
    }

1

/「新しいEmailAddressAttribute();」の作成に使用された内部正規表現を使用する .Net4.5のコンポーネント>>> System.ComponentModel.DataAnnotationsを使用。//メールアドレスを検証するには......テスト済みで機能しています。

public bool IsEmail(string email)
{
    if (String.IsNullOrEmpty(email))
    {   return false;  }
    try
    {
        Regex _regex = new Regex("^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])" +
                "+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)" +
                "((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|" +
                "[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\u" +
                "FDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|" +
                "(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|" +
                "[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900" +
                "-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF" +
                "EF])))\\.?$", RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture | RegexOptions.Compiled);
        return _regex.IsMatch(email);
    }
    catch (RegexMatchTimeoutException)
    {
        return false;
    }
}

また、これを使用できます:

http://msdn.microsoft.com/en-us/library/01escwtf(v=vs.110).aspx


このメールには「true」と記載されており、「fulya_42_@hotmail.coö」とマンドリルAPIでエラーをスローします
MonsterMMORPG

1
最初に、メールはexample@example.coまたはexample@example.com ....で有効です。メールには、最後の文字「ö」を除くすべての有効な文字列と基準が含まれており、簡単な条件を追加して、そのような文字を検証できます。2つ目は、そのマンドリルAPIエラーについて確信が持てない場合です。他の環境やAPIでこの検証を使用したbcosの使用方法を確認することをお勧めします。
Aina Ademola C

1

私はポイソン1の答えを次のように簡潔にしました:

public static bool IsValidEmailAddress(string candidateEmailAddr)
{
    string regexExpresion = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
    return (Regex.IsMatch(candidateEmailAddr, regexExpresion)) && 
           (Regex.Replace(candidateEmailAddr, regexExpresion, string.Empty).Length == 0);
}

1

emailidを識別する簡単な方法が有効かどうか。

public static bool EmailIsValid(string email)
{
        return Regex.IsMatch(email, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
}

1

jsではなくC#の正規表現に文化の問題があります。したがって、メールチェックにはUSモードで正規表現を使用する必要があります。ECMAScriptモードを使用しない場合、言語の特殊文字は正規表現を使用してAZに含まれます。

Regex.IsMatch(email, @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9_\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", RegexOptions.ECMAScript)

1

カンマ、コメント、Unicode文字、IP(v4)ドメインアドレスの検証に成功したため、私はこの正規表現を使用することになりました。

有効なアドレスは次のとおりです。

"" @ example.org

(コメント)test@example.org

тест@example.org

ტესტი@ example.org

test @ [192.168.1.1]

 public const string REGEX_EMAIL = @"^(((\([\w!#$%&'*+\/=?^_`{|}~-]*\))?[^<>()[\]\\.,;:\s@\""]+(\.[^<>()[\]\\.,;:\s@\""]+)*)|(\"".+\""))(\([\w!#$%&'*+\/=?^_`{|}~-]*\))?@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$";

1

Regexを使用しない単純なもの(読みやすさの点で気に入らない):

bool IsValidEmail(string email)
{
    string emailTrimed = email.Trim();

    if (!string.IsNullOrEmpty(emailTrimed))
    {
        bool hasWhitespace = emailTrimed.Contains(" ");

        int indexOfAtSign = emailTrimed.LastIndexOf('@');

        if (indexOfAtSign > 0 && !hasWhitespace)
        {
            string afterAtSign = emailTrimed.Substring(indexOfAtSign + 1);

            int indexOfDotAfterAtSign = afterAtSign.LastIndexOf('.');

            if (indexOfDotAfterAtSign > 0 && afterAtSign.Substring(indexOfDotAfterAtSign).Length > 1)
                return true;
        }
    }

    return false;
}

例:

  • IsValidEmail("@b.com") // false
  • IsValidEmail("a@.com") // false
  • IsValidEmail("a@bcom") // false
  • IsValidEmail("a.b@com") // false
  • IsValidEmail("a@b.") // false
  • IsValidEmail("a b@c.com") // false
  • IsValidEmail("a@b c.com") // false
  • IsValidEmail("a@b.com") // true
  • IsValidEmail("a@b.c.com") // true
  • IsValidEmail("a+b@c.com") // true
  • IsValidEmail("a@123.45.67.89") // true

シンプルであることを意図しているため、スペースが含まれているブラケットドメインのメール(通常は許可)、IPv6アドレスのメールなどのまれなケースには対応していません。


1

あなたがチェックするあなたの質問への答えはここにあります。

using System;
using System.Globalization;
using System.Text.RegularExpressions;

public class RegexUtilities
{    
   public bool IsValidEmail(string strIn)
   {
       if (String.IsNullOrEmpty(strIn))
       {
          return false;

       }

       // Use IdnMapping class to convert Unicode domain names.

       try 
       {
          strIn = Regex.Replace(strIn, @"(@)(.+)$", this.DomainMapper, RegexOptions.None, TimeSpan.FromMilliseconds(200));

       }
       catch (RegexMatchTimeoutException) 
       {
           return false;

       }

       if (invalid)
       {
           return false;

       }

       // Return true if strIn is in valid e-mail format.    

       try 
       {
          return Regex.IsMatch(strIn, @"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|       [-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$", RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));

       }
       catch (RegexMatchTimeoutException) 
       {
          return false;

       }

   }


   private string DomainMapper(Match match)
   {
      // IdnMapping class with default property values.

      IdnMapping idn = new IdnMapping();

      string domainName = match.Groups[2].Value;

      try 
      {
         domainName = idn.GetAscii(domainName);

      }
      catch (ArgumentException) 
      {
         invalid = true;

      }

      return match.Groups[1].Value + domainName;

   }

}

1

@Cogwheelの回答に基づいて、SSISおよび「スクリプトコンポーネント」で機能する修正されたソリューションを共有したいと思います。

  1. 「スクリプトコンポーネント」をデータフロー接続に配置して開きます。
  2. 「入力列」セクションで、メールアドレスを含むフィールドを「ReadWrite」に設定します(例では「fieldName」)。
  3. 「スクリプト」セクションに戻り、「スクリプトの編集」をクリックします。次に、コードが開いた後に待機する必要があります。
  4. このコードを適切なメソッドに配置します。

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        string email = Row.fieldName;
    
        try
        {
            System.Net.Mail.MailAddress addr = new System.Net.Mail.MailAddress(email);
            Row.fieldName= addr.Address.ToString();
        }
        catch
        {
            Row.fieldName = "WRONGADDRESS";
        }
    }

次に、条件付き分割を使用して、すべての無効なレコードまたは必要な処理をすべて除外できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.