在 C# WinForms 应用程序中进行电子邮件验证

7

你好,如何在C# WinForms中验证电子邮件?


4
验证电子邮件地址的格式?验证电子邮件地址是否存在?验证电子邮件是否已经被发送或接收?验证电子邮件的概念?这里的问题是什么? - glenatron
1
这不是一个真正的问题,伙计们!! - Cerebrus
11个回答

12

你可以使用正则表达式验证电子邮件地址:

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

5
只有在不区分大小写的情况下才能实现此功能。请包括“RegexOptions.IgnoreCase”。 - Dinah

9

最好的方法是将此验证任务转交给.NET本身:

public bool IsValidEmailAddress (string email)
{
    try
    {
        MailAddress ma = new MailAddress (email);

        return true;
    }
   catch
   {
        return false;
   }
}

识别出一些技术上有效但无法发送到的电子邮件地址(例如,包含非拉丁字符的地址)可能会产生误报,但由于您无法向这些地址发送电子邮件,因此可以从一开始就将其过滤掉。


IsValidEmailAddress即使缺少TLD也会返回true,例如:myname@mycompany成功。 - Mark Maslar
@Mark Maslar:是的,我知道。这些都是有效的电子邮件地址,尽管你通常不会得到其中之一。 - User

2

这个页面有一个很好的正则表达式匹配电子邮件地址。

请记住,这只是一个正式检查。要检查电子邮件地址是否真实存在,您必须发送实际电子邮件至该地址并检查邮件服务器的响应。

即使如此成功,SMTP服务器也可能已配置为忽略无效的收件人地址。


1

如果您想验证地址格式,最好使用正则表达式。有成千上万的示例可供选择,所以我会让您自己找到并选择最好的一个。

如果您想验证地址是否存在,this article 提供了一些指针,介绍如何进行验证,但没有给出具体的代码示例。


这是一个很好的链接,解释了如何在PHP中建立连接以验证远程服务器,尽管它与C#无关。 - Junior Mayhé

0
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;
}
}
}

0

我使用了一个 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);
}

0

使用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;
}

0

你可以使用正则表达式对其进行验证。有各种不同的正则表达式可供选择,但我使用的更全面的表达式相当长,如此处所示


0

最好的方法是在“@”处将其分为两个部分,分别验证邮箱部分和域部分。我知道有一些正则表达式正在漂浮,但这些可能很快就会变得复杂。

RFC2822的第3.4节完全定义了有效的电子邮件地址:查找addr-specdot-atom的规范。

本质上,邮箱部分是一个由一个或多个字符组成的字符串,这些字符是字母数字或以下字符之一:!, #, $, %, &, ', *, +, -, /, = ?, ^, _, `, {, |, }, ~ 和句点“.”。域部分遵循类似的规则。

鉴于灵活性,最简单的方法可能只是进行字符串检查,以确定它是否具有单个“@”,然后分别检查邮箱和域部分,以查看它们是否包含以上集合中没有的字符。无论是使用正则表达式还是其他方式进行执行,都是您自己的选择。


0
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();
    }

尝试在你的代码旁边添加一份书面说明。 - Treycos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接