Click here to Skip to main content
6,291,124 members and growing! (16,199 online)
Email Password   helpLost your password?
Web Development » Validation » General     Intermediate

Effective Email Address Validation

By Vasudevan Deepak Kumar

In this article, we would discuss a very brief and overall technique to verify the email addresses of the users that signup for a web account.
C#, VB, .NET, Win2K, WinXP, Win2003, ASP, ASP.NET, Visual Studio, Dev
Posted:10 Oct 2003
Updated:20 Dec 2003
Views:265,085
Bookmarked:121 times
Announcements
Loading...
 
Search    
Advanced Search
printPrint   Broken Article?Report       add Share
  Discuss Discuss   Recommend Article Email
61 votes for this article.
Popularity: 5.54 Rating: 3.10 out of 5
22 votes, 36.1%
1
6 votes, 9.8%
2
5 votes, 8.2%
3
7 votes, 11.5%
4
21 votes, 34.4%
5

Introduction

Email has become a necessary and inseparable part of our day-to-day life. Even in the web applications we develop, the primary mode of information exchange between the website/application and the user is the email address. For this, some sites have a primary email and a secondary email (if something fails in primary, the information to be communicated to the user would be sent to the secondary address).

In any web portal and/or applications, where a diversified set of users are expected to visit and register, care should be taken, in validating the email address, since this is being intended to serve as the primary medium of contact between the user and the website.

What we cover

Sections of contents in this article are covered and researched highly in C#. But that's not all. An in-depth overview and real investigation of the email addresses, before it is saved as a primary contact of the user that is registering with the website, is needed. And that remains the objective of this article.

We would cover not only a real validation of addresses, but also some subtopics and associated topics like Password Recovery etc.

Since the topic is in general and to facilitate even object model and database designers, I am just trying to give an example code snippet, links to some applications and also about how to achieve it in different language implementations.

Validations

A very preliminary validation of email addresses is by analyzing the pattern of addresses. That is absolutely straight forward and we can define a regular expression to get the job done.

The following regular expression method in C#, would tell you, if the passed email address is syntactically valid or not. Note that, this verifies only syntactical validity and not whether the email address exists or not.

public static bool isEmail(string inputEmail)
{
   inputEmail  = NulltoString(inputEmail);
   string strRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
         @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" + 
         @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
   Regex re = new Regex(strRegex);
   if (re.IsMatch(inputEmail))
    return (true);
   else
    return (false);
}

The next level of validation, we can attempt is to make a negotiation with the SMTP server and validate. Some mail servers respond even to VRFY and/or RCPT SMTP commands as to whether the email address is valid or not. But servers which are very strictly configured of not disclosing non-existing addresses, will always acknowledge any junk addresses in their domain and would bounce them on their own later. We need to tackle each of the following.

Validating via SMTP Network Connection

string[] host = (address.Split('@'));
string hostname = host[1];
     
IPHostEntry IPhst = Dns.Resolve(hostname);
IPEndPoint endPt = new IPEndPoint(IPhst.AddressList[0], 25);
Socket s= new Socket(endPt.AddressFamily, 
        SocketType.Stream,ProtocolType.Tcp);
s.Connect(endPt);

This step will throw an exception, if the domain is not valid, so that you can flag that the email address is invalid.

Validating via SMTP Handshakes

If the domain was okay, we can try to handshake with the actual server and find out whether the email address is valid or not. Perhaps, at this point, I would like to suggest the way an application used to negotiate to a SMTP server similar to how Peter has explained here (EggHeadCafe). We would not need the entire block of code anyway.

We can check each section of the SMTP negotiation like MAIL FROM and RCPT TO and optionally VRFY SMTP commands. Perhaps a descriptive SMTP command list is available here.

If from domains or from addresses are prohibited or not in the SMTP server's allow list, MAIL FROM may fail. Mail servers which allow VRFY command will let you understand whether the email address is valid or not.

My CodeSection

Since we had a similar requirement, the EggHeadCafe was really useful and I would like to share the code snippet for other users, who might be having a similar requirement.

string[] host = (address.Split('@'));
string hostname = host[1];

IPHostEntry IPhst = Dns.Resolve(hostname);
IPEndPoint endPt = new IPEndPoint(IPhst.AddressList[0], 25);
Socket s= new Socket(endPt.AddressFamily, 
             SocketType.Stream,ProtocolType.Tcp);
s.Connect(endPt);

//Attempting to connect

if(!Check_Response(s, SMTPResponse.CONNECT_SUCCESS))
{                
    s.Close();
    return false;
}

//HELO server

Senddata(s, string.Format("HELO {0}\r\n", Dns.GetHostName() ));
if(!Check_Response(s, SMTPResponse.GENERIC_SUCCESS))
{
    s.Close();
    return false;
}

//Identify yourself

//Servers may resolve your domain and check whether 

//you are listed in BlackLists etc.

Senddata(s, string.Format("MAIL From: {0}\r\n", 
     "testexample@deepak.portland.co.uk"));
