Gustav Brock
Gustav at cactus.dk
Sat Aug 9 11:54:46 CDT 2008
Hi all
I needed to validate the format of user entered e-mail addresses and couldn't find a good method, except some RegEx at Microsoft.
So I had to run my own, but wonder if anything better exists.
MailAddress is used for first level validation as this later will be used to create the e-mails:
using System.Net.Mail;
private static bool IsMailAddress(string address, out string cleanedAddress)
{
cleanedAddress = String.Empty;
try
{
MailAddress mailAddress = new MailAddress(address.Trim());
// MailAddress validated the address.
// However, even one char only for Host will be accepted.
// Extract user and host for further validation.
bool isAddress = false;
string displayName = mailAddress.DisplayName;
// Strip internal spaces from user and host string.
string user = mailAddress.User.Replace(" ", String.Empty);
string host = mailAddress.Host.Replace(" ", String.Empty);
// Build basic mail address.
string baseAddress = (user + "@" + host).ToLower();
// Check that Host contains a domain too.
// Expanding on the method described here: http://support.microsoft.com/kb/308252
System.Text.RegularExpressions.Regex mailRegex =
new System.Text.RegularExpressions.Regex("(?<user>[^@]+)@(?<host>[^.]+).(?<domain>[^.]+).");
System.Text.RegularExpressions.Match match = mailRegex.Match(baseAddress);
Console.WriteLine(
match.Groups["user"].Value.ToString() + "@" +
match.Groups["host"].Value.ToString() + "." +
match.Groups["domain"].Value.ToString());
isAddress = match.Success;
if (isAddress)
{
// Return formatted email address.
if (displayName.Length == 0)
{
// Basic mail address only.
cleanedAddress = baseAddress;
}
else
{
// Full address including Display Name.
cleanedAddress = @"""" + displayName + @""" <" + baseAddress + @">";
}
}
return isAddress;
}
catch
{
return false;
}
}
The trick is that MailAddress is somewhat flexible regarding accepted strings and will _clean_ these, thus you very easily can return the cleaned string. Of course, you can turn this into a small class if you like.
Here's a basic method to use it with the ErrorProvider when validating a TextBox:
private void textBoxEmailAddress_Validating(object sender, CancelEventArgs e)
{
TextBox textBox = (TextBox)sender;
string errorDescription = String.Empty;
string cleanedAddress = String.Empty;
string address = textBox.Text;
if (textBox.Text.Equals(String.Empty))
{
errorDescription = "Please enter an e-mail address";
}
else if (!IsMailAddress(address, out cleanedAddress))
{
errorDescription = "The format of the address is not correct";
}
else
{
if (!cleanedAddress.Equals(address))
{
textBox.Text = cleanedAddress;
}
}
errorProvider1.SetError(textBox, errorDescription);
}
/gustav