電子メールアドレスを検証するにはどうすればよいですか?


320

Androidで(たとえば、ユーザー入力フィールドから)電子メールアドレスを検証するための良いテクニックは何ですか?org.apache.commons.validator.routines.EmailValidatorが利用できないようです。Androidにすでに含まれている、これを行う他のライブラリはありますか、それともRegExpを使用する必要がありますか?


、この1を参照してくださいが、それはあなたを助けることがあります。 stackoverflow.com/questions/12947620/...
Hiren Patel氏

1
@ user2757064よくこの質問はあなたがリンクした他の質問を助けるはずです。その質問は、この3年後に行われました。:)
スーフィアン2014

回答:


48

正規表現は使用しないでください。

どうやら以下は、RFC 2822に準拠するほとんどの電子メールアドレスを正しく検証する正規表現です(org.apache.commons.validatorと同様に、 "user@gmail.com.nospam"のようなものでも失敗します)。 routines.EmailValidator)

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

おそらく、提供されたアドレスに確認の電子メールを送信するために電子メールを検証する最も簡単な方法であり、それが返送されると無効になります。

基本的なチェックを実行したい場合は、それが次の形式であることを確認するだけです *@*

ビジネスロジック固有の検証がある場合は、正規表現を使用してそれを実行できます。たとえば、gmail.comアカウントか何かである必要があります。


5
私はこの答えが約2歳であることを知っていますが、regexr.comを使用してこの正規表現を試すと、が検証されuser@gmail.com.nospam、.museumのようなより長いTLD も検証されます。何か不足していますか?有効な電子メールアドレスの検証に失敗してユーザーをブロックしたくないのですが、これは私が考えられるすべてのことで機能しているようです。
Bob Vork、2011年

@Bobはサーバー上のメールアドレスを検証します。Foursquareアプリで同じことを確認してください
Harsha MV

107
この回答を「正規表現を使用しない」から始めて、正規表現の提供に進む理由を少し混乱しています。
howettl 2013

7
読み続けてください。正規表現を使用しないより良い解決策を以下に示します。
loeschg 2014年

1
@Glen。これはAndroidのパターンにも当てはまりますかEMAIL_ADDRESSdeveloper.android.com/reference/android/util/...
zulkarnainシャー

1036

別のオプションは、APIレベル8で始まる組み込みパターンです。

public final static boolean isValidEmail(CharSequence target) {
  if (TextUtils.isEmpty(target)) {
    return false;
  } else {
    return android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
  }
}

パターン表示可能なソース

または

@AdamvandenHovenからの1行のソリューション:

public final static boolean isValidEmail(CharSequence target) {
  return !TextUtils.isEmpty(target) && android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}

30
+1ですが、次のように置き換えること(target == null)をおTextUtils.isEmpty(target)
勧め

36
このような回答が、投票数の多い回答ではなく、受け入れられた回答が上に表示されるのを嫌う理由です。
Jeshurun 2014年

11
これを単純に1行に結合することも(読みやすさの点で)意味がありませんか?return!
Adam van den Hoven 2014

1
@ Houcine、trueですが、上記のメソッドはブール値を返すため、falseの場合、その情報はありません。とにかく、関数内からUIをトーストまたは更新できます(UIスレッドで実行する必要があります)。私のように、プログラムで取得した電子メールをユーザーの操作なしで検証している場合は、「== null」をそのまま使用して、ほとんどの場合、数クロックサイクルを節約できます。
AJ

2
注意してください。このマッチャーはemail@111.222.333.44444有効なメールとして受け入れます
Joaquin Iurchuk

101

次のパターンはK-9メールで使用されます。

public static final Pattern EMAIL_ADDRESS_PATTERN = Pattern.compile(
          "[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}" +
          "\\@" +
          "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}" +
          "(" +
          "\\." +
          "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" +
          ")+"
      );

関数を使用できます

private boolean checkEmail(String email) {
        return EMAIL_ADDRESS_PATTERN.matcher(email).matches();
}

74
なぜ使用しないのandroid.util.Patterns.EMAIL_ADDRESSですか?
Sergey Metlov

