Проверка адреса электронной почты в Java - PullRequest
5 голосов
/ 24 августа 2011

Я искал наилучший из возможных способов проверить, является ли String действительным адресом электронной почты. Теперь я зациклен на двух вариантах: javax.mail.internet.InternetAddress; или используя Apache Commons EmailValidator, который внутренне использует сложный синтаксический анализатор регулярных выражений.

Мне было интересно, есть ли какие-то преимущества в выборе правильности одного по отношению к другому, или оба в порядке? Я точно знаю, что InternetAddress в некоторых случаях не обрабатывает не-ascii символы эффективно.

Ответы [ 3 ]

16 голосов
/ 03 марта 2014

Вы можете использовать EmailValidator из библиотеки Apache Commons Validator для этого:

import org.apache.commons.validator.EmailValidator;
...

EmailValidator validator = EmailValidator.getInstance();
if (validator.isValid(email)) {
   // is valid, do something
} else {
   // is invalid, do something
}

isValid проверяет, имеет ли поле действительный адрес электронной почты.

Это лучший метод проверки адреса электронной почты Java по этому вопросу Какой метод проверки адреса электронной почты Java является лучшим?

1 голос
/ 23 сентября 2012

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

Единственный «подводный камень» использования регулярного выражения от Apache Commons заключается в том, что его функциональность для проверки адреса электронной почты не является «стандартом Java». Насколько это влияет на вас как на разработчика? зависит от того, насколько ты параноик.

С другой стороны, стандартная реализация Java может быть менее эффективной. Вам нужно будет создать InternetAddress и проверить его. Глядя на исходный код JavaMail, я мог видеть это:

/**
 * Check that the address is a valid "mailbox" per RFC822.
 * (We also allow simple names.)
 *
 * XXX - much more to check
 * XXX - doesn't handle domain-literals properly (but no one uses them)
 */

(Кажется, XXX - это что-то вроде заметки или предмета "делать")

0 голосов
/ 09 июня 2015

Я только что проверил это, и, очевидно, производительность в InternetAddress существенно лучше, чем при использовании EmailValidator

package com.avaya.oss.server.errors;

import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;

import org.apache.commons.validator.EmailValidator;

public class TestValidationTypes {

    static String email = "test@testy.com";
    static int maxItr = 10000;

    public static void main(String[] args) throws AddressException {

        long start = System.currentTimeMillis();
        for (int i = 0; i < maxItr; i++) {
            EmailValidator.getInstance().isValid(email);
        }
        System.out.println("EmailValidator duration: " + (System.currentTimeMillis() - start));

        start = System.currentTimeMillis();
        for (int i = 0; i < maxItr; i++) {
            InternetAddress internetAddress = new InternetAddress(email);
            internetAddress.validate();
        }
        System.out.println("InternetAdress duration: " + (System.currentTimeMillis() - start));

    }

}

Вывод:

Продолжительность EmailValidator: 1195

Продолжительность InternetAdress: 67

В результате EmailValidator занял ~ 20 раз больше времени:

...