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

C#.NET implementation of checkdnsrr() function in php

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

谁能告诉我 php 中 http://php.net/manual/en/function.checkdnsrr.php'>checkdnsrr() 函数的 c#.net 实现如果它不存在,请给我一些指示来编写我自己的实现?我在网上搜索了几个小时来寻找答案,但找不到。

提前致谢。

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

不重复

虽然在 FINGER 协议中已经存在多年,但确实没有可靠的方法可以做到这一点;为了 privacy/security/spam 的缘故,它在大多数系统上被禁用。

所以这给我们留下了几种标准方法来验证,none 其中是完美的。我在 .NET 中看到的最常见的有以下几种:

正则表达式:可以使用多种模式来查看模式是否与 RFC 所说的合法​​地址匹配。

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

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

但是您要查找的内容似乎需要更多时间。我正在读的是你想验证主机是否存在,并检查它是否可以接受邮件。我知道知道这样做的好方法,但是您可以使用类型为 MX 的命令 shell 到 运行 nslookup 来查看是否你得到一个可接受的 return。下面的代码示例在这方面是不完整的,你将不得不创建一个解析函数并开发到你自己的标准。

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 class 查看格式是否有效,然后尝试执行 nslookup 查看域是否存在并有邮件服务器。

MailAddress class 的一个警告是它将地址解析为本地和域部分,并且在本地部分似乎有一个内部 trim;它将允许 space 紧接在 @ 符号之前;我通常会在实施前进行 space-检查。