Androidで(たとえば、ユーザー入力フィールドから)電子メールアドレスを検証するための良いテクニックは何ですか?org.apache.commons.validator.routines.EmailValidatorが利用できないようです。Androidにすでに含まれている、これを行う他のライブラリはありますか、それともRegExpを使用する必要がありますか?
Androidで(たとえば、ユーザー入力フィールドから)電子メールアドレスを検証するための良いテクニックは何ですか?org.apache.commons.validator.routines.EmailValidatorが利用できないようです。Androidにすでに含まれている、これを行う他のライブラリはありますか、それともRegExpを使用する必要がありますか?
回答:
正規表現は使用しないでください。
どうやら以下は、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アカウントか何かである必要があります。
user@gmail.com.nospam、.museumのようなより長いTLD も検証されます。何か不足していますか?有効な電子メールアドレスの検証に失敗してユーザーをブロックしたくないのですが、これは私が考えられるすべてのことで機能しているようです。
                    別のオプションは、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();
}(target == null)をおTextUtils.isEmpty(target)
                    email@111.222.333.44444有効なメールとして受け入れます
                    次のパターンは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();
}android.util.Patterns.EMAIL_ADDRESSですか?
                    [a-zA-Z0-9+._%-]、他のクラスを簡略化できます[a-zA-Z0-9-]
                    i、@gmail.comtrueが返されます。`@yaho.comでも同じです。
                    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との互換性のために自分でビルドできます。
メールの検証に簡単な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();
}これはAndroid Studioの提案です。
public static boolean isEmailValid(String email) {
    return !(email == null || TextUtils.isEmpty(email)) && android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
}email == nullTextUtilsが内部でチェックするため、nullチェックは不要です
                    これには正規表現を使用できます。次のようなもの。
Pattern pattern = Pattern.compile(".+@.+\\.[a-z]+");
String email = "xyz@xyzdomain.com";
Matcher matcher = pattern.matcher(email);
boolean matchFound = matcher.matches();注:上記の正規表現を確認してください。そのまま使用しないでください。
"Example Guy" <guy@example.com>。あなたは一方で技術的に正規表現で電子メールを検証することができ、それがそうするように少し不条理です。
                    以下のように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();
      }次のようなKotlin拡張機能を作成できます。
fun String.isValidEmail() =
        this.isNotEmpty() && android.util.Patterns.EMAIL_ADDRESS.matcher(this).matches()そして、次のように呼び出します。
email.isValidEmail()電子メール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;
   }
}メール検証の場合、androidはInBuiltパターンを提供しますが、APIレベル8以上のみをサポートします。
以下は、そのパターンを使用して電子メールの検証をチェックするためのコードです。
  private boolean Email_Validate(String email) 
  {
    return android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
  }このメソッドを実行した後、このメソッドがtrueを返す場合はメールの保存を許可し、このメソッドがfalseを返す場合は必ず確認してください。をメールが「無効」であるというメッセージを表示。
あなたがあなたの答えを得ることを望みます、ありがとう。
メールアドレスを「検証」しないように強くお勧めしますか?正当な理由もなく、多くの作業に取り掛かります。
入力したものが自分のコードを壊さないことを確認してください。たとえば、例外を引き起こす可能性のあるスペースや不正な文字がないことを確認してください。
それ以外の場合は、最小限のリターンで多くの作業が発生します...
メールアドレスの形式を確認します。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();
}    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;
}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からソースコードを取得できます
ここは 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()
}以下は私が使用しました。ただし、通常のメールより余分な文字が含まれていますが、これは私にとって必須の要件でした。
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();
}この質問の回答:- 指定されたポイントで電子メールアドレスを検証するための要件
説明-
ここで重要なのは、メールアドレスを完全に検証することです。構文が正しいかどうかを確認するだけでなく、電子メールアドレスが本物かどうかを確認する必要があります。
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でメールアドレスを検証できるので素晴らしいですを入力時にです。
拡張関数を使用した最も単純な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()ほとんどの正規表現は、国際ドメイン名(IDN)および.mobiや.infoなどの新しいトップレベルドメイン(国コードや.org、.com、.govなどを確認した場合)では無効です。
有効なチェックでは、ローカル部分(アットマークの前)とドメイン部分を分離する必要があります。ローカル部分とドメインの最大長(アットマークを含む合計255文字)も考慮する必要があります。
最善の方法は、アドレスをIDN互換形式に変換し(必要な場合)、ローカルパーツ(RFC)を検証し、アドレスの長さを確認し、ドメインの可用性を確認する(DNS MXルックアップ)か、単にメールを送信することです。 。
Linkifyクラスには、電話番号や電子メールアドレスなどを取得するように設計された正規表現を含む、関連性のあるかなり役立つヘルパーメソッドがいくつかあります。
http://developer.android.com/reference/android/text/util/Linkify.html
私は次のコードを使用しました。これは動作します。これが役立つことを願っています。
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();
}電子メールはあなたの電子メールです。
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();
    }正規表現愛好家にとって、私が今までに見つけた最高の(たとえば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 ;
}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));
                }
            }
        }
}あなたも使うことができます
InternetAddress emailAddr = new InternetAddress(email);
emailAddr.validate();電子メールが有効でない場合、AddressExceptionがスローされます。
残念ながら、Android は jndi-dnsをサポートしていませんが、より強力な電子メール検証のアイデアを提供するために、それを使用して電子メールドメインを検証できます。たぶん、Androidの達人が助けになり、同様の代替案があるかどうかを示すことができます...「通常の」Java を使用した実装例はこちらから入手できます。
編集
javax.mailはどちらもサポートしていないことに気づきました...しかし、この投稿は回避策を示しています。