Как проверить адрес электронной почты?

Какая хорошая методика для проверки адреса электронной почты (например, из поля ввода пользователя) в Android? Org.apache.commons.validator.routines.EmailValidator , похоже, не доступен. Существуют ли другие библиотеки, которые уже включены в Android, или мне придется использовать RegExp?

Solutions Collecting From Web of "Как проверить адрес электронной почты?"

Не используйте reg-ex.

По всей видимости, это reg-ex, который правильно проверяет большинство адресов электронной почты, которые соответствуют RFC 2822 (и все равно будет терпеть неудачу на таких вещах, как «user@gmail.com.nospam», как и org.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])+)\]) 

Возможно, самый простой способ проверить электронную почту, чтобы просто отправить электронное письмо с подтверждением на указанный адрес, и он отскакивает, тогда он недействителен.

Если вы хотите выполнить некоторые базовые проверки, вы можете просто проверить, что он находится в форме *@*

Если у вас есть определенная проверка бизнес-логики, вы можете выполнить это с использованием регулярного выражения, например, должно быть учетной записью gmail.com или чем-то еще.

Другой вариант – встроенные шаблоны, начинающиеся с уровня 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:

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

Следующий шаблон используется в почте 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}" + ")+" ); . 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(); } 

Поскольку 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}" + ")+" ); . 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.

У нас есть простой способ сопоставления шаблонов электронной почты

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

Это предложения для Android Studio:

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

Use 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(); } 

Вы можете использовать регулярное выражение для этого. Что-то вроде следующего.

 Pattern pattern = Pattern.compile(".+@.+\\.[az]+"); String email = "xyz@xyzdomain.com"; Matcher matcher = pattern.matcher(email); boolean matchFound = matcher.matches(); 

Примечание. Проверьте приведенное выше регулярное выражение, не используйте его как есть.

Используйте простой код для проверки подлинности электронной почты

 public final 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(); } 

Вызовите этот метод, в котором вы хотите проверить идентификатор электронной почты.

 public static boolean isValid(String email) { String expression = "^[\\w\\.-]+@([\\w\\-]+\\.)+[AZ]{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; } } 

Для андроида для проверки электронной почты вы можете получить некоторый шаблон InBuilt. Но он поддерживает только API уровня 8 и выше .

Вот код для использования этого шаблона, чтобы проверить проверку электронной почты.

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

Убедитесь, что после выполнения этого метода вы должны убедиться, что если этот метод возвращает true, вы можете сохранить электронную почту, и если этот метод вернет false, тогда отобразите сообщение о том, что сообщение «Invalid».

Надеюсь, ты получишь свой ответ, спасибо.

Подтвердите свой формат адреса электронной почты. 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\\-]+\\.)+[AZ]{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; } 

Попробуйте этот код .. Он действительно работает ..

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

Обратите внимание, что большинство регулярных выражений недействительны для международных доменных имен (IDN) и новых доменов верхнего уровня, таких как .mobi или .info (если вы проверяете коды стран или .org, .com, .gov и т. Д.).

Действительная проверка должна отделить локальную часть (до знака at) и часть домена. Вы также должны учитывать максимальную длину локальной части и домена (в сумме 255 символов, включая знак at).

Лучшим подходом является преобразование адреса в формате, совместимом с IDN (при необходимости), проверка локальной части (RFC), проверка длины адреса и проверка доступности домена (поиск DNS MX) или просто отправка электронной почты ,

Попробуйте этот простой метод, который не может принять адрес электронной почты, начинающийся с цифр:

 boolean checkEmailCorrect(String Email) { if(signupEmail.length() == 0) { return false; } String pttn = "^\\D.+@.+\\.[az]+"; Pattern p = Pattern.compile(pttn); Matcher m = p.matcher(Email); if(m.matches()) { return true; } return false; } 

Класс Linkify имеет довольно полезные вспомогательные методы, которые могут иметь значение, включая регулярные выражения, предназначенные для подбора телефонных номеров и адресов электронной почты и т. Д.

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

Я использовал follwing code.This работает grate.I надеюсь, что это поможет вам.

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

И используйте метод follwing. Это возвращает true, если адрес электронной почты действителен.

  private boolean validMail(String yourEmailString) { Pattern emailPattern = Pattern.compile(".+@.+\\.[az]+"); 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

Вы можете downlaod это отсюда: 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 не поддерживает ни … Но этот пост показывает обходное решение .

Я знаю, что слишком поздно, но я дам свой ответ.

Я использовал эту строку кода для проверки введенного формата Email :

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

Проблема в том, что он будет проверять только FORMAT не SPELLING .

Когда я вошел @gmal.com пропал без вести, а @yaho.com пропустил еще один. Он возвращает true . Так как он удовлетворяет условию для Email Format .

То, что я сделал, я использовал вышеприведенный код. Так как это даст / вернет true если пользователь вводит @gmail.com ТОЛЬКО , без текста в начале.

ФОРМАТ-ПРОВЕРКА

проверить

Если я напишу это письмо, это даст мне: true но орфография неверна. В моей textInputLayout error

неправильное написание

EMAIL ADDRESS @yahoo.com , @gmail.com , @outlook.com ПРОВЕРКА

  //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); } 

RETURN: false

ложный

noSpecial

RETURN: 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"/> 

Примечание. Я попытался получить value из EditText и использовать split на нем и даже StringTokenizer . Оба возвращают мне false .

Если вы используете API 8 или выше, вы можете использовать легкодоступный класс Patterns для проверки электронной почты. Образец кода:

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

Если вы даже поддерживаете уровень API менее 8, вы можете просто скопировать файл Patterns.java в свой проект и ссылаться на него. Вы можете получить исходный код для Patterns.java из этой ссылки

Самый простой способ проверки электронной почты.

 EditText TF; public Button checkButton; public 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}" + ")+" ); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); TF=(EditText) findViewById(R.id.TF); checkButton=(Button) findViewById(R.id.checkButton); checkButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { String email=TF.getText().toString(); if(checkEmail(email)) Toast.makeText(getApplicationContext(),"Valid Email Addresss", Toast.LENGTH_SHORT).show(); else Toast.makeText(getApplicationContext(),"Invalid Email Addresss", Toast.LENGTH_SHORT).show(); } }); } private boolean checkEmail(String email) { return EMAIL_ADDRESS_PATTERN.matcher(email).matches(); }}