php中的checkdnsrr()函数的C#.NET实现

时间:2017-04-23 11:51:57

标签: c# php .net email-validation

我正在编写一个桌面应用程序,需要验证用户的电子邮件ID。

有人可以告诉我php中的http://php.net/manual/en/function.checkdnsrr.php'>checkdnsrr()函数的c#.net实现,如果它不存在,请给我写了一些自己的实现指针吗?我在网上搜了几个小时才得到答案,却找不到答案。

提前致谢。

编辑(S):
请注意,此问题与How to check if an email address exists without sending an email?

不重复

1 个答案:

答案 0 :(得分:1)

即使它在FINGER协议中存在多年,也确实没有可以依赖的防弹方式;在大多数系统上禁用隐私/安全/垃圾邮件。

因此,我们有几种标准方法可以验证,但没有一种方法是完美的。我在.NET中看到的最常见的有这些变种:

正则表达式:有多种模式可供查看模式是否符合RFC所说的合法​​地址。

System.Net.Mail 使用MailAddress类来查看指定的输入是否可以是有效地址。这实际上做得很好;但是,它将允许通过我们不会考虑有效地址的项目,例如没有顶级域名。

private bool isValidEmail (string emailAddress) {
    bool ReturnValue;
    try {
        MailAddress ma = new MailAddress(emailAddress);
        ReturnValue = true;
    }
    catch (Exception) {
        ReturnValue = false;
    }
    return ReturnValue;
}

但是你要找的东西看起来会多一点。我正在阅读的是您要验证主机是否存在,并检查它是否可以接受邮件。我知道知道这样做的方法很简单,但您可以使用命令shell运行类型为 MX nslookup,以查看是否获得了可接受的回报。以下代码示例在这方面是不完整的,您将必须创建一个解析函数并开发到您自己的标准。

protected static bool DnsLookup(string HostName) {
    ProcessStartInfo ProcInfo = new ProcessStartInfo("cmd");
    ProcInfo.UseShellExecute = false;
    ProcInfo.RedirectStandardInput = true;
    ProcInfo.RedirectStandardOutput = true;
    ProcInfo.CreateNoWindow = true;

    bool ReturnValue;
    using (Process process__1 = Process.Start(ProcInfo)) {
        StreamWriter sw = process__1.StandardInput;
        StreamReader sr = process__1.StandardOutput;

        sw.WriteLine("nslookup -type=mx " + HostName);
        sw.Close();

        string Result = sr.ReadToEnd();

        // Parse the Result string to determine validity 
        // and set ReturnValue
    }
    return ReturnValue;
}

我会做的可能是使用上述的组合。使用MailAddress类查看格式是否有效,然后尝试执行nslookup以查看域是否存在且是否有邮件服务器。

MailAddress类的一个警告是它将地址解析为局部和域部分,并且在局部部分看起来有内部修剪;它会在 @ 符号前面留出一个空格;我通常在实施之前进行空格检查。