SmtpClient不会通过SSL/TLS进行身份验证(不指向gmail)
本文关键字:身份验证 gmail TLS SSL SmtpClient | 更新日期: 2023-09-27 18:05:40
我有一个ssl/tls服务器(nodejs),它作为后缀/sendmail的代理,对发送的邮件执行一些预处理/数据采集。
在c#中,我可以用以下代码手动连接和验证:var sslStream = new SslStream(tcpClient.GetStream(), false,
new RemoteCertificateValidationCallback(CertificateValidation),
new LocalCertificateSelectionCallback(CertificateSelectionCallback));
string fn = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "cert.pem");
X509Certificate c = X509Certificate.CreateFromCertFile(fn);
var certs = new X509CertificateCollection();
certs.Add(c);
sslStream.AuthenticateAsClient(System.Environment.MachineName, certs , SslProtocols.Default, false);
然而,我不能得到SmtpClient连接。顶层错误是超时,但是我已经调试到SmtpClient/SmtpConnection,底层错误是流不可读,大概是因为它从未经过身份验证(我不能在我的ssl/tls代理服务器中使用SmtpClient代码命中断点,但是上面的手动sslConnection工作得很好)。
如果有一种方法可以手动提供底层通信流到SmtpClient,但我找不到一种方法来做到这一点,那将是伟大的。
有人知道为什么下面的代码不能验证吗?
这是我一直在使用的测试应用程序,试图连接SmtpClient没有成功:
ServicePointManager.ServerCertificateValidationCallback = CertificateValidation;
// Using Ssl3 rather than Tls here makes no difference
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
var client = new SmtpClient {
Timeout = 10000,
DeliveryMethod = SmtpDeliveryMethod.Network,
EnableSsl = true,
UseDefaultCredentials = false,
Host = "192.168.15.71",
Port = 10126
};
client.ClientCertificates.Add(c);
client.Credentials = new NetworkCredential("username", "password");
//times out here, except the real exception that doesn't bubble up is the stream
//isnt readable because it never authenticated (when it trys to read the status
//returned by the smtp server, eg: "220 smtp2.example.com ESMTP Postfix")
client.send(email);
前段时间解决了,忘记发答案了
. net smtp客户端以及大多数smtp客户端库不支持通过ssl/tls发起通信。它要求smtp服务器支持初始化未加密的通信,然后使用"upgrade"命令转换到加密连接(这几乎总是由smtp客户端库在幕后处理)。当时,我连接到一个半自定义的smtp服务器是代理后缀,这个自定义的解决方案只支持连接最初通过ssl/tls。我已经开始使用Haraka作为我的SMTP服务器,它支持所有SMTP标准,并为我提供了我需要的插件功能。