使用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;我需要比它提供的更多的控制。
感谢nos让我走上正轨。smtp.live.com服务器需要以下事件序列:
- Connect
- HELO-在发送STARTTLS之前不会接受它
- STARTTLS-显然这会设置服务器接受加密连接
- SslStream。AuthenticateAsClient()-这似乎让C#框架和SMTP服务器达成了"理解":)
- 现在我们有了加密连接,通常的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示例。