0

I tend to use the following server side code to validate an email address:

bool result = false;

try
{
    MailAddress emailAddress = new MailAddress(_EmailAddress);
    result = true;
}
catch (Exception)
{
}

return result;

The above is based on many SO posts including this one. My point of difference is whether there is any other way other than doing an actual delivery or online check to further refine what is clearly an invalid email address viz:

The email address a@b.c passes validation and does so as well in the nice simple validator that the author of MimeKit provides.

While that may theoretically a valid email address, in practice it is not. Is my only option here to actually do some form of delivery test to further verify the email address?

Or does someone have another solution? (Preferrably not RegEx).

Community
  • 1
  • 1
TheEdge
  • 9,291
  • 15
  • 67
  • 135
  • 1
    You didn't see the previous dozen (or more) existing questions about email validation? – Ken White Jun 27 '16 at 02:24
  • You can't do this without a DNS lookup. a@b.c passes the RFC rules for email formats. – Patrick Jun 27 '16 at 02:29
  • @KenWhite I did, and have clarified my question now as being different. – TheEdge Jun 27 '16 at 02:37
  • 1
    @Patrick Thanks that was the answer I was after. If you would like to submit that as an answer I will accept it. – TheEdge Jun 27 '16 at 02:37
  • @TheEdge I added the best RegEx I can think of to handle it fast without actual verification. I'm not sure why you were looking to avoid RegEx, this is exactly where it is needed most. – Patrick Jun 27 '16 at 02:43
  • 1
    @Patrick I have augmented my validation with an MX DNS lookup. If there is no MX lookup for the domain then it now fails. That way it will always be up to date as well. – TheEdge Jun 27 '16 at 02:53
  • @TheEdge That's the only way to do it. No RegEx is going to tell you if something is a valid email, outside if it being "valid" by the RFC spec. – Patrick Jun 27 '16 at 02:55

1 Answers1

1

You can't do this without a DNS lookup. a@b.c passes the RFC rules for email formats.

If you want to use RegEx, you can use the following, which is false for a@b.c.

You would need to keep it up to date with the valid current domains, and there are no guarantees it actually exists without the check.

private static bool ValidEmail(string emailAddress) {
   var regex = new Regex(@"([a-z0-9][-a-z0-9_\+\.]*[a-z0-9])@([a-z0-9][-a-z0-9\.]*[a-z0-9]\.(arpa|root|aero|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)|([0-9]{1,3}\.{3}[0-9]{1,3}))");
   return regex.IsMatch(emailAddress);
}
Patrick
  • 5,526
  • 14
  • 64
  • 101