gpt4 book ai didi

c# - 使用 TcpClient 类连接到 smtp.live.com

转载 作者:太空狗 更新时间:2023-10-29 22:14:46 24 4
gpt4 key购买 nike

我正在尝试使用 TcpClient 类连接到 smtp.live.com。这里有一个很好的连接到 Gmail 的例子:Testing SMTP server is running via 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;我需要比它提供更多的控制。

最佳答案

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

  1. 连接
  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();
}
}

关于c# - 使用 TcpClient 类连接到 smtp.live.com,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6270028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com