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.com
trueが返されます。`@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 == null
TextUtilsが内部でチェックするため、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はどちらもサポートしていないことに気づきました...しかし、この投稿は回避策を示しています。