Matching a Valid Mail Address
Problem
You want to find a pattern that will verify the validity of a supplied mail address.
Solution
There isn’t one. You cannot do real-time validation of mail addresses. You must pick from a number of compromises.
Discussion
The common patterns that people try to use for this are all quite
incorrect. As an example, the address
fred&barney@stonehenge.com
is valid and
deliverable (as of this writing), but most patterns that allegedly
match valid mail addresses fail miserably.
RFC-822 documents have a formal specification for what constitutes a syntactically valid mail address. However, complete processing requires recursive parsing of nested comments, something that one single regular expression cannot do. If you first strip off legal comments:
1 while $addr =~ s/\([^()]*\)//g;
You could then in theory use the 6598-byte pattern given on the last page of Mastering Regular Expressions to test for RFC-conformance, but that’s still not good enough, for three reasons.
First, not all RFC-valid address are deliverable. For example,
foo@foo.foo.foo.foo
is valid in form, but in
practice is not deliverable. Some people try to do DNS lookups for MX
records, even trying to connect to the host handling that
address’s mail to check if it’s valid at that site. This
is a poor approach because most sites can’t do a direct connect
to any other site, and even if they could, mail receiving sites
increasingly either ignore the SMTP VRFY command or fib about its
answer.
Second, ...
Get Perl Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.