我应该如何验证电子邮件地址?


320

在Android中验证电子邮件地址(例如来自用户输入字段)的好技术是什么?org.apache.commons.validator.routines.EmailValidator似乎不可用。是否有其他库已包含在Android中,或者我必须使用RegExp?


请参照这一条,可能它会帮助你: stackoverflow.com/questions/12947620/...
西仁帕特尔

1
@ user2757064这个问题应该可以帮助您链接的其他问题。此问题在此之后三年问了。:)
Sufian

Answers:


48

不要使用正则表达式。

显然,以下是一个正则表达式,可以正确地验证大多数符合RFC 2822的电子邮件地址(并且在org.apache.commons.validator之类的“ user@gmail.com.nospam”之类的消息上仍然会失败。例程.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,甚至是更长的.lds等tlds。我想念什么吗?我不想通过不验证他们的有效电子邮件地址来阻止我的任何用户,但这似乎可以解决我想到的任何问题。
Bob Vork 2011年

@Bob验证服务器上的电子邮件地址。.检查foursquare应用程序是否具有相同功能
Harsha MV

107
我有些困惑,为什么要以“不要使用正则表达式”开始此答案,然后继续提供正则表达式。
howettl

7
请继续阅读。下面是一个更好的解决方案,它不使用正则表达式。
loeschg 2014年

1
@Glen。这对于Android的Pattern是否成立?EMAIL_ADDRESSdeveloper.android.com/reference/android/util/...
zulkarnain沙阿

1036

另一个选项是从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):)
Houcine 2013年

35
像这样的答案就是为什么我不喜欢在顶部显示接受的答案,而不是投票最多的原因。
Jeshurun 2014年

11
将其简单地组合成一行也没有任何意义(在可读性方面):return!TextUtils.isEmpty(target)&& android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
亚当·范·登霍文

1
@Houcine,是真的,但是上面的方法返回布尔值,所以当它为false时我们就没有该信息。无论如何,一个人可以在函数内部烘烤或更新ui(必须在UI线程中运行)。对于像我这样的人,他们正在验证通过程序获得的电子邮件,并且没有任何用户交互,我们可以坚持使用'== null',并且在大多数情况下可以节省几个时钟周期。
2014年

2
小心。该匹配器接受email@111.222.333.44444为有效的电子邮件
Joaquin Iurchuk '17

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只
安德烈Buneyeu

这对我非常感谢,并为简单的答案+1了.. :)
Deepthi

仅供参考:在字符类中,元字符要少得多,连字符在边界时会自动转义,您可以将第一类简化为 [a-zA-Z0-9+._%-],其他为[a-zA-Z0-9-]
Robin

这只有在电子邮件的语法是一样的电子邮件不会返回true,我试图删除i@gmail.com它会返回true。在@@ hoho.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对其进行了内部检查,因此再次取消了空检查
Volodymyr

@VolodymyrKhodonovych是正确的,但是空检查是在OR状态下完成的,否则将电子邮件传递给matcher()方法时可能会导致NPE。
Matteo

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>。从技术上讲,可以使用正则表达式验证电子邮件,但这样做有点荒谬。
2011年

1
那不仅是一个电子邮件地址。
Brill Pappin '16

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

在要验证电子邮件ID的位置调用此方法。

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

为了进行电子邮件验证,Android提供了一些InBuilt模式。但是它仅支持API级别8和更高版本

这是使用该模式检查电子邮件验证的代码。

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

确保执行此方法后,应检查此方法是否返回true,然后才允许保存电子邮件,以及此方法返回false则显示电子邮件为“无效”的消息。

希望你能得到答案,谢谢。


4

我可以强烈建议您不要尝试“验证”电子邮件地址,因为没有充分的理由,您只会从事很多工作。

只要确保输入的内容不会破坏您自己的代码即可-例如,没有空格或非法字符可能会导致异常。

其他任何事情都会使您付出很多工作,而回报却最小。


3
使用订阅和付款时,这几乎不是有用的建议。如果有人忘记了密码,我们必须有一种安全地重设密码的方法,以允许他们继续使用所付费用的服务。因此,有时最好确保我们为他们自己输入有效的电子邮件地址。
迪恩·

1
只是要弄清楚我说的是什么-如果有人打算输入假/错误的地址-不会进行大量验证就可以阻止他们。.检查像空格之类的愚蠢错误而不是'@'等都可以-检查其他任何内容都是可以的到'收益递减'...

3
识别伪造电子邮件的唯一方法是通过向该电子邮件ID发送电子邮件并检查您是否收到未送达的报告……
Sreekanth Karumanaghat

约翰,许多用户不会故意输入伪造/错误的地址,但是可能会偶然输入错误。因此,执行简单的检查可能非常有用,并且如mindriot的答案所示,这不是很多工作。根据我的经验,大多数人都正确输入了他们的电子邮件地址,而少数无效电子邮件通常似乎是无辜的错字。
ban-geoengineering

如果用户的电子邮件正常工作很重要,请发送确认电子邮件。其他一切都是胡说八道。
令人难以置信的

4

验证您的电子邮件地址格式。前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上发现的最好方法是使用免费的Cloudmersive Validation API

代码如下:

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个字符,包括符号在内)。

最好的方法是将地址转换为IDN兼容格式(如果需要),验证本地部分(RFC),检查地址的长度和检查域的可用性(DNS MX查找)或仅发送电子邮件。



0

我使用了下面的代码,这很奏效,希望对您有所帮助。

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

并使用follwing方法。如果电子邮件有效,则返回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

您可以通过椭圆形的.jar文件轻松地在android中进行任何类型的验证。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既不支持,也不支持...但是这篇文章显示了一种解决方法

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.