.Net TcpClient 和 SmtpClient 无法连接到我的 Smtp 服务器



我有一个方法,应该连接到Smtp服务器,看看它是否在线。此方法适用于测试许多邮件服务器,但不是所有邮件服务器。代码如下,但是失败发生在…

客户端。连接(strMailServer intPort);

…在与服务器对话的逻辑开始之前。它根本无法连接。我确信我连接了正确的IP和端口(25),并且我使用第三方网站(如mxtoolbox)测试了相同的服务器IP,并取得了成功。这台服务器正在接收来自万维网的常规流量。只有。net似乎无法连接。我已经查看了防火墙规则,并使用WireShark查看服务器上发生了什么,但我从未看到任何来自测试运行的传入数据包。防火墙设置为允许任何人在所有接口上连接到端口25。

我还使用SmtpClient运行如下所示的类似测试,它也失败了。

                var client = new System.Net.Mail.SmtpClient(strMailServer, intPort);
            client.Send("test@mydomain.com", "test@mydomain.com", "test message", "This is meant to test an SMTP server to see if it is online, it expects the message to be rejected.");

这里的错误堆栈导致与我的TcpClient尝试相同的底层错误。SocketException:{"无法建立连接,因为目标机器主动拒绝了xxx.xxx.xxx.xxx:25"}

为什么世界上的每个人都能连接到这个服务器…除了我的笔记本电脑…我认为这不是防火墙的问题。

帮助!

