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


321

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


ссылайтесь, пожалуйста, на этот, может, он вам поможет: stackoverflow.com/questions/12947620/…
Hiren Patel

1
@ user2757064 хорошо этот вопрос должен помочь другой вопрос, который вы связали. Этот вопрос был задан через 3 года после этого. :)
Суфийский

Ответы:


48

Не используйте рег-экс.

По-видимому, следующее - это 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 или что-то в этом роде.


5
Я знаю, что этому ответу около двух лет, но когда я пытаюсь использовать это регулярное выражение с помощью regexr.com, он проверяет user@gmail.com.nospam, и даже больше, например, .museum. Я что-то упускаю? Я не хочу блокировать ни одного из моих пользователей, не подтвердив их действительный адрес электронной почты, но, похоже, это работает для всего, что я могу придумать.
Боб Ворк

@Bob проверяет адрес электронной почты на сервере .. проверьте приложение foursquare, оно делает то же самое
Harsha MV

107
Я немного запутался, почему вы начинаете этот ответ с «Не использовать reg-ex», а затем переходите к предоставлению reg-ex.
Howettl

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

1
@Glen. Будет ли это справедливо для Android Pattern. EMAIL_ADDRESS ? developer.android.com/reference/android/util/...
zulkarnain шаха

1037

Другой вариант - встроенные шаблоны, начиная с уровня 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();
}

30
+1, но я предпочитаю заменить (target == null)с TextUtils.isEmpty(target):)
Хусина

36
Подобные ответы объясняют, почему мне не нравятся принятые ответы, которые отображаются сверху, а не ответы с большинством голосов
Иешурун

11
Разве не имеет смысла (с точки зрения читабельности) просто объединить это в одну строку: return! TextUtils.isEmpty (target) && android.util.Patterns.EMAIL_ADDRESS.matcher (target) .matches ();
Адам ван ден Ховен

1
@Houcine, правда, но приведенный выше метод возвращает логическое значение, поэтому у нас нет этой информации, когда оно ложно. В любом случае, пользователь может обновлять или обновлять пользовательский интерфейс внутри функции (должен выполняться в потоке пользовательского интерфейса). Для таких, как я, которые проверяют электронную почту, полученную программно и без какого-либо взаимодействия с пользователем, мы можем просто придерживаться '== null' и, возможно, сэкономить пару тактов в большинстве случаев.
AJ

2
Быть осторожен. Это совпадение принимает email@111.222.333.44444в качестве действительного
адреса

101

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

74
Почему бы не использовать android.util.Patterns.EMAIL_ADDRESS?
Сергей Метлов

9
потому что он существует только с API уровня 8
Андрей Буньеу

это помогло мне большое спасибо и +1 за простой ответ .. :)
Deepthi

К вашему сведению: внутри классов персонажей метасимволы значительно меньше, и при переносе на границе автоматически переносится дефис, вы можете упростить первый класс, [a-zA-Z0-9+._%-]а другие[a-zA-Z0-9-]
Робин

Это вернет true, только если синтаксис электронной почты совпадает с синтаксисом электронной почты, и я попытался удалить iиз @gmail.comнего, вернет true. То же самое в `@yaho.com.
RoCk RoCk

70

Начиная с 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.


45

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

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

19

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

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

15

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

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

1
проверка нуля email == nullповторяется, так как TextUtils проверяет ее внутри
Владимир

@VolodymyrKhodonovych Вы правы, но нулевая проверка выполняется в состоянии ИЛИ, если вы этого не сделаете, это может привести к NPE при передаче электронной почты методу matcher ().
Маттео

11

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

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

String email = "xyz@xyzdomain.com";

Matcher matcher = pattern.matcher(email);

boolean matchFound = matcher.matches();

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


3
Это не будет работать на следующий действительный адрес электронной почты: "Example Guy" <guy@example.com>. Хотя технически вы можете проверять электронную почту с помощью регулярных выражений , это немного абсурдно.
Кори Петоски

1
Это не просто адрес электронной почты, хотя.
Брилл Паппин

11

используйте 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();
      }


9

В Patternsпакете есть класс, android.utilкоторый здесь полезен. Ниже приведен метод, который я всегда использую для проверки электронной почты и многих других вещей.

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

5

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

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

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

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

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

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

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


4

Могу я НАСТОЯТЕЛЬНО рекомендовать вам не пытаться «проверять» адреса электронной почты, вы просто начнете много работать без веской причины.

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

Все остальное просто заставит вас много работать за минимальную отдачу ...


3
При работе с подписками и платежами это вряд ли полезный совет. Если кто-то забывает свой пароль, у нас должен быть способ безопасного сброса пароля, чтобы он мог продолжать пользоваться услугой, за которую он заплатил. Поэтому иногда лучше убедиться, что они вводят действительный адрес электронной почты ради себя.
Дин Уайлд

1
Просто чтобы быть ясным в том, что я сказал - если кто-то намеревается ввести поддельный / неправильный адрес - никакое количество проверок не остановит их. в «

3
Единственный способ определить поддельное электронное письмо - отправить электронное письмо на этот электронный адрес и проверить, получаете ли вы недоставленный отчет ...
Sreekanth Karumanaghat

Джон, многие пользователи не будут пытаться ввести поддельный / неправильный адрес, но могут случайно ввести его неправильно. Поэтому выполнение простой проверки может быть очень полезным и, как показано в ответе mindriot, не так много работы. Исходя из моего опыта, большинство людей вводят свои адреса электронной почты правильно, а несколько недействительных писем чаще всего кажутся невинными опечатками.
запрет геоинженерии

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

4

Подтвердите формат вашего адреса электронной почты. 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();
}

3
    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;
}

2

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


2

Вот android.util.Patterns.EMAIL_ADDRESS

[A-Za-Z0-9 + ._ \% - +] {} тысяча двести пятьдесят-шесть \ @ [A-Za-Z0-9] [A-Za-Z0-9 -]. {0,64} ([& alpha; 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()
}

1

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

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

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

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

1

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

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

1

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

Две очевидные причины: реальные пользователи часто неправильно вводят свои адреса электронной почты, а некоторые пользователи могут вводить поддельные адреса электронной почты. Следовательно, вы хотите выполнить синтаксическую проверку и проверку существования.

Лучший способ сделать это, как я обнаружил на Android, - использовать для этого бесплатный API Cloudmersive Validation .

Код выглядит так:

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 в точке входа.


1

Простейшее решение 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()

0

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

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

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


0

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

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


0

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

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

электронная почта - это ваша электронная почта.

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

Для любителей регулярных выражений самый лучший (например, совместимый с 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 ;
}

0

Вы можете очень легко выполнить любой тип проверки в 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

Вы также можете использовать

InternetAddress emailAddr = new InternetAddress(email);
emailAddr.validate();

Если адрес электронной почты недействителен, он выдаст исключение AddressException .

К сожалению, Android не поддерживает jndi-dns , но просто чтобы дать вам представление о более мощной проверке электронной почты, вы можете использовать ее для проверки почтового домена. Может быть, гуру Android мог бы помочь и показать, есть ли подобные альтернативы ... Пример реализации с «обычной» java доступен здесь .

РЕДАКТИРОВАТЬ

Я только что понял, что javax.mail не поддерживает ни один ... Но этот пост показывает обходной путь .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.