9
APIレベル8からのみ存在するため
Andrei Buneyeu 2012年

これは私に多くの感謝と簡単な答えに対する+1を助けました.. :)
Deepthi

参考までに:文字クラスの内部では、メタ文字がはるかに少なく、ハイフンは境界線に置かれたときに自動的にエスケープされます。最初のクラスを簡略化し[a-zA-Z0-9+._%-]、他のクラスを簡略化できます[a-zA-Z0-9-]
Robin

これは、電子メールの構文が電子メールと同じである場合にのみtrue を返します。削除しようとするとi@gmail.comtrueが返されます。`@yaho.comでも同じです。
RoCk RoCk 16

70

API 8(android 2.2)以降のパターンがあります:android.util.Patterns.EMAIL_ADDRESS http://developer.android.com/reference/android/util/Patterns.html

したがって、これを使用してyourEmailStringを検証できます。

private boolean isValidEmail(String email) {
    Pattern pattern = Patterns.EMAIL_ADDRESS;
    return pattern.matcher(email).matches();
}

電子メールが有効な場合はtrueを返します

UPD:このパターンのソースコードは次のとおりです。

public static final Pattern EMAIL_ADDRESS
    = Pattern.compile(
        "[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}" +
        "\\@" +
        "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}" +
        "(" +
            "\\." +
            "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" +
        ")+"
    );

参照:http : //grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/util/Patterns.java

したがって、API <8との互換性のために自分でビルドできます。


45

シンプルなメールパターンマッチャーができました

 private static boolean isValidEmail(String email) {
        return !TextUtils.isEmpty(email) && android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
    }

19

メールの検証に簡単な1行のコードを使用する

public static boolean isValidEmail(CharSequence target) {
    return !TextUtils.isEmpty(target) && android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}

のように使用して...

if (!isValidEmail(yourEdittext.getText().toString()) {
    Toast.makeText(context, "your email is not valid", 2000).show();
}

15

これはAndroid Studioの提案です。

public static boolean isEmailValid(String email) {
    return !(email == null || TextUtils.isEmpty(email)) && android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
}

1
email == nullTextUtilsが内部でチェックするため、nullチェックは不要です
Volodymyr

あなたが正しい@VolodymyrKhodonovychですが、nullチェックはOR状態で行われます。これを行わないと、matcher()メソッドにメールを渡すときにNPEが発生する可能性があります。
マッテオ

11

これには正規表現を使用できます。次のようなもの。

Pattern pattern = Pattern.compile(".+@.+\\.[a-z]+");

String email = "xyz@xyzdomain.com";

Matcher matcher = pattern.matcher(email);

boolean matchFound = matcher.matches();

注:上記の正規表現を確認してください。そのまま使用しないでください。


3
これは次の有効な電子メールアドレスで失敗します:"Example Guy" <guy@example.com>。あなたは一方で技術的に正規表現で電子メールを検証することができ、それがそうするように少し不条理です。
Cory Petosky、2011

1
それはメールアドレスだけではありません。
Brill Pappin

11

以下のようにandroid:inputType = "textEmailAddress"を使用します。

       <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="email"
        android:inputType="textEmailAddress"
        android:id="@+id/email"
        />

そして:

       boolean isEmailValid(CharSequence email) {
        return android.util.Patterns.EMAIL_ADDRESS.matcher(email)
                .matches();
      }

11

次のようなKotlin拡張機能を作成できます。

fun String.isValidEmail() =
        this.isNotEmpty() && android.util.Patterns.EMAIL_ADDRESS.matcher(this).matches()

そして、次のように呼び出します。

email.isValidEmail()

「パターン」とは誰ですか?
Jemshit Iskenderov

android.util.Patterns
Danilo Lemes

9

ここに有益なPatternsパッケージandroid.util内のクラスがあります。以下は、メールや他の多くのものを検証するために常に使用する方法です

private boolean isEmailValid(String email) {
    return !TextUtils.isEmpty(email) && Patterns.EMAIL_ADDRESS.matcher(email).matches();
}

5

電子メールIDを検証する場所でこのメソッドを呼び出します。

public static boolean isValid(String email)
{
   String expression = "^[\\w\\.-]+@([\\w\\-]+\\.)+[A-Z]{2,4}$";
   CharSequence inputStr = email;
   Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);
   Matcher matcher = pattern.matcher(inputStr);
   if (matcher.matches()) 
   {
      return true;
   }
   else{
   return false;
   }
}

5

メール検証の場合、androidはInBuiltパターンを提供しますが、APIレベル8以上のみをサポートします

以下は、そのパターンを使用して電子メールの検証をチェックするためのコードです。

  private boolean Email_Validate(String email) 
  {
    return android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
  }

このメソッドを実行した後、このメソッドがtrueを返す場合はメールの保存を許可し、このメソッドがfalseを返す場合は必ず確認してください。をメールが「無効」であるというメッセージを表示。

あなたがあなたの答えを得ることを望みます、ありがとう。


4

メールアドレスを「検証」しないように強くお勧めしますか?正当な理由もなく、多くの作業に取り掛かります。

入力したものが自分のコードを壊さないことを確認してください。たとえば、例外を引き起こす可能性のあるスペースや不正な文字がないことを確認してください。

それ以外の場合は、最小限のリターンで多くの作業が発生します...


3
サブスクリプションと支払いを処理する場合、これはほとんど役に立ちません。誰かがパスワードを忘れた場合は、パスワードを安全にリセットして、支払い済みのサービスを引き続き使用できるようにする必要があります。ですから、彼らが自分のために有効なメールアドレスを入力していることを確認するのが最善の場合もあります。
Dean Wild

1
私が言ったことを明確にするために-誰かが偽/間違ったアドレスを入力しようとしている場合-検証の量はそれらを停止しません。スペースや '@'などの愚かな間違いをチェックすることは問題ありません-他のチェック「収益の減少」に十分に...

3
uは未配信レポートを受信するかどうかの偽の電子メールを識別するための唯一の方法は...その電子メールIDとチェックに電子メールを送信経由で
スリーカンスKarumanaghat

ジョン、多くのユーザーは偽/間違ったアドレスを入力するつもりはありませんが、誤って誤って入力する可能性があります。したがって、単純なチェックを実行することは非常に有用であり、mindriotの回答に示されているように、多くの作業ではありません。私の経験から、ほとんどの人は自分のメールアドレスを正しく入力し、ほとんどの場合、いくつかの無効なメールは無実のタイプミスに分類されているようです。
ban-geoengineering 2015年

ユーザーのメールが機能することが重要な場合は、確認メールを送信します。他のすべてはナンセンスです。
驚くべきJan

4

メールアドレスの形式を確認します。Ex-virag@gmail.com

public boolean emailValidator(String email) 
{
    Pattern pattern;
    Matcher matcher;
    final String EMAIL_PATTERN = "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
    pattern = Pattern.compile(EMAIL_PATTERN);
    matcher = pattern.matcher(email);
    return matcher.matches();
}

3
    public boolean isValidEmail(String email)
{
    boolean isValidEmail = false;

    String emailExpression = "^[\\w\\.-]+@([\\w\\-]+\\.)+[A-Z]{2,4}$";
    CharSequence inputStr = email;

    Pattern pattern = Pattern.compile(emailExpression, Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(inputStr);
    if (matcher.matches())
    {
        isValidEmail = true;
    }
    return isValidEmail;
}

2

API 8以降を使用している場合は、すぐに利用できるPatternsクラスを使用してメールを検証できます。サンプルコード:

public final static boolean isValidEmail(CharSequence target) {
    if (target == null) 
        return false;

    return android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}

偶然にも、8未満のAPIレベルをサポートしている場合は、Patterns.javaファイルをプロジェクトにコピーして参照するだけです。このリンクPatterns.javaからソースコードを取得できます


2

ここは android.util.Patterns.EMAIL_ADDRESS

[a-zA-Z0-9 + ._ \%-+] {1,256} \ @ [a-zA-Z0-9] [a-zA-Z0-9-] {0,64}(。[a- zA-Z0-9] [a-zA-Z0-9-] {0,25})+

String それに一致します

Start by 1->256 character in (a-z, A-Z, 0-9, +, ., _, %, - , +)  
then 1 '@' character  
then 1 character in (a-z, A-Z, 0-9)  
then 0->64 character in (a-z, A-Z, 0-9, -)  
then **ONE OR MORE** 
         1 '.' character   
    then 1 character in (a-z, A-Z, 0-9)   
    then 0->25 character in (a-z, A-Z, 0-9, -)

特別な試合のメールの例

a@b.c
a+@b-.c
a@b.c.d.e.f.g.h

ケースに合わせてこのパターンを変更してから、

fun isValidEmail(email: String): Boolean {
    return Patterns.EMAIL_ADDRESS.matcher(email).matches()
}

1

数字で始まるメールアドレスを受け入れることができない次の簡単な方法を試してください。

boolean checkEmailCorrect(String Email) {
    if(signupEmail.length() == 0) {
        return false;
    }

    String pttn = "^\\D.+@.+\\.[a-z]+";
    Pattern p = Pattern.compile(pttn);
    Matcher m = p.matcher(Email);

    if(m.matches()) {
        return true;
    }

    return false;
}

1

このコードを試してください。実際に機能します。

            if (!email
                    .matches("^[\\w-_\\.+]*[\\w-_\\.]\\@([\\w]+\\.)+[\\w]+[\\w]$"))
            {
                Toast.makeText(getApplicationContext(), "Email is invalid",
                        Toast.LENGTH_LONG).show();
                return;
            }

1

以下は私が使用しました。ただし、通常のメールより余分な文字が含まれていますが、これは私にとって必須の要件でした。

public boolean isValidEmail(String inputString) {
    String  s ="^((?!.*?\.\.)[A-Za-z0-9\.\!\#\$\%\&\'*\+\-\/\=\?\^_`\{\|\}\~]+@[A-Za-z0-9]+[A-Za-z0-9\-\.]+\.[A-Za-z0-9\-\.]+[A-Za-z0-9]+)$";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(inputString);
    return matcher.matches();
}