public static bool TestMailServer(string strMailServer, int intPort, out string strResponse)
    {
        try
        {
            try
            {
                //First I'll try a basic SMTP HELO
                using (var client = new TcpClient())
                {
                    client.Connect(strMailServer, intPort);
                    // As GMail requires SSL we should use SslStream
                    // If your SMTP server doesn't support SSL you can
                    // work directly with the underlying stream
                    using (var stream = client.GetStream())
                    {
                        using (var writer = new StreamWriter(stream))
                        using (var reader = new StreamReader(stream))
                        {
                            writer.WriteLine("EHLO " + strMailServer);
                            writer.Flush();
                            strResponse = reader.ReadLine();
                            if (strResponse == null)
                                throw new Exception("No Valid Connection");
                            stream.Close();
                            client.Close();
                            if (F.StartsWith(strResponse, "220"))
                                return true;
                            else
                                return false;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                //If the above failed, I'll try with SSL
                using (var client = new TcpClient())
                {
                    //var server = "smtp.gmail.com";
                    //var port = 465;
                    //client.SendTimeout = 10000;
                    //client.ReceiveTimeout = 10000;
                    client.Connect(strMailServer, intPort);
                    // As GMail requires SSL we should use SslStream
                    // If your SMTP server doesn't support SSL you can
                    // work directly with the underlying stream
                    using (var stream = client.GetStream())
                    using (var sslStream = new SslStream(stream))
                    {
                        sslStream.AuthenticateAsClient(strMailServer);
                        using (var writer = new StreamWriter(sslStream))
                        using (var reader = new StreamReader(sslStream))
                        {
                            writer.WriteLine("EHLO " + strMailServer);
                            writer.Flush();
                            strResponse = reader.ReadLine();
                            if (strResponse == null)
                                throw new Exception("No Valid Connection");
                            stream.Close();
                            client.Close();
                            if (F.StartsWith(strResponse, "220"))
                                return true;
                            else
                                return false;
                            // GMail responds with: 220 mx.google.com ESMTP
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            strResponse = ex.Message;
            return false;
        }
    }

"目标机器主动拒绝它"意味着端口25没有监听-你发送了一个SYN包,收到的是RST而不是SYN/ACK。

如果您在wireshark捕获中甚至没有看到SYN,可能您的笔记本电脑错误地解析了名称。您是否通过名称或IP连接到服务器?你有没有试过一个简单的

telnet mailhost 25

看看是否有关联?

通常为了防止SMTP服务器发送匿名电子邮件,它们只有在对入站ip地址进行反向DNS查找成功后才会接受连接。我相信反向DNS查找您的家庭地址失败了,所以它已经断开了连接。

答案很简单,我打了自己一巴掌,我意识到…我的ISP正在阻止端口25上的所有连接,入站和出站。我一搬到另一个地方,一切都好起来了。咄! !

http://www.cox.com/residential/support/internet/article.cox?articleid=cacf82f0 - 6407 - 11 - df - ccef - 000000000000

对于任何可能需要它的人,这里是我的SMTPTest类,它将探测服务器的SMTP功能。我用它来监视我的服务器,报告中断,并验证用户输入的服务器信息。

public struct SMTPTestResult
{
    public string Server;
    public bool Found;
    public bool OriginalPortSuccess;
    public int FinalPort;
    public bool UsedSSL;
    public string Response;
}
public class SMTPTest
{
    public static SMTPTestResult TestMailServer(string MailServer)
    {
        return TestMailServer(MailServer, 25, true);
    }
    public static SMTPTestResult TestMailServer(string MailServer, int Port, bool TryOtherPorts)
    {
        SMTPTestResult result = new SMTPTestResult();
        result.Server = MailServer;
        if (AttemptMailServer(MailServer, Port, false, out result.Response))
        {
            //First try the requested port, without SSL.
            result.Found = true;
            result.UsedSSL = false;
            result.OriginalPortSuccess = true;
            result.FinalPort = Port;
            return result;
        }
        else if (AttemptMailServer(MailServer, Port, true, out result.Response))
        {
            //Try the requested port, with SSL.
            result.Found = true;
            result.UsedSSL = true;
            result.OriginalPortSuccess = true;
            result.FinalPort = Port;
            return result;
        }
        else if (TryOtherPorts && Port != 465 && AttemptMailServer(MailServer, 465, true, out result.Response))
        {
            //Try port 465 with SSL
            result.Found = true;
            result.UsedSSL = true;
            result.OriginalPortSuccess = false;
            result.FinalPort = 465;
            return result;
        }
        else if (TryOtherPorts && Port != 25 && AttemptMailServer(MailServer, 25, false, out result.Response))
        {
            //Try port 25, without SSL.
            result.Found = true;
            result.UsedSSL = false;
            result.OriginalPortSuccess = false;
            result.FinalPort = 25;
            return result;
        }
        else if (TryOtherPorts && Port != 25 && AttemptMailServer(MailServer, 25, true, out result.Response))
        {
            //Try port 25, with SSL.
            result.Found = true;
            result.UsedSSL = true;
            result.OriginalPortSuccess = false;
            result.FinalPort = 25;
            return result;
        }
        else if (TryOtherPorts && Port != 587 && AttemptMailServer(MailServer, 587, false, out result.Response))
        {
            //Try port 587, without SSL.
            result.Found = true;
            result.UsedSSL = false;
            result.OriginalPortSuccess = false;
            result.FinalPort = 587;
            return result;
        }
        else if (TryOtherPorts && Port != 587 && AttemptMailServer(MailServer, 587, true, out result.Response))
        {
            //Try port 587, with SSL.
            result.Found = true;
            result.UsedSSL = true;
            result.OriginalPortSuccess = false;
            result.FinalPort = 587;
            return result;
        }
        else
        {
            result.Found = false;
            result.OriginalPortSuccess = false;
            result.FinalPort = Port;
            return result;
        }
    }
    private static bool AttemptMailServer(string strMailServer, int intPort, bool blnSSL, out string strResponse)
    {
        try
        {
            if(!blnSSL)
            {
                //I'll try a basic SMTP HELO
                using (var client = new TcpClient())
                {
                    client.Connect(strMailServer, intPort);
                    using (var stream = client.GetStream())
                    {
                        using (var writer = new StreamWriter(stream))
                        using (var reader = new StreamReader(stream))
                        {
                            writer.WriteLine("EHLO " + strMailServer);
                            writer.Flush();
                            strResponse = reader.ReadLine();
                            if (strResponse == null)
                                throw new Exception("No Valid Connection");
                            stream.Close();
                            client.Close();
                            if (strResponse.StartsWith("220"))
                                return true;
                            else
                                return false;
                        }
                    }
                }
            }
            else
            {
                //I'll try with SSL
                using (var client = new TcpClient())
                {
                    client.Connect(strMailServer, intPort);
                    // As GMail requires SSL we should use SslStream
                    // If your SMTP server doesn't support SSL you can
                    // work directly with the underlying stream
                    using (var stream = client.GetStream())
                    using (var sslStream = new SslStream(stream))
                    {
                        sslStream.AuthenticateAsClient(strMailServer);
                        using (var writer = new StreamWriter(sslStream))
                        using (var reader = new StreamReader(sslStream))
                        {
                            writer.WriteLine("EHLO " + strMailServer);
                            writer.Flush();
                            strResponse = reader.ReadLine();
                            if (strResponse == null)
                                throw new Exception("No Valid Connection");
                            stream.Close();
                            client.Close();
                            if (strResponse.StartsWith("220"))
                                return true;
                            else
                                return false;
                            // GMail responds with: 220 mx.google.com ESMTP
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            strResponse = ex.Message;
            return false;
        }
    }
}

最新更新