【发布时间】:2011-09-10 07:59:11
【问题描述】:
我正在尝试使用 TcpClient 类连接到 smtp.live.com。这里有一个很好的连接到 Gmail 的例子:Testing SMTP server is running via C#
不幸的是,当更新它以使用 smtp.live.com 时,当调用 AuthenticateAsClient 方法时,我收到“IOException: The handshake failed due to an unexpected packet format”。
我该如何解决这个问题?
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;我需要比它提供的更多的控制权。
【问题讨论】:
-
你需要什么样的控制,
SmtpClient不提供? -
我正在创建一个 SMTP 代理,它将支持来自我们内部使用的一些不支持 TLS/SSL 的程序的未加密连接。 SMTP 代理服务器将接受来自这些程序的连接并将信息转发到需要 TLS/SSL 的 smtp.live.com 服务器。
-
为什么不能使用 SmtpClient 进行出站连接?在我看来,只有代理中的入站连接需要自定义。
-
@jgauffin - 如果我使用 SmtpClient,我需要完全接收和拆除电子邮件。这可能包括多个收件人、多个抄送、多个附件等。工作量太大了。