この質問の回答:- 指定されたポイントで電子メールアドレスを検証するための要件

説明-

  1. (?!。*?..)連続する2つのドットを否定する「負のルックヘッド」。
  2. [A-Za-z0-9。!#\ $ \%\&\ '* +-/ \ = \?\ ^ _ `{\ |} \〜] +少なくとも1文字が定義されています。(「\」はエスケープに使用されます)。
  3. @「@」が1つある場合があります。
  4. [A-Za-z0-9] +の場合、少なくとも1文字が定義されます。
  5. [A-Za-z0-9-。] *ゼロ、または定義された文字の繰り返し。
  6. [A-Za-z0-9] +ドットの後に少なくとも1文字。

1

ここで重要なのは、メールアドレスを完全に検証することです。構文が正しいかどうかを確認するだけでなく、電子メールアドレスが本物かどうかを確認する必要があります。

2つの明らかな理由:実際のユーザーはメールアドレスを誤って入力することが多く一部のユーザーは偽のメールアドレスを入力する場合があります。したがって、構文チェックと存在チェックを行う必要があります。

これをAndroidで見つけた最善の方法は、無料のCloudmersive Validation API使用することです。

コードは次のようになります。

ApiClient defaultClient = Configuration.getDefaultApiClient();

// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");

EmailApi apiInstance = new EmailApi();
String email = "email_example"; // String | Email address to validate, e.g. \"support@cloudmersive.com\". The input is a string so be sure to enclose it in double-quotes.
try {
    FullEmailValidationResponse result = apiInstance.emailFullValidation(email);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling EmailApi#emailFullValidation");
    e.printStackTrace();
}

私はすべてのアプリでこれを使用していますが、UXでメールアドレスを検証できるので素晴らしいですを入力時にです。


1

拡張関数を使用した最も単純なKotlinソリューション:

fun String.isEmailValid() =
            Pattern.compile(
                    "[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}" +
                            "\\@" +
                            "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}" +
                            "(" +
                            "\\." +
                            "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" +
                            ")+"
            ).matcher(this).matches()

そして、あなたはこのように検証することができます:

"testemail6589@gmail.com".isEmailValid()

0

ほとんどの正規表現は、国際ドメイン名(IDN)および.mobiや.infoなどの新しいトップレベルドメイン(国コードや.org、.com、.govなどを確認した場合)では無効です。

有効なチェックでは、ローカル部分(アットマークの前)とドメイン部分を分離する必要があります。ローカル部分とドメインの最大長(アットマークを含む合計255文字)も考慮する必要があります。

最善の方法は、アドレスをIDN互換形式に変換し(必要な場合)、ローカルパーツ(RFC)を検証し、アドレスの長さを確認し、ドメインの可用性を確認する(DNS MXルックアップ)か、単にメールを送信することです。 。



0

私は次のコードを使用しました。これは動作します。これが役立つことを願っています。

if (validMail(yourEmailString)){
   //do your stuf
 }else{
 //email is not valid.
}

次のメソッドを使用します。これは、電子メールが有効な場合にtrueを返します。

    private boolean validMail(String yourEmailString) {
    Pattern emailPattern = Pattern.compile(".+@.+\\.[a-z]+");
    Matcher emailMatcher = emailPattern.matcher(emailstring);
    return emailMatcher.matches();
}

0

電子メールはあなたの電子メールです。

public boolean validateEmail(String email) {

    Pattern pattern;
    Matcher matcher;
    String EMAIL_PATTERN = "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
    pattern = Pattern.compile(EMAIL_PATTERN);
    matcher = pattern.matcher(email);
    return matcher.matches();

    }

0

正規表現愛好家にとって、私が今までに見つけた最高の(たとえばRFC 822と一致する)電子メールのパターンは次のとおりです(PHPが提供するフィルターの前)。これをJavaに変換するのは簡単だと思います-API <8で遊ぶ人のために:

private static function email_regex_pattern() {
// Source:  http://www.iamcal.com/publish/articles/php/parsing_email
$qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
$dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
$atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c'.
    '\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
$quoted_pair = '\\x5c[\\x00-\\x7f]';
$domain_literal = "\\x5b($dtext|$quoted_pair)*\\x5d";
$quoted_string = "\\x22($qtext|$quoted_pair)*\\x22";
$domain_ref = $atom;
$sub_domain = "($domain_ref|$domain_literal)";
$word = "($atom|$quoted_string)";
$domain = "$sub_domain(\\x2e$sub_domain)*";
$local_part = "$word(\\x2e$word)*";
$pattern = "!^$local_part\\x40$domain$!";
return $pattern ;
}

0

oval.jarファイルを使用すると、Androidであらゆるタイプの検証を非常に簡単に行うことができます。OValは、あらゆる種類のJavaオブジェクト用の実用的で拡張可能な汎用検証フレームワークです。

このリンクに従ってください:http : //oval.sourceforge.net/userguide.html

こちらからダウンロードできます:http ://oval.sourceforge.net/userguide.html#download

変数にタグを設定して検証を使用できます

public class Something{

    @NotEmpty  //not empty validation
    @Email     //email validation
    @SerializedName("emailAddress")
    private String emailAddress;
}

   private void checkValidation() {
        Something forgotpass.setEmailAddress(LoginActivity.this.dialog_email.getText().toString());
        Validator validator = new Validator();
        //collect the constraint violations
        List<ConstraintViolation> violations = validator.validate(forgotpass);
        if(violations.size()>0){
            for (ConstraintViolation cv : violations){
                if(cv.getMessage().contains("emailAddress")){
                    dialog_email.setError(ValidationMessage.formattedError(cv.getMessage(), forgotpass));
                }
            }
        }
}

0

あなたも使うことができます

InternetAddress emailAddr = new InternetAddress(email);
emailAddr.validate();

電子メールが有効でない場合、AddressExceptionがスローされます

残念ながら、Android jndi-dnsをサポートしていませんが、より強力な電子メール検証のアイデアを提供するために、それを使用して電子メールドメインを検証できます。たぶん、Androidの達人が助けになり、同様の代替案があるかどうかを示すことができます...「通常の」Java を使用した実装例はこちらから入手できます

編集

javax.mailはどちらもサポートしていないことに気づきました...しかし、この投稿は回避策を示しています。

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