SmtpClient.Send卡住

时间:2018-12-12 17:05:18

标签: c# smtp

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连接。

4 个答案:

答案 0 :(得分: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。

如果允许显式SSL,则可以尝试使用端口25

答案 1 :(得分:0)

可能不在主题之列,但我建议您使用

https://github.com/jstedfast/MailKit

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

  

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

答案 2 :(得分:-2)

尝试以下代码。

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;
        }

    }

答案 3 :(得分:-3)

这段代码对我有用

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