Ошибка «существующее соединение было принудительно закрыто» при отправке электронной почты в .NET 2.0 - PullRequest
2 голосов
/ 20 декабря 2011

У меня есть сайт asp.net.Я отправляю письмо через SMTPClient.Время от времени я получал эту ошибку:

 InnerException = System.IO.IOException: Unable to read data from the transport connection: 
    An existing connection was forcibly closed by the remote host. ---> 
       System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
   at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   --- End of inner exception stack trace ---
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.DelegatedStream.Read(Byte[] buffer, Int32 offset, Int32 count)
   at System.Net.BufferedReadStream.Read(Byte[] buffer, Int32 offset, Int32 count)
   at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine)
   at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller)
   at System.Net.Mail.SmtpReplyReader.ReadLine()
   at System.Net.Mail.CheckCommand.Send(SmtpConnection conn, String& response)
   at System.Net.Mail.DataStopCommand.Send(SmtpConnection conn)
   at System.Net.Mail.SmtpConnection.OnClose(Object sender, EventArgs args)
   at System.Net.ClosableStream.Close()
   at System.Net.Mail.MailWriter.Close()
   at System.Net.Mail.SmtpClient.Send(MailMessage message).

Код:

 SmtpClient smtpClient = new SmtpClient(ConfigurationManager.AppSettings["smtpserverwwwpo"]);
    try
    {
        NetworkCredential basicCredential =
            new NetworkCredential(ConfigurationManager.AppSettings["smtp_user_name"], ConfigurationManager.AppSettings["smtp_password"]);
        smtpClient.UseDefaultCredentials = false;
        smtpClient.Credentials = basicCredential;
    }
    catch
    {
        smtpClient.UseDefaultCredentials = true;
    }

    System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();
    msg.Subject = subject;
    msg.To.Add(new MailAddress(someEmail));
    msg.From = new MailAddress(ConfigurationManager.AppSettings["from_email_address"]);
    msg.Headers.Add("Content-Type", "text/html");
    msg.BodyEncoding = System.Text.Encoding.UTF8;

try{
        smtpClient.Send(msg);
} 
catch(Exception ex)
{
 //write log 
}

}

Какие причины могут быть причиной этого?

Ответы [ 5 ]

3 голосов
/ 21 декабря 2011

MailMessage является одноразовым. Вы можете попробовать обернуть его в оператор использования.

using(var message = new MailMessage {Subject ="...", Body="..."})
{
   message.To.Add("email address");
   new SmtpClient().Send(message)
}
1 голос
/ 05 июля 2013

Я верю, что это имеет мало общего с реальным кодом, который вы разместили, и со всем, что связано с объемом и содержанием ваших запросов, интерпретируемых сервером, к которому вы подключаетесь.Принудительное закрытие соединения является преднамеренным действием, а не случайной ошибкой, что означает, что сервер выбирает это, основываясь на выполнении некоторых условий.

Как было предложено выше, возможно, вы достигли некоторого предела, неизвестноговы;или, возможно, удаленный сервер особенно занят и закрывает соединения (и не возвращает правильный код ошибки для этого случая).

0 голосов
/ 29 декабря 2015

Класс SMTPClient реализует интерфейс IDisposable.всякий раз, когда Type реализует IDisposable, вы должны использовать Using () {} Statement.

eg-

using (SmtpClient SmtpServer = new SmtpClient(smtpConfig.SmtpMailServer))
                    {
                       //your code
                    }
0 голосов
/ 21 декабря 2011

где вы назначаете имя хоста SMTP-клиента ...?

что, если вы изменили свой код, чтобы использовать следующее, не уверенный в необходимости сетевых учетных данных, я не знаком с вашими спецификациями, но этот код, который я тестировал с использованием моих материалов, только что попробовал, и он работает ..

System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage();
message.To.Add("youremailAddress");
message.Subject = "This is the Subject line";
message.From = new System.Net.Mail.MailAddress("From@online.microsoft.com");
message.Body = "This is the message body";
System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient("yoursmtphost");
smtp.Send(message);
0 голосов
/ 21 декабря 2011

Возможно, вам следует установить для SmtpClient.EnableSsl значение false.

...