c# - salida - thunderbird no recibe mensajes
SmtpClient no puede enviar; Thunderbird puede (5)
Estaba enfrentando el mismo problema cuando cambio al servicio de correo electrónico de Amazon. Mi servidor de correo electrónico anterior requería un puerto, pero el servicio de correo electrónico de Amazon funciona sin él. Se requieren configuraciones de Puerto y Habilitar SSL de acuerdo con su correo electrónico Servidor SMTP. Agregar puerto y EnableSSL si es necesario.
public static SmtpClient GetSmtpClient()
{
var client= new SmtpClient();
client.Host= _smtpServer;
client.UseDefaultCredentials = false;
if (smtpUseDefaultCredential)
{
client.UseDefaultCredentials = true;
}
else
{
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential(smtpUser, smtpPassword);
}
if(isPortRequired)
{
client.Port= _smtpPort;
}
if(isEnableSslRequired)
{
client.EnableSsl= true;
}
return client;
}
Esto debería ser bastante rutinario, ¿verdad?
public static SmtpClient GetSmtpClient()
{
var client = new SmtpClient
{
Host = _smtpServer,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(_smtpUsername, _smtpPassword),
Port = _smtpPort, // port 25
EnableSsl = _smtpSsl // false
};
return client;
}
...
var m = new MailMessage
{
// contents of mail message
}
using (var server = GetSmtpClient())
{
server.Send(m);
}
Pero server.Send()
está lanzando una SmtpException
:
Error en el envio de correo. ---> System.IO.IOException: no se pueden leer datos de la conexión de transporte: net_io_connectionclosed
Algo mal con mis credenciales? Bloque de IP en el servidor SMTP? ¿Tal vez mi ISP bloquea las solicitudes salientes al puerto 25? Descargué e instalé Thunderbird en la misma máquina que mi entorno de depuración, y configuré credenciales SMTP idénticas allí, y funciona perfectamente.
Entonces, ¿por qué funciona en Thunderbird, pero no en mi código?
ACTUALIZACIÓN: Siguiendo la sugerencia de @ tzachs, descargué Wireshark y descubrí que el progreso de la transacción es idéntico, hasta cierto punto.
Thunderbird:
TCP 62 25 → 50924 [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1360 SACK_PERM=1
SMTP 143 S: 220 smtp.somedomain.com ESMTP Sendmail 8.13.8/8.13.8; Sat, 5 Dec 2015 15:46:22 -0500
TCP 54 25 → 50924 [ACK] Seq=90 Ack=18 Win=5840 Len=0
SMTP 289 S: 250 smtp.somedomain.com Hello my-computer.myisp.com [x.x.60.61], pleased to meet you | 250 ENHANCEDSTATUSCODES | 250 PIPELINING | 250 8BITMIME | 250 SIZE | 250 DSN | 250 ETRN | 250 AUTH LOGIN PLAIN | 250 DELIVERBY | 250 HELP
SMTP 82 S: 235 2.0.0 OK Authenticated
etc.
SmtpClient:
TCP 62 25 → 50889 [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1360 SACK_PERM=1
SMTP 143 S: 220 smtp.somedomain.com ESMTP Sendmail 8.13.8/8.13.8; Sat, 5 Dec 2015 15:45:08 -0500
TCP 54 25 → 50889 [ACK] Seq=90 Ack=21 Win=5840 Len=0
SMTP 289 S: 250 smtp.somedomain.com Hello my-computer.myisp.com [x.x.60.61], pleased to meet you | 250 ENHANCEDSTATUSCODES | 250 PIPELINING | 250 8BITMIME | 250 SIZE | 250 DSN | 250 ETRN | 250 AUTH LOGIN PLAIN | 250 DELIVERBY | 250 HELP
TCP 54 25 → 50889 [FIN, ACK] Seq=325 Ack=62 Win=5840 Len=0
TCP 54 25 → 50889 [ACK] Seq=326 Ack=63 Win=5840 Len=0
Tenga en cuenta que después de la línea "encantado de conocerlo" en el rastreo de SmtpClient, no hay nada acerca de la autenticación. No "aceptado", no "fallido" - nada. Solo termina la conexión.
¿Eso arroja algo de luz?
OTRA ACTUALIZACIÓN: El servidor Smtp ejecuta SendMail, FWIW. El error es específico de este host Smtp en particular; cuando señalo diferentes servidores, el código funciona bien.
Tuve mi parte de problemas trabajando con diferentes servidores SMTP. En mi experiencia, la API .net smtpclient predeterminada a veces no te dice lo que realmente está sucediendo (para ser justos, podría ser un efecto secundario de simplificar las cosas para nosotros). Lo que me ayudó en el pasado, especialmente en la fase de solución de problemas es el uso de una .Net SMTP API que me permite depurarlo hasta los comandos rcpt y darme una información de excepción más completa.
Para eso, le recomiendo que descargue el código fuente de este proyecto y depure sus ejemplos de SMTP: MailSystem.Net Hay un proyecto de formularios de Windows llamado ActiveUp.Net.Samples, simplemente compile y ejecútelo, y estará listo para hacerlo en minutos.
Si prefiere usarlo programáticamente, es bastante similar al .net smtpclient (y tiene una sobrecarga para pasar credenciales):
ActiveUp.Net.Mail.Message message = new ActiveUp.Net.Mail.Message();
// We assign the sender email
message.From.Email = this.fromEmailTextbox.Text;
// We assign the recipient email
message.To.Add(this.toEmailTextbox.Text);
// We assign the subject
message.Subject = this.subjectTextbox.Text;
// We assign the body text
message.BodyText.Text = this.bodyTextTextbox.Text;
// We send the email using the specified SMTP server
this.AddLogEntry("Sending message.");
try
{
SmtpClient.Send(message, this.smtpServerAddressTextbox.Text);
this.AddLogEntry("Message sent successfully.");
}
catch (SmtpException ex)
{
this.AddLogEntry(string.Format("Smtp Error: {0}", ex.Message));
}
catch (Exception ex)
{
this.AddLogEntry(string.Format("Failed: {0}", ex.Message));
}
Espero eso ayude.
¿Has probado Mailgun ? Le enviará el correo y le mostrará que el correo electrónico fue enviado por el remitente especificado. Es una configuración realmente simple.
También puede agregar archivos adjuntos de correo electrónico.
Solo agregue esto a su webconfig
Web.config Esto funcionará con smtp4dev
<system.net>
<mailSettings>
<smtp>
<network host="localhost" port="25" />
</smtp>
</mailSettings>
</system.net>
Web.Release.config
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="noreply@email_you_chose.com" xdt:Transform="Replace">
<network host="smtp.mailgun.org" userName="postmaster@the_address_you_chose.com" password="password the site gives you" />
</smtp>
</mailSettings>
</system.net>
Service.cs
private MailMessage MailMessageFactory(EmailDTO emailDto)
{
var text = emailDto.Body;
var html = emailDto.Body;
var mailMessage = new MailMessage();
foreach (var recipient in emailDto.To)
{
mailMessage.To.Add(new MailAddress(recipient));
}
mailMessage.From = new MailAddress(emailDto.From);
mailMessage.Subject = emailDto.Subject;
mailMessage.Body = emailDto.Body;
mailMessage.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(text, null, MediaTypeNames.Text.Plain));
mailMessage.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(html, null, MediaTypeNames.Text.Html));
mailMessage.IsBodyHtml = true;
return mailMessage;
}
EmailDto.cs
public class EmailDTO
{
public string From { get; set; }
public IList<string> To { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
}
¿Es posible que su ISP haya implementado algo como POP antes de SMTP ? Veo que no se envía ningún mensaje de autenticación en la conversación de Thunderbird, pero sí recuerdo tener un ISP que usó ese mecanismo hace una década.
[actualización] comparando este caso con las transacciones de Wireshark publicadas, la conexión se cierra con el servidor SMTP. La pregunta es: ¿por qué? Tal vez hay algo mal con su correo electrónico. Marque si ingresó De, Para, Asunto y Cuerpo.
Espero que esto ayude.
[old] Tenía algo similar, al intentar enviar mensajes programáticamente.
Verifique la configuración de su host de correo, si se permite cada acceso de cliente.
Ver también
"En la sección" Acceso para aplicaciones menos seguras ", puede habilitar el acceso a su cuenta desde otros dispositivos / aplicaciones ... como su aplicación C #."
También agregué un certificat-Call-Back, como lo escribió ukhardy. Pero esto solo es necesario, si EnableSsl, y la devolución de llamada debería hacer alguna validación.
ServicePointManager.ServerCertificateValidationCallback =
delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{ return true; };
smtp.Send(mail);
Compruebe si funciona el Firewall y el Antivirus.
Client-Timeout Default es:
client.Timeout = 10000;
Otro usuario tuvo la misma excepción causada por Program-Structure, ver cómo se ayudó a crear Creation fuera del loop . Puede refactorizar la generación de clientes fuera de la ayuda estática de fábrica.
También verifique el método de entrega :
client.DeliveryMethod = SmtpDeliveryMethod.Network;