如何验证电子邮件地址?

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

278783 次浏览

不要使用reg-ex。

显然,下面是一个正确验证大多数符合RFC 2822的电子邮件地址的reg-ex,(并且仍然会在"user@gmail.com.nospam"上失败,org.apache.commons.validator. routator . 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帐户或其他东西。

请注意,大多数正则表达式对于国际域名(IDN)和新的顶级域名(如.mobi或.info)无效(如果您检查国家代码或.org, .com, .gov等)。

有效的检查应该将本地部分(在at符号之前)和域部分分开。您还应该考虑本地部分和域的最大长度(包括at号在内的255个字符的总和)。

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

可以使用正则表达式。大致如下。

Pattern pattern = Pattern.compile(".+@.+\\.[a-z]+");
String email = "xyz@xyzdomain.com";
Matcher matcher = pattern.matcher(email);
boolean matchFound = matcher.matches();

注意:检查上面给出的正则表达式,不要按原样使用它。

下一个模式用于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();
}

试试这个简单的方法,它不能接受以数字开头的电子邮件地址:

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

Linkify类有一些非常有用的helper方法,包括用于获取电话号码和电子邮件地址的正则表达式,例如:

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

另一个选项是内置的模式,从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();
}

我强烈建议你不要尝试“验证”电子邮件地址,你只会让自己陷入很多工作没有好的理由。

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

其他任何事情只会让你付出大量的工作,回报却微乎其微……

最简单的电子邮件验证方式。

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

我已经使用以下代码。这很有效。我希望这对你有所帮助。

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();
}
自API 8 (android 2.2)以来,有一个模式:android.util. patterns . email_address http://developer.android.com/reference/android/util/Patterns.html < / p >

所以你可以用它来验证yourEmailString:

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

如果邮件有效,则返回true

< p >乌利希期刊指南: 这个模式的源代码是:

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.

电子邮件就是你的电子邮件。

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


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

对于正则表达式爱好者来说,我迄今为止发现的最好的(例如与RFC 822一致)电子邮件模式如下(在PHP提供过滤器之前)。我想对于那些玩API <的人来说,把它翻译成Java很容易;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 ;
}

在要验证电子邮件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;
}
}

你可以通过oval.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));
}
}
}
}

验证您的电子邮件地址格式。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();
}

试试这段代码..它真的有效。

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

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

我们现在有一个简单的电子邮件模式匹配器。

Java:

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

芬兰湾的科特林功能:

 private fun isValidEmail(email: String): Boolean {
return !TextUtils.isEmpty(email) && Patterns.EMAIL_ADDRESS.matcher(email).matches()
}

芬兰湾的科特林扩展:

fun String.isValidEmail() =
!TextUtils.isEmpty(this) && Patterns.EMAIL_ADDRESS.matcher(this).matches()

你也可以用

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

如果电子邮件无效,它将抛出AddressException

不幸的是,Android 不支持 jndi-dns,但只是为了让你了解更强大的电子邮件验证,你可以使用它来验证电子邮件域。也许安卓专家可以帮忙,并展示是否有类似的替代品……一个“常规”java 可在此下载的示例实现。

编辑

我刚意识到javax。邮件也不支持…但这篇文章显示了解决方案

我知道已经太迟了,但我还是会给你我的答案。

我使用这行代码检查输入的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 只有,开头没有文本

格式检查

check

如果我输入这封电子邮件,它会给我:true,但拼写是错误的。在 我的textInputLayout error

wrongSpelling

邮件地址__abc0, __abc1, __abc2检查器

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

注意:我试图从EditText中获得value,并在其上使用split甚至StringTokenizer。两者都返回false给我。

这是Android Studio的建议:

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

对于一个电子邮件验证android提供一些内置的模式。但它只支持空气污染指数8级或以上

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

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

确保在执行这个方法后,你应该检查如果这个方法返回真正的,那么你允许保存电子邮件,如果这个方法返回,那么显示电子邮件是“无效”的消息。

希望你能得到答案 谢谢你。< / p >

使用简单的一行代码进行电子邮件验证

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

如果你正在使用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的源代码

在包android.util中有一个Patterns类,这在这里是有益的。以下是我经常使用的验证电子邮件和许多其他东西的方法

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

Following是我用的。然而,它包含额外的字符比正常的电子邮件,但这是对我的要求。

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

问题的答案:- 要求用给定的点验证电子邮件地址 < / p >

解释,

  1. (? !)。* ? . .)“Negative Lookhead”否定2个连续的点。
  2. <李> [A-Za-z0-9 ! # \ \ % \和美元 ;\'*+-/\=\?\^_ '{\|}\~]+至少一个 角色定义。("\"用于转义).
  3. 可能有一个。
  4. [A-Za-z0-9]+然后至少定义一个字符。
  5. [A-Za-z0-9 -。*零或任何已定义字符的重复。
  6. [A-Za-z0-9]+点后至少一个字符。

你可以这样写一个Kotlin扩展:

fun String.isValidEmail() =
isNotEmpty() && android.util.Patterns.EMAIL_ADDRESS.matcher(this).matches()

然后像这样调用它:

email.isValidEmail()

这里是android.util.Patterns.EMAIL_ADDRESS

(a-zA-Z0-9 + ._ \ % - +) {1256} \ @ [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()
}

这里的关键是要完全验证电子邮件地址。你不只是想检查它的语法正确性,你想检查电子邮件地址是否真实。

真正的用户经常输入错误的电子邮件地址,一些用户可能输入假的电子邮件地址。因此,您需要进行语法检查和存在性检查。

我在Android上发现的最好的方法是使用免费的Cloudmersive验证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();
}

我在我所有的应用程序中使用这个,这是伟大的,因为我可以在进入点验证用户体验中的电子邮件地址。

使用扩展函数的最简单的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()

如果你在kotlin-multiplatform中没有访问Pattern,这是等价的:

fun String.isValidEmail() = Regex(emailRegexStr).matches(this)

Kotlin扩展函数

fun EditText.isValidEmail() : Boolean{
return if(Pattern
.compile("^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$")
.matcher(text.toString()).matches()){
true
}else {
hint = context.getString(R.string.invalid_email_adress)
false
}
}

使用

if(!emailEt.isValidEmail()){
return
}

根据模式。EMAIL_ADDRESS,此邮件是正确的"abc@abc.c"。所以我在模式中修改了正则表达式。EMAIL_ADDRESS并增加了域的最小长度。 下面是Kotlin的函数:

fun isEmailValid(email: String): Boolean =
email.isNotEmpty() && 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\\-]{1,25}" +
")+"
).matcher(email).matches()

我只是将域部分从{0,25}改为{1,25}。

这是kotlin使用扩展函数的最佳方式

fun String.isEmailValid(): Boolean {
return !TextUtils.isEmpty(this) && android.util.Patterns.EMAIL_ADDRESS.matcher(this).matches()
}

电子邮件验证在Kotlin:

val email = etEmail.text.toString().trim() // get email from user


if(isValidEmail(email)){ // call isValidEmail function and pass email in parameter
// Your email ID is Valid
}else{
// Enter your valid email ID
}

此方法用于检查有效的电子邮件id格式。

    fun isValidEmail(email: CharSequence): Boolean {
var isValid = true
val expression = "^[\\w.-]+@([\\w\\-]+\\.)+[A-Z]{2,4}$"
val pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE)
val matcher = pattern.matcher(email)
if (!matcher.matches()) {
isValid = false
}
return isValid
}