SmtpClient.Send застревает - PullRequest
       1

SmtpClient.Send застревает

0 голосов
/ 12 декабря 2018
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 голосов
/ 21 декабря 2018

Я думаю, что проблема заключается в неявном 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

Обычно это регулируетсяусловно.SMTP, работающий на порту 25 (обычный случай), использует явный SSL.SMTPS, работающий на порту 465, использует неявный SSL.При отправке почты через порт 587 используется явный SSL.

Вы можете попробовать порт 25, если это разрешает явный SSL.

0 голосов
/ 20 декабря 2018

Попробуйте следующий код.

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

    }
0 голосов
/ 21 декабря 2018

это может быть не по теме, но я хотел бы предложить вам использовать

https://github.com/jstedfast/MailKit

вместо самостоятельного создания клиента SMTP, вот причина из https://www.infoq.com/news/2017/04/MailKit-MimeKit-Official.

Основная проблема с SmtpClient заключается в том, что у него запутанный жизненный цикл соединения.Подключение к SMTP-серверу может занять много времени, особенно если включена аутентификация, поэтому каждый объект SmtpClient имеет внутренний пул соединений.

0 голосов
/ 12 декабря 2018

Этот фрагмент кода работает для меня

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...