GMail SMTP a través de errores de C # .Net en todos los puertos

He intentado por un whlie en esto, y hasta ahora he estado fallando miserablemente. Mi bash más reciente fue eliminado de este código de stack aquí: envío de correo electrónico a través del servidor SMTP de Gmail con C # , pero probé toda la syntax que pude encontrar aquí en la stack y en otros lugares. Mi código actualmente es:

var client = new SmtpClient("smtp.gmail.com", 587) { Credentials = new NetworkCredential("me@gmail.com", "mypass"), EnableSsl = true }; client.Send("me@gmail.com","me@gmail.com","Test", "test message"); 

Ejecutar ese código me da una excepción inmediata “Error al enviar correo” que tiene una inconveniente “incapaz de conectarse al servidor remoto”.

Si cambio el puerto a 465 (como sugieren los documentos de Gmail), obtengo un tiempo de espera cada vez.

He leído que el 465 no es un buen puerto para usar, así que me pregunto cuál es el problema con el cual el 587 no me permite conectarme. Mi usuario y pase tienen razón. He leído que tengo que tener la configuración del servicio POP en mi cuenta de Gmail, así que lo hice. Sin resultado.

Intenté originalmente hacer que esto funcionara para mi cuenta GMail de marca, pero después de encontrarme con los mismos problemas con los que pensé ir, mi cuenta regular de Gmail sería más fácil … hasta ahora ese no es el caso.

Probé tu código y funciona perfectamente con el puerto 587, pero no con el 465.

¿Has revisado el muro de fuego? Pruebe desde la línea de comando “Telnet smtp.gmail.com 587” Si obtiene “220 mx.google.com ESMTP ….”, entonces el puerto está abierto. Si no, es algo que bloquea tu llamada.

Daniel

Me encontré con este problema hace un tiempo también. El problema es que SmtpClient no admite conexiones SSL implícitas, pero admite conexiones explícitas ( System.Net.Mail con SSL para autenticarse contra el puerto 465 ). La clase anterior de MailMessage (creo que .Net 1.0) fue compatible con esto, pero hace tiempo que ha quedado obsoleta.

