I want a function to test that a string is formatted like an email address.
What comes built-in with the .NET framework to do this?
This works:
Don't bother with your own validation. .NET 4.0 has significantly improved validation via the MailAddress class. Just use MailAddress address = new MailAddress(input)
and if it throws, it's not valid. If there is any possible interpretation of your input as an RFC 2822 compliant email address spec, it will parse it as such. The regexes above, even the MSDN article one, are wrong because they fail to take into account a display name, a quoted local part, a domain literal value for the domain, correct dot-atom specifications for the local part, the possibility that a mail address could be in angle brackets, multiple quoted-string values for the display name, escaped characters, unicode in the display name, comments, and maximum valid mail address length. I spent three weeks re-writing the mail address parser in .NET 4.0 for System.Net.Mail and trust me, it was way harder than just coming up with some regular expression since there are lots of edge-cases. The MailAddress
class in .NET 4.0 beta 2 will have this improved functionality.
One more thing, the only thing you can validate is the format of the mail address. You can't ever validate that an email address is actually valid for receiving email without sending an email to that address and seeing if the server accepts it for delivery. It is impossible and while there are SMTP commands you can give to the mail server to attempt to validate it, many times these will be disabled or will return incorrect results since this is a common way for spammers to find email addresses.
You should use Regular Expressions to validate email addresses.
MSDN Article: How to: Verify That Strings are in Valid E-Mail Format
This example method calls the Regex.IsMatch(String, String) method to verify that the string conforms to a regular expression pattern.
Function IsValidEmailFormat(ByVal s As String) As Boolean
Return Regex.IsMatch(s, "^([0-9a-zA-Z]([-\.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$")
End Function
EMails like "address@localhost" and "user@192.168.1.2" are actually valid addresses and you can test these by running your own email server (usually done by modifying the host file as well). For a complete solution, however:
''' <summary>
''' METHODS FOR SENDING AND VALIDATING EMAIL
''' </summary>
''' <remarks></remarks>
Public Class email
''' <summary>
''' check if email format is valid
''' </summary>
''' <param name="emailAddress">[required] Email address.</param>
''' <param name="disallowLocalDomain">[optional] Allow headers like "@localhost"?</param>
''' <param name="allowAlerts">[optional] Enable error messages?</param>
''' <returns>Returns true if email is valid and false otherwise.</returns>
''' <remarks></remarks>
Public Shared Function isValid(ByVal emailAddress As String,
Optional ByVal disallowLocalDomain As Boolean = True,
Optional ByVal allowAlerts As Boolean = True
) As Boolean
Try
Dim mailParts() As String = emailAddress.Split("@")
If mailParts.Length <> 2 Then
If allowAlerts Then
MsgBox("Valid email addresses are formatted [sample@domain.tld]. " &
"Your address is missing a header [i.e. ""@domain.tld""].",
MsgBoxStyle.Exclamation, "No Header Specified")
End If
Return False
End If
If mailParts(mailParts.GetLowerBound(0)) = "" Then
If allowAlerts Then
MsgBox("Valid email addresses are formatted [sample@domain.tld]. " &
"The username portion of the e-mail address you provided (before the @ symbol) is empty.",
MsgBoxStyle.Exclamation, "Invalid Email User")
End If
Return False
End If
Dim headerParts() As String = mailParts(mailParts.GetUpperBound(0)).Split(".")
If disallowLocalDomain AndAlso headerParts.Length < 2 Then
If allowAlerts Then
MsgBox("Valid email addresses are formatted [sample@domain.tld]. " &
"Although addresses formatted like [sample@domain] are valid, " &
"only addresses with headers like ""sample.org"", ""sample.com"", and etc. " &
"[i.e. @domain.org] are accepted.",
MsgBoxStyle.Exclamation, "Invalid Header")
End If
Return False
ElseIf headerParts(headerParts.GetLowerBound(0)) = "" Or
headerParts(headerParts.GetUpperBound(0)) = "" Then
If allowAlerts Then
MsgBox("Valid email addresses are formatted [sample@domain.tld]. " &
"Your header """ & mailParts(mailParts.GetUpperBound(0)) & """ is invalid.",
MsgBoxStyle.Exclamation, "Invalid Header")
End If
Return False
End If
Dim address As MailAddress = New MailAddress(emailAddress)
Catch ex As Exception
If allowAlerts Then
MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Invalid Email Address")
End If
Return False
End Try
Return True
End Function
End Class 'email'
Public Function ValidateEmail(ByVal strCheck As String) As Boolean
Try
Dim vEmailAddress As New System.Net.Mail.MailAddress(strCheck)
Catch ex As Exception
Return False
End Try
Return True
End Function
you first have to restrict user by entering wrong symbols, you can do this by using textbox KeyPress event
Private Sub txtemailid_KeyPress(ByVal sender As System.Object,
ByVal e As System.Windows.FormsKeyPressEventArgs) Handles txtemailid.KeyPress
Dim ac As String = "@"
If e.KeyChar <> ChrW(Keys.Back) Then
If Asc(e.KeyChar) < 97 Or Asc(e.KeyChar) > 122 Then
If Asc(e.KeyChar) <> 46 And Asc(e.KeyChar) <> 95 Then
If Asc(e.KeyChar) < 48 Or Asc(e.KeyChar) > 57 Then
If ac.IndexOf(e.KeyChar) = -1 Then
e.Handled = True
Else
If txtemailid.Text.Contains("@") And e.KeyChar = "@" Then
e.Handled = True
End If
End If
End If
End If
End If
End If
End Sub
the above code will only allow user to input a-z(small), 0 to 9(digits), @,., _
and after using validating event of textbox control to validate the email id using regular expression
Private Sub txtemailid_Validating(ByVal sender As System.Object,
ByVal e As System.ComponentModel.CancelEventArgs)
Handles txtemailid.Validating
Dim pattern As String = "^[a-z][a-z|0-9|]*([_][a-z|0-9]+)*([.][a-z|0-9]+([_][a-z|0-9]+)*)?@[a-z][a-z|0-9|]*\.([a-z][a-z|0-9]*(\.[a-z][a-z|0-9]*)?)$"
Dim match As System.Text.RegularExpressions.Match = Regex.Match(txtemailid.Text.Trim(), pattern, RegexOptions.IgnoreCase)
If (match.Success) Then
MessageBox.Show("Success", "Checking")
Else
MessageBox.Show("Please enter a valid email id", "Checking")
txtemailid.Clear()
End If
End Sub