Как мне подтвердить адрес электронной почты? - PullRequest
305 голосов
/ 30 ноября 2009

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

Ответы [ 31 ]

1 голос
/ 27 июля 2017

Если вы используете 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 из по этой ссылке

0 голосов
/ 09 июля 2013

Вы можете очень легко выполнить любой тип проверки в Android с помощью файла oval.jar. 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 голосов
/ 11 октября 2011

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

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

0 голосов
/ 14 марта 2012

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

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();
}}
0 голосов
/ 27 апреля 2018

Следующие были использованы мной. Однако он содержит больше символов, чем обычные письма, но для меня это было требованием.

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

Ответ на этот вопрос: - Требование подтверждения адреса электронной почты с заданными баллами

Explanation-

  1. (?!. *? ..) «Отрицательный взгляд», чтобы свести на нет 2 последовательные точки.
  2. [A-Za-z0-9.! # \ $ \% \ & \ '* + - / \ = \? \ ^ _ `{\ |} \ ~] + По крайней мере один символы определены. («\» используется для выхода).
  3. @ Там может быть один "@".
  4. [A-Za-z0-9] + затем определен хотя бы один символ.
  5. [A-Za-z0-9 -.] * Ноль или любое повторение определенного символа.
  6. [A-Za-z0-9] + По крайней мере один символ после точки.
0 голосов
/ 14 марта 2012

Я использовал следующий код. Это работает. Надеюсь, это поможет вам.

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 голосов
/ 28 мая 2012

адрес электронной почты - ваш адрес электронной почты.

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 голосов
/ 28 февраля 2013

Для любителей регулярных выражений самый лучший (например, совместимый с RFC 822) шаблон электронной почты, который я когда-либо обнаруживал с тех пор, - следующий (до того, как PHP предоставил фильтры). Я думаю, это легко перевести на Java - для тех, кто играет с API <8: </p>

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 голосов
/ 21 июня 2010

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

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

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

0 голосов
/ 25 сентября 2016

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

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

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

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

Когда я ввел @gmal.com отсутствует i, а @yaho.com отсутствует еще o. Это возвращение true. Поскольку оно удовлетворяет условию Email Format.

То, что я сделал, я использовал код выше. Так как он даст / вернет true, если Если пользователь ввел @gmail.com ONLY , текст в начале отсутствует.

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

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

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

...