lunes, 11 de julio de 2022

Unable to read data from the transport connection: net_io_connectionclosed

Resolver Unable to read data from the transport connection: net_io_connectionclosed


Hola.

Estoy obteniendo el siguiente error al hacer envíos de correo electrónico utilizando ASP.NET. Estoy utilizando el Framework 4.0 

El error completo es el siguiente:

20220704 12:30:32 : Application Mail Error: System.Net.Mail.SmtpException: Failure sending mail. ---> System.IO.IOException: Unable to read data from the transport connection: net_io_connectionclosed.

   at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine)

   at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine)

   at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller)

   at System.Net.Mail.CheckCommand.Send(SmtpConnection conn, String& response)

   at System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command, MailAddress from, Boolean allowUnicode)

   at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, Boolean allowUnicode, SmtpFailedRecipientException& exception)

   at System.Net.Mail.SmtpClient.Send(MailMessage message)

   --- End of inner exception stack trace ---

   at System.Net.Mail.SmtpClient.Send(MailMessage message)

   at Models.Funciones.enviarEmailRegistroActivacion(SegmentoModel _model) in C:\www\www.misitio.com\Models\Funciones.cs:line 166


La razón es que Microsoft ha dejado de dar soporte para TLS1.0 y TLS1.1 para los endpoints default de SMTP. En mi caso smtp.office365.com

El problema es que las definiciones de SecurityProtocolType.Tls11 y SecurityProtocolType.Tls12 no están definidas en en el Framework 4.0 por lo que se tienen que especificar con una representación numérica de estos valores.

Abajo dejo el bloque de código con la linea de código que agregué para hacer funcionar el envío de correos. 

ServicePointManager.SecurityProtocol = (SecurityProtocolType)(0xc0 | 0x300 | 0xc00);

net_io_connectionclosed

Solución.


La configuration de envío que estoy usando es similar a la siguiente en donde he agregado el atributo enableSsl="true" a mi configuración smtp. Si no lo hiciera desde ahí se tiene que agregar en el código mismo.

<system.net>
  <mailSettings>
      <smtp from="noreply@noreply.net">
    <network host="smtp.office365.com" password="mipassword" port="587" userName="micuenta@misitio.com" enableSsl="true" />
      </smtp>
   </mailSettings>
</system.net>

Estoy usando el siguiente código para realizar el envío de correo electrónico, en negritas lo que he agregado:

public static void enviarEmailRegistroActivacion(RegistrarUsuarioSegmentoModel _model)
{
var bodyMail="";
MailAddress a = new MailAddress(_model.EMAIL);
MailAddress de = new MailAddress(p_FromMail);
MailMessage message = new MailMessage(de, a);

if (p_bcc_email.Length > 0)
{
MailAddress bcc = new MailAddress(p_bcc_email);
message.Bcc.Add(bcc);
}

message.IsBodyHtml = true;
message.Subject = "Activación de cuenta para ingreso";

bodyMail = "<p>Hola " + _model.NOMBRE + ".</p>";
bodyMail += "Recibimos sus datos correctamente.<br/>";
bodyMail += "<p>Atentamente,</p>";

message.Body = bodyMail;
// Use the application or machine configuration to get the
// host, port, and credentials.
//Allow TLS 1.0, 1.1 and 1.2
ServicePointManager.SecurityProtocol = (SecurityProtocolType)(0xc0 | 0x300 | 0xc00);

SmtpClient client = new SmtpClient();
//client.EnableSsl=true;
try
{
client.Send(message);
}
catch (Exception ex)
{
Funciones.GrabaArchivo(ArchivoLog, "Application Mail Error: " + ex.ToString(), true);
}
}        

Si no se agrega la propiedad EnableSsl, obtengo el siguiente error:
 

20220704 13:01:17 : Application Mail Error: System.Net.Mail.SmtpException: Error in processing. The server response was: 5.7.3 STARTTLS is required to send mail [MN2PR15CA0060.namprd15.prod.outlook.com]

   at System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode, String response)

   at System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command, MailAddress from, Boolean allowUnicode)

   at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, Boolean allowUnicode, SmtpFailedRecipientException& exception)

   at System.Net.Mail.SmtpClient.Send(MailMessage message)


Con estos cambios, volver a generar el proyecto e intentar el envío de correo nuevamente.
La recomendación para resolver este problema es moverse a un Framework más actual para evitar este escenario de error.

Referencias:


Espero les sirva.

No hay comentarios.:

Publicar un comentario