Mi respuesta fue llamar al CDO (Collaborative Data Objects) ( http://support.microsoft.com/kb/310212 ) directamente a través de COM utilizando algo como lo siguiente:

  ///  /// Send an electronic message using the Collaboration Data Objects (CDO). ///  /// http://support.microsoft.com/kb/310212 private void SendTestCDOMessage() { try { string yourEmail = "YourUserName@gmail.com"; CDO.Message message = new CDO.Message(); CDO.IConfiguration configuration = message.Configuration; ADODB.Fields fields = configuration.Fields; Console.WriteLine(String.Format("Configuring CDO settings...")); // Set configuration. // sendusing: cdoSendUsingPort, value 2, for sending the message using the network. // smtpauthenticate: Specifies the mechanism used when authenticating to an SMTP service over the network. // Possible values are: // - cdoAnonymous, value 0. Do not authenticate. // - cdoBasic, value 1. Use basic clear-text authentication. (Hint: This requires the use of "sendusername" and "sendpassword" fields) // - cdoNTLM, value 2. The current process security context is used to authenticate with the service. ADODB.Field field = fields["http://schemas.microsoft.com/cdo/configuration/smtpserver"]; field.Value = "smtp.gmail.com"; field = fields["http://schemas.microsoft.com/cdo/configuration/smtpserverport"]; field.Value = 465; field = fields["http://schemas.microsoft.com/cdo/configuration/sendusing"]; field.Value = CDO.CdoSendUsing.cdoSendUsingPort; field = fields["http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"]; field.Value = CDO.CdoProtocolsAuthentication.cdoBasic; field = fields["http://schemas.microsoft.com/cdo/configuration/sendusername"]; field.Value = yourEmail; field = fields["http://schemas.microsoft.com/cdo/configuration/sendpassword"]; field.Value = "YourPassword"; field = fields["http://schemas.microsoft.com/cdo/configuration/smtpusessl"]; field.Value = "true"; fields.Update(); Console.WriteLine(String.Format("Building CDO Message...")); message.From = yourEmail; message.To = yourEmail; message.Subject = "Test message."; message.TextBody = "This is a test message. Please disregard."; Console.WriteLine(String.Format("Attempting to connect to remote server...")); // Send message. message.Send(); Console.WriteLine("Message sent."); } catch (Exception ex) { Console.WriteLine(ex.Message); } } 

No olvide examinar sus referencias COM y agregar la “Biblioteca Microsoft CDO para Windows 200”, que debería agregar dos referencias: ADODB y CDO.

Implementé un cliente de correo electrónico que podría hablar con Gmail en 587 y 465 …

El puerto 25 es el puerto pop no encriptado normal; no disponible en gmail

Los otros dos puertos tienen cifrado; 587 usa TLS, 465 usa SSL.

Para usar 587, debe establecer SmtpClient.EnableSsl = true.

465 no funcionará con SmtpClient, sino que funcionará con la clase obsoleta SmtpMail.

Pruebe este enlace http://www.google.com/accounts/DisplayUnlockCaptcha en el servidor.

Las cuentas comerciales de Gmail (o las cuentas normales de gmail no están seguras de esta) requieren un DisplayUnlockCaptcha por primera vez.

Tuve el mismo problema, pero no tuve la libertad de alterar las restricciones de firewall de mi empresa. Basado en una de las notas en este documento de Google , junto con la respuesta de erdenetsogt anterior, intenté usar el puerto 25 y funcionó. (Al principio me preocupaba que el uso del puerto 25 implicara que el mensaje podría no estar encriptado, así que establecí EnableSSL en falso, lo que provocó que gmail lo rechazara porque StartTLS nunca fue llamado. Esto me lleva a creer que gmail está aplicando explícitamente SSL, incluso sobre el puerto 25).

El firewall de su red privada bloqueó los puertos 587 y 465. Puede usar el puerto predeterminado 25 o habilitar los puertos en el firewall

Hay dos formas de hacer SMTP sobre SSL: Explícito e Implícito. Explícito significa que se conecta a un puerto SMTP normal (generalmente 25 o 587) en texto plano, luego emite el comando “starttls” para cambiar al modo SSL. Implícito significa que se conecta a un puerto que espera que todo sea SSL (generalmente 465).

Asp.net utiliza “System.Net.Mail.SmtpClient ()” para enviar correos electrónicos. El principal problema es que SmtpClient no admite conexiones SSL implícitas, pero admite conexiones explícitas (System.Net.Mail con SSL para autenticarse frente al puerto 465). Por lo tanto, si el servidor de correo (SMTP) no es compatible con la conexión explícita, no puede enviar correos electrónicos y mostrar mensajes como “Tiempo de espera de conexión”, “No se pudo enviar el mensaje al servidor SMTP”. El código de error de transporte fue 0x80040217. La respuesta del servidor no estaba disponible “, etc.

Para resolver este problema en ASP.net, podemos usar Collaboration Data Objects (CDO) para la biblioteca de Windows 2000 (Cdosys.dll) para enviar un mensaje de correo electrónico con archivos adjuntos. Microsoft Outlook usa esta DLL para enviar correos electrónicos. En su solución ASP.net, debe agregar el referendo “Microsoft CDO para la Biblioteca de Windows 2000”. Agregará dos archivos dll marcados en la carpeta Bin.

imagen para agregar referance

Ahora haz el código de abajo en C # .net:

 public static void SendMail(string FromName, string FromEmail, string ReceiverEmail, string CC, string BCC, string subj, string Mssg) { const var cdoSendUsingPort = 2; const var cdoBasicAuth = 1; const var cdoTimeout = 60; var mailServer = "mail.XXXXXXX.net"; var SMTPport = 465; var mailusername = "yyy@XXXXXXX.net"; var mailpassword = "PPPPXXXX"; var objEmail = CreateObject("CDO.Message"); var objConf = objEmail.Configuration; var objFlds = objConf.Fields; objFlds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = cdoSendUsingPort; objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = mailServer; objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = SMTPport; objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = true; objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = cdoTimeout; objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoBasicAuth; objFlds.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = mailusername; objFlds.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = mailpassword; objFlds.Update(); objEmail.To = ReceiverEmail; objEmail.From = FromEmail; objEmail.CC = CC; objEmail.BCC = BCC; objEmail.Subject = subj; objEmail.HTMLBody = Mssg; objEmail.Send(); } 

En VB.net

 Public Shared Sub SendMail(ByVal FromName As String, ByVal FromEmail As String, ByVal ReceiverEmail As String, ByVal CC As String, ByVal BCC As String, ByVal subj As String, ByVal Mssg As String) ''#################Sending Email########################## Const cdoSendUsingPort = 2 ' Send the message using SMTP Const cdoBasicAuth = 1 ' Clear-text authentication Const cdoTimeout = 60 ' Timeout for SMTP in seconds Dim mailServer = "mail.XXXXXXX.net" Dim SMTPport = 465 Dim mailusername = "yyy@XXXXXXX.net" Dim mailpassword = "PPPPXXXX" Dim objEmail = CreateObject("CDO.Message") Dim objConf = objEmail.Configuration Dim objFlds = objConf.Fields With objFlds .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = cdoSendUsingPort .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = mailServer .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = SMTPport .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True .Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = cdoTimeout .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoBasicAuth .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = mailusername .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = mailpassword .Update() End With objEmail.To = ReceiverEmail objEmail.From = FromEmail objEmail.CC = CC objEmail.BCC = BCC objEmail.Subject = subj objEmail.HTMLBody = Mssg 'objEmail.AddAttachment "C:\report.pdf" objEmail.Send() End Sub 

Referance: Mensaje original SMTP implícito y explícito http://help.fogcreek.com/9002/using-ann-smtp-server-with-ssl Utilice la biblioteca Cdosys.dll para enviar un mensaje de correo electrónico con archivos adjuntos https: // support.microsoft.com/en-us/help/310212/how-to-use-the-cdosys-dll-library-to-send-an-e-mail-message-with-attac