if(!Check_Response(s, SMTPResponse.GENERIC_SUCCESS))
{
    s.Close();
    return false;
}


//Attempt Delivery (I can use VRFY, but most 

//SMTP servers only disable it for security reasons)

Senddata(s, address);
if(!Check_Response(s, SMTPResponse.GENERIC_SUCCESS))
{
    s.Close();
    return false;
}
return (true);

Check_Response, SendData are available in the original source code and you can download it from there. But you may need to read through the associated license agreement, regarding retaining copyright notices in your code. Since this is just a code snippet to introduce you to the idea, only relevant code area are being mentioned.

Temporary Validation

All goes well, if network conditions are ok. But there may be temporary network problems preventing connections. If you expect that your host may be slow, then you can send a dummy link to the email address and activate the account only if the user goes to the address and clicks the link. Otherwise, you can stop the account activation step, periodically reclaiming junk accounts by having a scheduled task in your web application.

Associated SubTopics

We were mentioning at the start of the article, that we would also cover in brief about subtopics. One such is the password recovery. But I think this article is getting too long, I am just compiling more information and would submit to you as a separate article, since it has its own configurations and limitations and may not fully apply within Email Validations.

To Summarize...

In fact, I hope a lot of web developers would be in need of similar validation routines, to ensure that the email addresses are valid and I really hope that the above hints would be helpful to them. Thanks Peter, your article really helped me and I hope your article and whatever hints I have been learning, which I have shared above, would really help more developers having similar requirements to solve.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Vasudevan Deepak Kumar


Member
Vasudevan Deepak Kumar is from Chennai, India who has been in the programming career since 1994, when he was 15 years old. He has his Bachelors of Engineering (in Computer Science and Engineering) from Vellore Engineering College (now VIT University). He also has a MBA in Systems from Alagappa University, Karaikudi, India.


He started his programming career with GWBasic and then in his college was involved in developing programs in Fortran, Cobol, C++. He has been developing in Microsoft technologies like ASP, SQLServer 2000. For sometime, he has also been with PHP and MySQL based development in one of his previous organizations. Now currently his focus is on Microsoft .NET World (ASP.NET, C# and Whidbey)


In his past-time, he listens to polite Carnatic Music.

Web Presence



Homepage

http://www.lavanyadeepak.tk/

Blogs



Technical




Gossips




Spiritual







Occupation: Web Developer
Location: India India

Other popular Validation articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 25 of 68 (Total in Forum: 68) (Refresh)FirstPrevNext
GeneralWhere can i get the source code? Pinmembermrgrundh0:48 1 Jul '09  
Generaloriginal source code Pinmemberxccx23:28 29 Apr '09  
QuestionFor other domains - not working PinmemberVarunPrakash1:09 17 Apr '09  
GeneralProblem with dots. PinmemberCRidley2:14 27 Mar '09  
GeneralRe: Problem with dots. Pinmemberzhifu5:19 27 Mar '09  
GeneralRe: Problem with dots. PinmemberCRidley6:41 27 Mar '09  
JokeRe: Problem with dots. Pinmemberzhifu16:00 27 Mar '09  
GeneralEmail Validation Not working Pinmemberabhishek31923:35 11 Jan '09  
GeneralRe: Email Validation Not working Pinmemberpaulroberts19876523:37 28 Jun '09  
QuestionInvalid Connection PinmemberSalvador Bruzon10:38 4 Jan '09  
GeneralSource Code PinmemberGrace83f23:45 16 Dec '08  
GeneralEmail address validation Pinmembersoumenitorchid3:24 17 Nov '08  
GeneralEntire Source Code PinmemberJignesh Panchal7:24 14 Nov '08  
GeneralJavaScript Validation using JavaScript Pinmembermayurmv5:52 4 Sep '08  
GeneralEmail domain validation PinmemberMember 47651601:22 21 Mar '08  
GeneralRe: Email domain validation PinmemberJignesh Panchal8:11 14 Nov '08  
GeneralCode PinmemberNorberto Olazabal12:47 25 Jan '08  
GeneralRe: Code Pinmember Vasudevan Deepak K2:15 27 Jan '08  
GeneralRe: Code PinmemberNorberto Olazabal4:10 28 Jan '08  
GeneralInvalid Code -- + is a legal character PinsussJohn Coleman15:42 7 Dec '07  
GeneralRe: Invalid Code -- + is a legal character PinmemberVerifier4:43 4 May '08  
GeneralRe: Invalid Code -- + is a legal character PinmemberMember 77182510:53 27 Mar '09  
GeneralWorking subdomain Regex Pinmemberashur_cz8:01 15 Nov '07  
QuestionAnother Programming language Pinmemberalirods0:16 16 Sep '07  
GeneralEmail validation Pinmemberjahed016:55 25 May '07  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 20 Dec 2003
Editor: Smitha Vijayan
Copyright 2003 by Vasudevan Deepak Kumar
Everything else Copyright © CodeProject, 1999-2009
Web15 | Advertise on the Code Project