【发布时间】:2018-12-22 00:29:02
【问题描述】:
string host = "gauntlet.asoshared.com", username= "a@a.test", pwd = "abc",
from = "a@a.test", to = "b@b.test";
int port = 465;
var mm = new MailMessage(from, to);
mm.Body = "b1";
mm.Subject = "s1";
mm.IsBodyHtml=false;
using (var smtp=new SmtpClient(host, port)) {
smtp.EnableSsl = true;
smtp.Credentials = new NetworkCredential (username, pwd);
smtp.Send(mm);
}
这一直停留在smtp.Send。大约 2 分钟后,我收到超时错误。使用 Outlook,它可以完美运行(使用我的真实凭据)。
查看 Wireshark,我在运行此代码时看到 TCP SYN、SYN-ACK、ACK,然后什么也没有。使用 Outlook 时,这些后面跟着 TLSv1.2 Client Hello 等。
尝试在代码开头添加以下行:
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.Expect100Continue=false;
为什么 C# 卡住了,甚至没有发送 Client Hello?
当我使用不同的主机时它工作正常。
编辑:您可以通过按原样运行上面的代码自行重现该问题。您将收到超时错误而不是凭据错误错误,并且使用 wireshark,您可以看到 C# 甚至没有尝试 TLS 连接。
【问题讨论】:
-
你的代码没有问题。输入主机/凭据信息后,对我来说效果很好。如果您有权访问 smtp 服务器,您可能需要检查它的日志。
-
@just-my-name 您是否使用我发布的主机和凭据按原样尝试了我的代码?为什么它会卡住而不是给出错误的凭据错误?如果您查看 wireshark,您会发现 C# 甚至没有尝试启动 TLS 连接。
-
是的,我做到了,它的行为与您描述的一样。然后我用我的主机替换它,它工作得很好。这就是为什么我怀疑它与您的 smtp 服务器有关。
-
@just-my-name 这不是我的 SMTP 服务器,而是 A Small Orange 的。此外,您还没有解释为什么 Outlook 可以正常发送,而 C# 会阻塞。