SmtpException: No se pueden leer datos de la conexión de transporte: net io connectionclosed


Estoy usando la biblioteca SmtpClient para enviar correos electrónicos usando lo siguiente:

SmtpClient client = new SmtpClient();
client.Host = "hostname";
client.Port = 465;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.EnableSsl = true;
client.Credentials = new NetworkCredential("User", "Pass);
client.Send("from@hostname", "to@hostname", "Subject", "Body");

El código funciona bien en mi entorno de prueba, pero cuando uso servidores SMTP de producción, el código falla con un SmtpException "Error al enviar correo."with an inner IOException" Unable to read data from the transport connection: net_io_connectionclosed".

He confirmado que los firewalls no son un problema. El puerto se abre perfectamente entre el cliente y el servidor. No estoy seguro de qué más podría lanzar este error.

 79
Author: Jake C, 2013-11-27

11 answers

EDITAR: Super Redux Version

Pruebe el puerto 587 en lugar del 465. El puerto 465 está técnicamente obsoleto.


Después de un montón de paquetes olfateando lo descubrí. Primero, aquí está la respuesta corta:

El. NET SmtpClient solo admite el cifrado a través de STARTTLS. Si se establece la bandera EnableSsl, el servidor debe responder a EHLO con un STARTTLS, de lo contrario lanzará una excepción. Vea la documentación de MSDN para más detalles.

Segundo, un SMTP rápido lección de historia para aquellos que tropiezan con este problema en el futuro:

En su día, cuando los servicios también querían ofrecer cifrado, se les asignó un número de puerto diferente, y en ese número de puerto inmediatamente iniciaron una conexión SSL. Con el paso del tiempo se dieron cuenta de que era tonto desperdiciar dos números de puerto para un servicio y idearon una forma para que los servicios permitieran el texto plano y el cifrado en el mismo puerto utilizando STARTTLS. La comunicación comenzaría usando texto plano, luego usaría el comando STARTTLS para actualizar a una conexión cifrada. STARTTLS se convirtió en el estándar para el cifrado SMTP. Desafortunadamente, como siempre sucede cuando se implementa un nuevo estándar, hay una mezcolanza de compatibilidad con todos los clientes y servidores que existen.

En mi caso, mi usuario estaba tratando de conectar el software a un servidor que estaba forzando una conexión SSL inmediata, que es el método heredado que no es compatible con Microsoft en .NET.

 141
Author: Jake C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-11 23:37:12

Cambie el puerto de 465 a 587 y funcionará.

 12
Author: ADM-IT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-16 14:42:35

Para cualquiera que se encuentre con este post buscando una solución y haya configurado SMTP sendgrid a través de Azure.

El nombre de usuario no es el nombre de usuario que configuró cuando creó el objeto sendgrid en azure. Para encontrar su nombre de usuario;

  • Haga clic en su objeto sendgrid en azure y haga clic en administrar. Será redirigido al sitio SendGrid.
  • Confirme su correo electrónico y luego copie el nombre de usuario que se muestra allí.. es un nombre de usuario generado automáticamente.
  • Agregue el nombre de usuario de SendGrid a su configuración SMTP en la web.archivo de configuración.

Espero que esto ayude!

 11
Author: nologo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-20 23:47:26

Es posible que también tenga que cambiar la configuración de "aplicaciones menos seguras" en su cuenta de Gmail. EnableSsl, utilice el puerto 587 y habilite "aplicaciones menos seguras". Si Google la parte de aplicaciones menos seguras, hay páginas de ayuda de Google que lo vincularán directamente a la página de su cuenta. Ese fue mi problema, pero todo está funcionando ahora gracias a todas las respuestas anteriores.

 7
Author: Bill Mahoney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-18 04:08:23

¿Su biblioteca SMTP admite la conexión cifrada ? El servidor de correo podría estar esperando una conexión TLS segura y, por lo tanto, cerrar la conexión en ausencia de un apretón de manos TLS

 3
Author: 1234varun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-26 21:52:16

Si está utilizando un servidor SMTP en el mismo cuadro y su SMTP está vinculado a una dirección IP en lugar de "Cualquier Asignado", puede fallar porque está tratando de usar una dirección IP (como 127.0.0.1) en la que SMTP no está trabajando actualmente.

 2
Author: flickerfly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-07 16:46:12

En caso de que todas las soluciones anteriores no funcionen para usted, intente actualizar el siguiente archivo a su servidor (por publicar me refiero, y una compilación anterior sería útil).

bin-> projectname.dll 

Después de actualizar verá este error. como he resuelto con esta solución.

 1
Author: Ajay Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-23 22:14:32
//Try this out... Port 465 is not there anymore for use
     string emailFrom = "sender email here";
    string recieverEmail ="reciever email here";
            string subject = "subject here";
            string body = "message here";
            MailMessage maile = new MailMessage(emailFrom, recieverEmail, subject,body);
            SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
            client.Credentials = new System.Net.NetworkCredential("senders gmail account username here", "senders gmail account password here");
            client.EnableSsl = true;
 1
Author: SelakaN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-28 18:34:19

Para elevar lo que jocull mencionó en un comentario, estaba haciendo todo lo mencionado en este hilo y ponchando... porque el mío estaba en un bucle para ser ejecutado una y otra vez; después de la primera vez a través del bucle, a veces fallaba. Siempre trabajó la primera vez a través del bucle.

Para ser claros: el bucle incluye la creación de SmtpClient, y luego hacer.Enviar con los datos correctos. El SmtpClient se creó dentro de un bloque try/catch, para detectar errores y asegurarse de que el objeto destruido antes de la parte inferior del bucle.

En mi caso, la solución fue asegurarse de que SmtpClient se eliminara después de cada vez en el bucle (ya sea a través de la instrucción using() o haciendo una disposición manual). Incluso si el objeto SmtpClient está siendo destruido implícitamente en el bucle,. NET parece estar dejando cosas por ahí en conflicto con el siguiente intento.

 1
Author: Andy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-20 18:50:44

Prueba esto : Aquí está el código que estoy usando para enviar correos electrónicos a múltiples usuarios.

 public string gmail_send()
    {
        using (MailMessage mailMessage =
        new MailMessage(new MailAddress(toemail),
    new MailAddress(toemail)))
        {
            mailMessage.Body = body;
            mailMessage.Subject = subject;
            try
            {
                SmtpClient SmtpServer = new SmtpClient();
                SmtpServer.Credentials =
                    new System.Net.NetworkCredential(email, password);
                SmtpServer.Port = 587;
                SmtpServer.Host = "smtp.gmail.com";
                SmtpServer.EnableSsl = true;
                mail = new MailMessage();
                String[] addr = toemail.Split(','); // toemail is a string which contains many email address separated by comma
                mail.From = new MailAddress(email);
                Byte i;
                for (i = 0; i < addr.Length; i++)
                    mail.To.Add(addr[i]);
                mail.Subject = subject;
                mail.Body = body;
                mail.IsBodyHtml = true;
                mail.DeliveryNotificationOptions =
                    DeliveryNotificationOptions.OnFailure;
                //   mail.ReplyTo = new MailAddress(toemail);
                mail.ReplyToList.Add(toemail);
                SmtpServer.Send(mail);
                return "Mail Sent";
            }
            catch (Exception ex)
            {
                string exp = ex.ToString();
                return "Mail Not Sent ... and ther error is " + exp;
            }
        }
    }
 0
Author: yasmuru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-27 04:24:21

Para Outlook use la siguiente configuración que no me está dando error

Nombre del servidor SMTP smtp-mail.outlook.com

Puerto SMTP 587

 0
Author: Hisham shahid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-23 18:57:34