Socket.Connect到SMTP以验证电子邮件始终返回smtp连接超时

时间:2015-05-27 00:21:48

标签: asp.net sockets email smtp timeout

我编写了一个验证电子邮件的工具,大多是从互联网上的主题上的各种示例中复制而来的(用户Don Worthley在这里汇编了一个不错的代码示例集合https://delicious.com/dworthley/email.validation)。不幸的是,在从电子邮件创建套接字和IPEndPoint以验证主机名IP和端口后,由于超时,我的代码始终无法连接到套接字。

以下是相关代码(由于超时而在s.Connect(endPt)失败):

private bool smtpCheckEmail(string email)
{
    try
    {
        string[] host = (email.Split('@'));
        string hostname = host[1];
        IPHostEntry IPhst = Dns.GetHostEntry(hostname);
        IPEndPoint endPt = new IPEndPoint(IPhst.AddressList[0], 25);

        using (Socket s = new Socket(endPt.AddressFamily, SocketType.Stream, ProtocolType.Tcp))
        {
            try
            {
                s.Connect(endPt);
            }
            catch
            {
                s.Close();
                return false;
            }

根据我的研究,其他人报告了类似代码的成功,因此可能是我的服务器主机的问题。 MVC项目采用GoDaddy VPS,Windows 7和标准防火墙/ MSSE作为保护(我已经测试了两个禁用,具有相同的超时结果)。

我已经验证我可以telnet到我自己的主机并运行各种HELO,Mail等命令,但如果我尝试连接到其他主机的smtp,它也会超时。

也许这是一个ISP问题?

我还尝试过安装EmailVerify for .NET试用版,但遇到同样的问题,即在SMTP检查时或以上的任何验证超时。

很高兴得到一些可能是问题的建议以及如何解决问题。

编辑:在与我的一个Azure VPS进行一些比较测试后,看起来它可能与服务器有关,“telnet 74.125.206.108 smtp”(gmail的smtp主机IP)通过命令行连接Azure盒子但不是在GoDaddy上,我的项目正在进行中。

我还注意到,当我的代码从主机名(Dns.GetHostEntry(hostname))中提取IP时,在这个gmail示例中,它返回216.58.216.37,这与我在cmd for gmail.com中运行nslookup时所获得的匹配但是,我可以telnet到smtp的IP是gmail的74.125.206.108,它与smtp.gmail.com的nslookup记录相匹配。在很多情况下,我的代码可以抓住错误的IP地址吗?

1 个答案:

答案 0 :(得分:0)

原来是GoDaddy VPS的限制。将代码传输到Azure托管项目,效果很好。