SmtpClient.Send 卡住

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 Helloetc。


尝试在代码开头添加以下行:


ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

ServicePointManager.Expect100Continue=false;

为什么 C# 卡住了,甚至没有发送Client Hello?


当我使用不同的主机时它工作正常。


编辑:您可以通过按原样运行上面的代码自己重现该问题。您将收到超时错误而不是错误凭据错误,并且使用wireshark,您可以看到C# 甚至没有尝试TLS 连接。


大话西游666
浏览 234回答 3
3回答

小怪兽爱吃肉

我认为问题在于隐式 SSL。System.Net.Mail仅支持“显式”SSL,如此处所述:http://blogs.msdn.com/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465.aspx通常这是由惯例支配的。在端口 25(正常情况)上运行的 SMTP 使用显式 SSL。在端口 465 上运行的 SMTPS 使用隐式 SSL。在端口 587 上运行的邮件提交使用显式 SSL。25如果允许显式 SSL,您可以尝试使用端口。

米琪卡哇伊

这可能是题外话,但我想建议你使用https://github.com/jstedfast/MailKit而不是自己创建 smtp 客户端,这是来自https://www.infoq.com/news/2017/04/MailKit-MimeKit-Official的原因。SmtpClient 的主要问题是它有一个令人困惑的连接生命周期。连接到 SMTP 服务器可能很耗时,尤其是在启用身份验证的情况下,因此每个 SmtpClient 对象都有一个内部连接池。

SMILET

试试下面的代码。private async Task<bool> SendEmail(string Email, string Message)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; try&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SmtpClient client = new SmtpClient("www.test.com");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client.UseDefaultCredentials = false;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client.Credentials = new NetworkCredential("abc@test.com", "password");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MailMessage mailMessage = new MailMessage();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mailMessage.From = new MailAddress("test@from.com");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mailMessage.To.Add(Email);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mailMessage.Body = Message;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mailMessage.Subject = "abc";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; await client.SendMailAsync(mailMessage);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; catch (Exception ex)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }
打开App,查看更多内容
随时随地看视频慕课网APP