代码之家  ›  专栏  ›  技术社区  ›  wezten

SmtpClient.Send被卡住了

  •  1
  • wezten  · 技术社区  · 6 年前
    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 查看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 ?

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

    编辑: 原样

    4 回复  |  直到 6 年前
        1
  •  5
  •   S.Spieker    6 年前

    我认为问题在于隐式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。

        2
  •  0
  •   Deszolate_C    6 年前

    https://github.com/jstedfast/MailKit

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

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

        3
  •  -2
  •   Usama Kiyani    6 年前

    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;
            }
    
        }
    
        4
  •  -3
  •   ljnath    6 年前

    这段代码适合我

    SmtpClient client = new SmtpClient('smtp.domain.com',25);
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.UseDefaultCredentials = true;
        client.Credentials = new NetworkCredential('username', 'password');
        client.EnableSsl = false;
        client.Send(mm);
    

    您可以尝试添加 client.DeliveryMethod