web-dev-qa-db-ja.com

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

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

305
znq

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

どうやら、以下は RFC 2822 に準拠するほとんどの電子メールアドレスを正しく検証するreg-exです。 .Apache.commons.validator.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])+)\])

指定されたアドレスに確認Eメールを送信するだけでEメールを検証し、それがバウンスしてから無効になる可能性が最も簡単な方法です。

いくつかの基本的なチェックを実行したい場合は、単に*@*の形式であることをチェックできます。

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

47
Glen

もう1つのオプションは、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();
}
1000
mindriot

次のパターンは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();
}
98
Andrei Buneyeu

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との互換性のために自分でそれを構築することができます。

69
Luten

今は簡単なメールパターンマッチャーがあります

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

これはAndroid Studioの提案です。

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

電子メールの検証に単純な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();
}
12
Pankaj Talaviya

以下のように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
Victor Odiah

そうするために正規表現を使うことができます。次のようなもの。

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

String email = "[email protected]";

Matcher matcher = pattern.matcher(email);

boolean matchFound = matcher.matches();

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

10
Mudassir

ここで有益なパッケージAndroid.utilPatternsクラスがあります。以下は私がEメールや他の多くのものを検証するためにいつも使う方法です。

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

Eメールの検証用にAndroidはいくつかの InBuilt Pattern を提供していますが、それはAPIレベル8以上のみをサポートしています。

これは、電子メールの検証を確認するためにそのパターンを使用するためのコードです。

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

このメソッドを実行した後、このメソッドが返ってきたらtrueならメールを保存できることを確認し、このメソッドが返ったらfalseならメールは "無効です"というメッセージを表示する".

あなたがあなたの答えを得られることを願っています、ありがとう。

5
AMI CHARADAVA

あなたはこのようなKotlin拡張を書くことができます:

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

そしてそれを次のように呼びます。

email.isValidEmail()
5
Danilo Lemes

Eメール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
Sumit Sharma

メールアドレスの形式を確認してください。 [email protected]

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();
}
4
Virag Brahme
    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;
}
3
Atif Mahmood

私はあなたがEメールアドレスを「検証」しようとしないことを強く推奨することができます、あなたはただ正当な理由もなく多くの仕事に自分自身を入れるでしょう。

入力したものが自分のコードを壊さないようにしてください。例外を引き起こす可能性のあるスペースや不正な文字は使用できません。

他に何かをするだけで最小限の収益のためにあなたに多くの仕事を引き起こすでしょう...

3
user834595

これは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, -)

いくつかの特別一致メールの例

[email protected]
[email protected]
[email protected]

あなたはあなたのケースのためにこのパターンを修正してから検証することができます

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

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

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
Arman

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のソースコードは、このリンクから入手できます

1
Mahendra Liya

ここで重要なのは、あなたが完全にEメールアドレスを検証したいということです。文法上の正確さをチェックするだけではなく、メールアドレスが本物かどうかをチェックします。

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. \"[email protected]\". 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
user5377037

このコードを試してみてください。

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

Linkifyクラスには、電話番号や電子メールアドレスなどをピックアップするように設計された正規表現など、関連性があると思われる非常に便利なヘルパーメソッドがいくつかあります。

http://developer.Android.com/reference/Android/text/util/Linkify.html

0
Andrew Wyld

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

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

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

0
Thorsten

eメールはあなたのEメールです。

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
kyogs

私はそれが遅すぎることを知っています、それでも私は私の答えを与えます。

このコード行を使用して、入力されたEmailの形式を確認しました。

!TextUtils.isEmpty(getEmail) && Android.util.Patterns.EMAIL_ADDRESS.matcher(getEmail).matches();

問題は、FORMATではなくSPELLINGのみをチェックすることです。

@gmal.comiがなく、@yaho.comに別のoがありません。 trueを返します。それはEmail Formatの条件を満たしているからです。

私がやったことは、私は上記のコードを使用しました。ユーザーが@gmail.comONLYを入力した場合はtrueを返す/返すので、先頭にテキストはありません。

フォーマットチェッカー

check

このメールアドレスを入力すると、trueと表示されますが、スペルが間違っています。私のtextInputLayout error

wrongSpelling

メールアドレス@yahoo.com@gmail.com@Outlook.com CHECKER

 //CHECK EMAIL
public boolean checkEmailValidity(AppCompatEditText emailFormat){

    String getEmail = emailFormat.getText().toString();
    boolean getEnd;

    //CHECK STARTING STRING IF THE USER
    //entered @gmail.com / @yahoo.com / @Outlook.com only
    boolean getResult = !TextUtils.isEmpty(getEmail) && Android.util.Patterns.EMAIL_ADDRESS.matcher(getEmail).matches();

    //CHECK THE EMAIL EXTENSION IF IT ENDS CORRECTLY
    if (getEmail.endsWith("@gmail.com") || getEmail.endsWith("@yahoo.com") || getEmail.endsWith("@Outlook.com")){
        getEnd = true;
    }else {
        getEnd = false;
    }

    //TEST THE START AND END
    return (getResult && getEnd);
}

戻り値:false

false

noSpecial

戻り値:true

true

XML:

<Android.support.v7.widget.AppCompatEditText
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:id="@+id/editTextEmailAddress"
            Android:inputType="textEmailAddress|textWebEmailAddress"
            Android:cursorVisible="true"
            Android:focusable="true"
            Android:focusableInTouchMode="true"
            Android:singleLine="true"
            Android:maxLength="50"
            Android:theme="@style/EditTextCustom"/>

注:私はEditTextからvalueを取得しようとし、それにsplit、さらにはStringTokenizerを使用しました。両方とも私にfalseを返します。

0
RoCk Vangeance

あなたは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 ですが、より強力なEメール検証のアイデアを与えるために、Eメールドメインを検証するためにそれを使用することができます。たぶんAndroidの第一人者が同様の代替手段があるかどうかを助けて示すことができます... "通常の" Javaを使った実装例 ここで利用可能です

編集

私はただjavax.mailがどちらもサポートしていないことに気付きました...しかし、この記事は 回避策 を示しています。

0
Bob Rivers

私は以下のコードを使いました。

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
Umesh

正規表現を愛する人にとって、私が今までに見つけた中で最高の(たとえばRFC 822に準拠した)Eメールのパターンは次のとおりです(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
hornetbzz

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

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文字.
0
Vipin Sharma