为了账号安全,请及时绑定邮箱和手机立即绑定

SmtpClient.Send 卡住

SmtpClient.Send 卡住

C#
大话西游666 2022-06-12 10:49:54
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 连接。
查看完整描述

3 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

我认为问题在于隐式 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,您可以尝试使用端口。


查看完整回答
反对 回复 2022-06-12
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

这可能是题外话,但我想建议你使用

https://github.com/jstedfast/MailKit

而不是自己创建 smtp 客户端,这是来自https://www.infoq.com/news/2017/04/MailKit-MimeKit-Official的原因。

SmtpClient 的主要问题是它有一个令人困惑的连接生命周期。连接到 SMTP 服务器可能很耗时,尤其是在启用身份验证的情况下,因此每个 SmtpClient 对象都有一个内部连接池。


查看完整回答
反对 回复 2022-06-12
?
SMILET

TA贡献1796条经验 获得超4个赞

试试下面的代码。


private async Task<bool> SendEmail(string Email, string Message)

    {

        try

        {

            SmtpClient client = new SmtpClient("www.test.com");

                client.UseDefaultCredentials = false;

                client.Credentials = new NetworkCredential("abc@test.com", "password");

            MailMessage mailMessage = new MailMessage();

            mailMessage.From = new MailAddress("test@from.com");

            mailMessage.To.Add(Email);

            mailMessage.Body = Message;

            mailMessage.Subject = "abc";

            await client.SendMailAsync(mailMessage);

            return true;

        }

        catch (Exception ex)

        {

            return false;

        }


    }


查看完整回答
反对 回复 2022-06-12
  • 3 回答
  • 0 关注
  • 233 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信