2009-07-04 80 views
10

He estado intentando hacer todo esto, y hasta ahora he estado fallando miserablemente. Mi intento más reciente fue eliminado de este código de pila aquí: Sending email through Gmail SMTP server with C#, pero probé toda la sintaxis que pude encontrar aquí en la pila y en otros lugares. Mi código es actualmente:SMTP de GMail a través de errores de C# .Net en todos los puertos

var client = new SmtpClient("smtp.gmail.com", 587) 
{ 
    Credentials = new NetworkCredential("[email protected]", "mypass"), 
    EnableSsl = true 
}; 

client.Send("[email protected]","[email protected]","Test", "test message"); 

Ejecución de código que me da una excepción "El no envío de correo" inmediata que tiene una innerexeption "no puede conectar con el 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 465 no es un buen puerto para usar, así que me pregunto cuál es el problema w/587 que 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.

que estaba originalmente tratando de conseguir este trabajo por mi cuenta de Gmail de marca, pero después de encontrarse con los mismos problemas w/que yo pensaba va w/mi cuenta de Gmail normal sería más fácil ... hasta ahora ese no es el caso.

+0

¿Se puede conectar a través de un cliente de correo electrónico estándar? De lo contrario, podría ser un problema con tu firewall. ¿Habilita el acceso POP en su cuenta? – MiffTheFox

+0

Sí, puedo, y sí lo hice. – Paul

Respuesta

14

me trataron su código, y funciona prefectamenta con el puerto 587, pero no con 465.

¿Ha comprobado la pared de fuego? Intente 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

+0

gracias, eso fue exactamente. Puse la regla en mi cortafuegos para dejar pasar el puerto 587, y mi cliente de correo electrónico no tuvo problemas para usarlo, pero mi a/v sospechaba de mi aplicación de prueba de consola, pensando que era un gusano que intentaba propagarse. – Paul

+0

hola, probé esta prueba en telnet, funcionó (obtuve 220 mx.google.com ESMTP), pero cuando intento enviar correo usando la aplicación .net 2.0, obtengo 'El servidor no admite conexiones seguras. ¿Sabes? lo que está causando el problema – Smith

9

que implementa un cliente de correo electrónico hace algún tiempo que podría hablar con Gmail en tanto 587 y 465 ...

El puerto 25 es el puerto pop normal sin cifrar; 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.

+0

como se mencionó, ya tenía EnableSsl = true, vea mi código. – Paul

+0

@ user133243 Gracias por la información – prabhakaran

1

firewall de su red privada bloqueó los puertos 587 y 465. Puede utilizar el puerto por defecto 25 o habilitar allí puertos de servidor de seguridad

15

me encontré a 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 with SSL to authenticate against port 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 a los CDO (Objetos de datos de colaboración) (http://support.microsoft.com/kb/310212) directamente a través de COM usando algo como lo siguiente:

/// <summary> 
    /// Send an electronic message using the Collaboration Data Objects (CDO). 
    /// </summary> 
    /// <remarks>http://support.microsoft.com/kb/310212</remarks> 
    private void SendTestCDOMessage() 
    { 
     try 
     { 
      string yourEmail = "[email protected]"; 

      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 se olvide de navegar a través de sus referencias COM y añadir el "CDO Microsoft para Windows 200 Library "que debería agregar dos referencias: ADODB y CDO.

1

Tuve el mismo problema, pero no tuve la libertad de modificar las restricciones de firewall de mi compañía. Basado en una de las notas en this Google doc, 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).

0

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.

image to add referance

Ahora haz abajo el código 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 = "[email protected]"; 
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 = "[email protected]" 
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: Original post implícito & SMTP explícita http://help.fogcreek.com/9002/using-an-smtp-server-with-ssl utilizar el 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

Cuestiones relacionadas