【问题标题】:.Net TcpClient and SmtpClient won't connect to my Smtp server.Net TcpClient 和 SmtpClient 不会连接到我的 Smtp 服务器
【发布时间】:2014-08-19 18:02:43
【问题描述】:

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

client.Connect(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: {"No connection could be made because the target machine主动拒绝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;
        }
    }

【问题讨论】:

  • 我的 ISP 阻止了端口 25 上的所有连接,包括入站和出站。当我搬到另一个地方时,一切都正常了。呸!! cox.com/residential/support/internet/…
  • 在端口 25 上阻止出站流量是很常见的。许多 SMTP 服务器还侦听端口 587,该端口不太常见。

标签: c# .net smtp tcpclient smtpclient


【解决方案1】:

“目标机器主动拒绝它”表示端口 25 上没有任何监听 - 您发送了一个 SYN 数据包并返回 RST 而不是 SYN/ACK。

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

telnet mailhost 25

看看是否连接?

【讨论】:

  • 我是通过 IP 连接的,现在有了新的转折……这可能与 .Net 无关。我刚刚在不同的位置打开了我的笔记本电脑,运行了相同的代码,它就可以工作了。 Wireshark 显示了两端的通信......不再有问题了。所以问题变成了......为什么我的服务器阻止了我家的 SMTP......或者我刚刚意识到答案......这是我的 ISP 阻止了我而不是服务器。呃!!!!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    答案是如此简单,我意识到我打了自己一巴掌……我的 ISP 阻止了端口 25 上的所有连接,包括入站和出站。当我搬到另一个地方时,一切都正常了。呵呵!!

    http://www.cox.com/residential/support/internet/article.cox?articleId=cacf82f0-6407-11df-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;
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-31
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 2012-05-11
      相关资源
      最近更新 更多