Як я повинен підтвердити електронну адресу?


320

Яка хороша методика перевірки адреси електронної пошти (наприклад, з поля введення користувача) в Android? org.apache.commons.validator.routines.EmailValidator , здається, недоступний. Чи є інші бібліотеки, які роблять це, які вже включені в Android або мені доведеться використовувати RegExp?


будь ласка, посилайтесь на це, нехай це допоможе вам: stackoverflow.com/questions/12947620/…
Hiren Patel

1
@ user2757064 добре, це питання має допомогти іншому зв'язаним вами питанням. Це питання було задано через 3 роки після цього. :)
Sufian

Відповіді:


48

Не використовуйте reg-ex.

Мабуть, наступним є reg-ex, який правильно перевіряє більшість адрес електронної пошти, які відповідають RFC 2822 , (і все ще не вдасться до таких речей, як "user@gmail.com.nospam", як і org.apache.commons.validator. процедури.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 перевірити адресу електронної пошти на сервері .. перевірити чотирикутний додаток - це те саме
Harsha MV

107
Я трохи розгублений, чому ви починаєте цю відповідь з "Не використовуйте reg-ex", а потім переходите до надання reg-ex.
howettl

7
Будь ласка, читайте. Краще рішення нижче, в якому не використовується регулярний вираз.
loeschg

1
@Glen. Чи буде це справедливо для моделі Android . EMAIL_ADDRESS ? developer.android.com/reference/android/util/…
zulkarnain shah

1036

Інший варіант - це вбудовані Шаблони, починаючи з рівня 8 API:

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):)
Хусіна

35
Такі відповіді, тому мені не подобаються, щоб прийняті відповіді відображалися вгорі, а не відповіді більшістю голосів.
Єшурун

11
Чи не було б більше сенсу (читати розумним) просто поєднувати це в один рядок: return! TextUtils.isEmpty (цільовий) && android.util.Patterns.EMAIL_ADDRESS.matcher (target) .matches ();
Адам ван ден Говен

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

2
Будь обережний. Цей матч приймає email@111.222.333.44444електронну пошту
Хоакін Юрчук

101

Наступний зразок використовується в пошті К-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
Андрій Буньєу

це мені дуже допомогло і подякувало за просту відповідь .. :)
Deepthi

FYI: всередині класів символів метахарактерів значно менше, і дефіс автоматично виходить, коли їх розміщують на кордоні, ви можете спростити перший клас до, [a-zA-Z0-9+._%-]а інші[a-zA-Z0-9-]
Робін

Це тільки повертає істину , якщо синтаксис електронної пошти так само , як електронна пошта робить, я намагався видалити iз @gmail.comнього повертає істину. Те саме в `@yaho.com.
RoCk RoCk

70

Оскільки API 8 (android 2.2) існує шаблон: android.util.Patterns.EMAIL_ADDRESS http://developer.android.com/reference/android/util/Patterns.html

Таким чином, ви можете використовувати його для перевірки вашоїEmailString:

private boolean isValidEmail(String email) {
    Pattern pattern = Patterns.EMAIL_ADDRESS;
    return pattern.matcher(email).matches();
}

повертає істину, якщо електронний лист дійсний

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>. Хоча ви технічно можете перевірити електронну пошту за допомогою регулярного виразу , це робити трохи абсурдно.
Cory Petosky

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

Переконайтеся, що після виконання цього методу слід перевірити, чи повертається цей метод як істинний, тоді ви дозволяєте зберігати електронну пошту та якщо цей метод повертає помилкове тоді відображається повідомлення про те, що повідомлення електронної пошти "Недійсне".

Сподіваюся, ви отримаєте свою відповідь, дякую.


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 + ._ \% - +] {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()
}

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

Відповідь на це запитання: - Вимога підтвердити адресу електронної пошти із заданими пунктами

Пояснення-

  1. (?.
  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

Найпростіше рішення Котліна з використанням функцій розширення:

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) та нових доменів верхнього рівня, таких як .l.

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

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



0

Я використовував наступний код. Це працює на решітці. Я сподіваюся, що це вам допоможе.

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

і використовуйте метод follwing. Це повертає справжнє значення, якщо електронна пошта є дійсною.

    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 доступний тут .

EDIT

Я просто зрозумів , що javax.mail НЕ не підтримує ні ... Але цей пост показує Обхідний шлях .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.