你好,如何在C# WinForms中验证电子邮件?
你好,如何在C# WinForms中验证电子邮件?
你可以使用正则表达式验证电子邮件地址:
RegEx reg=new RegEx(@"^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$", RegexOptions.IgnoreCase); ///Object initialization for Regex
if(reg.IsMatch("email string"))
//valid email
最好的方法是将此验证任务转交给.NET本身:
public bool IsValidEmailAddress (string email)
{
try
{
MailAddress ma = new MailAddress (email);
return true;
}
catch
{
return false;
}
}
识别出一些技术上有效但无法发送到的电子邮件地址(例如,包含非拉丁字符的地址)可能会产生误报,但由于您无法向这些地址发送电子邮件,因此可以从一开始就将其过滤掉。
这个页面有一个很好的正则表达式匹配电子邮件地址。
请记住,这只是一个正式检查。要检查电子邮件地址是否真实存在,您必须发送实际电子邮件至该地址并检查邮件服务器的响应。
即使如此成功,SMTP服务器也可能已配置为忽略无效的收件人地址。
如果您想验证地址格式,最好使用正则表达式。有成千上万的示例可供选择,所以我会让您自己找到并选择最好的一个。
如果您想验证地址是否存在,this article 提供了一些指针,介绍如何进行验证,但没有给出具体的代码示例。
private void textBox1_Validating(object sender, CancelEventArgs e)
{
System.Text.RegularExpressions.Regex rEMail = new System.Text.RegularExpressions.Regex(@"^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$");
if (textBox1.Text.Length > 0)
{
if (!rEMail.IsMatch(textBox1.Text))
{
MessageBox.Show("E-Mail expected", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
textBox1.SelectAll();
e.Cancel = true;
}
}
}
我使用了一个 JQuery 插件中的正则表达式,用于在客户端进行验证:
public static bool ValidEmail(string email)
{
var regex = new Regex(
@"^((([a-z]|\d|[!#\$%&'*+-/=\?\^{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_
{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|.||~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))).)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))).?$",
RegexOptions.Compiled);
return regex.IsMatch(email);
}
使用Chris的文章,我为字符串编写了一个扩展方法,它将DNSLookup库(源代码中给出了Bill Andreozzi,billandr@towncompass.com的信用),Tom Janssens的最小Telnet实现(http://www.corebvba.be)和我的正则表达式结合起来验证电子邮件地址:
/// <summary>
/// The regular expression to test the string against.
/// </summary>
private static readonly Regex validEmailRegex = new Regex(
@"^(([^<>()[\]\\.,;:\s@\""]+"
+ @"(\.[^<>()[\]\\.,;:\s@\""]+)*)|(\"".+\""))@"
+ @"((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
+ @"\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+"
+ @"[a-zA-Z]{2,}))$",
RegexOptions.Compiled);
/// <summary>
/// Determines whether the specified string is a valid email address.
/// </summary>
/// <param name="value">
/// The string to validate.
/// </param>
/// <returns>
/// <c>true</c> if the specified string is a valid email address;
/// otherwise, <c>false</c>.
/// </returns>
public static bool IsValidEmailAddress(this string value)
{
if (!validEmailRegex.IsMatch(value))
{
return false;
}
var mailServer = new DNS().LookupMX(value.Split('@')[1]);
if (!mailServer.MoveNext())
{
return false;
}
var telnet = new TelnetConnection(((DNS_MX_DATA)((DNS_WRAPPER)mailServer.Current).dnsData).pNameExchange, 25);
try
{
if (!TelnetCompare(telnet.Read(), "220"))
{
return false;
}
telnet.WriteLine("helo hi");
if (!TelnetCompare(telnet.Read(), "250"))
{
return false;
}
telnet.WriteLine("mail from: " + value);
if (!TelnetCompare(telnet.Read(), "250"))
{
return false;
}
telnet.WriteLine("rcpt to: " + value);
if (!TelnetCompare(telnet.Read(), "250"))
{
return false;
}
}
finally
{
telnet.WriteLine("quit");
}
return true;
}
/// <summary>
/// Compares two strings for length and content from the Telnet stream.
/// </summary>
/// <param name="input">The input string.</param>
/// <param name="response">The desired response.</param>
/// <returns>true if the response is the first characters if the input,
/// false otherwise</returns>
private static bool TelnetCompare(string input, string response)
{
if (string.IsNullOrEmpty(input) || string.IsNullOrEmpty(response))
{
return false;
}
if (input.Length < response.Length)
{
return false;
}
return string.CompareOrdinal(input.Substring(0, response.Length), response) == 0;
}
最好的方法是在“@”处将其分为两个部分,分别验证邮箱部分和域部分。我知道有一些正则表达式正在漂浮,但这些可能很快就会变得复杂。
RFC2822的第3.4节完全定义了有效的电子邮件地址:查找addr-spec
和dot-atom
的规范。
本质上,邮箱部分是一个由一个或多个字符组成的字符串,这些字符是字母数字或以下字符之一:!, #, $, %, &, ', *, +, -, /, = ?, ^, _, `, {, |, }, ~ 和句点“.”。域部分遵循类似的规则。
鉴于灵活性,最简单的方法可能只是进行字符串检查,以确定它是否具有单个“@”,然后分别检查邮箱和域部分,以查看它们是否包含以上集合中没有的字符。无论是使用正则表达式还是其他方式进行执行,都是您自己的选择。
if (dateEdit1.EditValue == null || textEdit11.EditValue == null || textEdit10.EditValue == null || comboBox1.Text == null
|| textEdit12.EditValue == null || dateEdit2.EditValue == null || textEdit12.EditValue == null || comboBox2.Text == null
|| comboBox2.Text == null || textEdit14.EditValue == null || textEdit15.EditValue == null || textEdit16.EditValue == null
|| textEdit17.EditValue == null || textEdit18.EditValue == null || comboBox5.Text == null || textEdit19.EditValue == null)
{
XtraMessageBox.Show("Please submit the record");
}
else
{
DialogResult dialog = XtraMessageBox.Show("Are you sure you want to remove this record?", "Delete Record", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
if (dialog == DialogResult.OK)
{
String st = "DELETE FROM OutPatient WHERE OutPatientID =" + textEdit8.Text;
SqlCommand com = new SqlCommand(st, con);
con.Open();
try
{
com.ExecuteNonQuery();
}
catch (SqlException)
{
con.Close();
}
ClearOutPatient();
}
else if (dialog == DialogResult.Cancel)
{
ClearOutPatient();
}