使用TcpClient类连接到smtp.live.com

本文关键字:smtp live com 连接 TcpClient 使用 | 更新日期: 2023-09-27 17:58:40

我正在尝试使用TcpClient类连接到smtp.live.com。这里有一个连接Gmail的好例子:测试SMTP服务器是通过C#运行的

不幸的是,当将其更新为使用smtp.live.com时,当调用AuthenticateAsClient方法时,我会收到"IOException:由于意外的数据包格式,握手失败"。

我该如何解决这个问题?

class Program
{
    static void Main(string[] args)
    {
        using (var client = new TcpClient())
        {
            var server = "smtp.live.com";
            var port = 25;
            client.Connect(server, port);
            using (var stream = client.GetStream())
            using (var sslStream = new SslStream(stream))
            {
                // Getting an IOException here
                sslStream.AuthenticateAsClient(server);
                using (var writer = new StreamWriter(sslStream))
                using (var reader = new StreamReader(sslStream))
                {
                    writer.WriteLine("EHLO " + server);
                    writer.Flush();
                    Console.WriteLine(reader.ReadLine());
                }
            }
        }
        Console.WriteLine("Press Enter to exit...");
        Console.ReadLine();
    }
}

我尝试在AuthenticateAsClient中指定SslProtocol。Tls和Ssl3都不起作用。

还尝试为RemoteCertificateValidation提供回调,该回调总是返回true,以防服务器证书无效。这也没用。

注意:请不要建议我使用SmtpClient;我需要比它提供的更多的控制。

使用TcpClient类连接到smtp.live.com

感谢nos让我走上正轨。smtp.live.com服务器需要以下事件序列:

  1. Connect
  2. HELO-在发送STARTTLS之前不会接受它
  3. STARTTLS-显然这会设置服务器接受加密连接
  4. SslStream。AuthenticateAsClient()-这似乎让C#框架和SMTP服务器达成了"理解":)
  5. 现在我们有了加密连接,通常的SMTP命令就可以工作了

无论如何,此代码适用于端口587:上的smtp.live.com和smtp.gmail.com

class Program
{
    static void Main(string[] args)
    {
        const string server = "smtp.live.com";
        const int port = 587;
        using (var client = new TcpClient(server, port))
        {
            using (var stream = client.GetStream())
            using (var clearTextReader = new StreamReader(stream))
            using (var clearTextWriter = new StreamWriter(stream) { AutoFlush = true })
            using (var sslStream = new SslStream(stream))
            {
                var connectResponse = clearTextReader.ReadLine();
                if (!connectResponse.StartsWith("220"))
                    throw new InvalidOperationException("SMTP Server did not respond to connection request");
                clearTextWriter.WriteLine("HELO");
                var helloResponse = clearTextReader.ReadLine();
                if (!helloResponse.StartsWith("250"))
                    throw new InvalidOperationException("SMTP Server did not respond to HELO request");
                clearTextWriter.WriteLine("STARTTLS");
                var startTlsResponse = clearTextReader.ReadLine();
                if (!startTlsResponse.StartsWith("220"))
                    throw new InvalidOperationException("SMTP Server did not respond to STARTTLS request");
                sslStream.AuthenticateAsClient(server);
                using (var reader = new StreamReader(sslStream))
                using (var writer = new StreamWriter(sslStream) { AutoFlush = true })
                {
                    writer.WriteLine("EHLO " + server);
                    Console.WriteLine(reader.ReadLine());
                }
            }
        }
        Console.WriteLine("Press Enter to exit...");
        Console.ReadLine();
    }
}

如果您想在连接上使用ssl。对于ssl,应该使用端口465,对于tl,应该使用587

提示:先在没有ssl的情况下尝试它,然后在工作正常后添加它。

链接:http://www.checktls.com/tests.html查看一些starttl示例。