2011-01-13 28 views
46

Deseo enviar un correo electrónico a través del servidor de gmail. He puesto el siguiente código pero se está atascado durante el envío. Cualquier idea, por favor ...Enviar correo electrónico usando System.Net.Mail a través de gmail

MailMessage mail = new MailMessage(); 

     mail.From = new System.Net.Mail.MailAddress("[email protected]"); 

     //create instance of smtpclient 
     SmtpClient smtp = new SmtpClient(); 
     smtp.Port = 465; 
     smtp.UseDefaultCredentials = true; 

     smtp.Host = "smtp.gmail.com";    

     smtp.EnableSsl = true; 

     //recipient address 
     mail.To.Add(new MailAddress("[email protected]")); 

     //Formatted mail body 
     mail.IsBodyHtml = true; 
     string st = "Test"; 

     mail.Body = st; 
     smtp.Send(mail); 

xxxx.com es un dominio de correo en las aplicaciones de Google. Gracias ...

+3

¿No necesita ingresar su contraseña en alguna parte para el servidor SMTP? – Mehrdad

+1

Sí, el servidor SMTP de Gmail requiere autenticación. [Enlace] (http://mail.google.com/support/bin/answer.py?hl=es&answer=13287) –

+1

Lo que dijo Lambert. Las credenciales predeterminadas están relacionadas con Windows. Debería especificarlos para GMail. – leppie

Respuesta

70
MailMessage mail = new MailMessage(); 
mail.From = new System.Net.Mail.MailAddress("[email protected]"); 

// The important part -- configuring the SMTP client 
SmtpClient smtp = new SmtpClient(); 
smtp.Port = 587; // [1] You can try with 465 also, I always used 587 and got success 
smtp.EnableSsl = true; 
smtp.DeliveryMethod = SmtpDeliveryMethod.Network; // [2] Added this 
smtp.UseDefaultCredentials = false; // [3] Changed this 
smtp.Credentials = new NetworkCredential(mail.From, "password_here"); // [4] Added this. Note, first parameter is NOT string. 
smtp.Host = "smtp.gmail.com";    

//recipient address 
mail.To.Add(new MailAddress("[email protected]")); 

//Formatted mail body 
mail.IsBodyHtml = true; 
string st = "Test"; 

mail.Body = st; 
smtp.Send(mail); 
+0

Gracias Sarwar ... Su suposición con el puerto es correcta. Voy a votar esto mañana. – JCTLK

+2

Algunas observaciones: 1. Es "smtp.gmail.com", no "smtp.google.com". Estaba mirando mi código durante media hora hasta que me di cuenta de que estaba usando el último. 2.El puerto 587 parece funcionar mucho mejor que el 465 a pesar de que todo lo demás que he leído sobre el tema me dice que use el puerto 465. 3. Si usa la verificación en dos pasos, será mejor que lo haga (vea http://www.codinghorror.com/blog/2012/04/make-your-email-hacker-proof.html) debe generar una nueva contraseña para su aplicación. –

+1

FYI, como me encontré con esto: Adjunte su objeto SmtpClient en una cláusula 'using'. Debe hacer esto especialmente si va a utilizar el cliente en un bucle. – Kyle

7

Establezca smtp.UseDefaultCredentials = falso y use smtp.Credentials = new NetworkCredential (gMailAccount, contraseña);

+0

Utilicé esta respuesta también. Pero la respuesta de Sarwar resolvió completamente mi problema. Muchas gracias y votaré esto mañana. Aclamaciones. – JCTLK

11

Probé el código C# anterior para enviar correos de Gmail a mi identificación corporativa. Al ejecutar la aplicación, el control se detuvo indefinidamente en la instrucción smtp.Send(mail);

Mientras buscaba en Google, me encontré con un code similar, que funcionó para mí. Estoy publicando ese código aquí.

class GMail 
{ 
    public void SendMail() 
    { 
     string pGmailEmail = "[email protected]"; 
     string pGmailPassword = "GmailPassword"; 
     string pTo = "ToAddress"; //[email protected] 
     string pSubject = "Test From Gmail"; 
     string pBody = "Body"; //Body 
     MailFormat pFormat = MailFormat.Text; //Text Message 
     string pAttachmentPath = string.Empty; //No Attachments 

     System.Web.Mail.MailMessage myMail = new System.Web.Mail.MailMessage(); 
     myMail.Fields.Add 
      ("http://schemas.microsoft.com/cdo/configuration/smtpserver", 
          "smtp.gmail.com"); 
     myMail.Fields.Add 
      ("http://schemas.microsoft.com/cdo/configuration/smtpserverport", 
          "465"); 
     myMail.Fields.Add 
      ("http://schemas.microsoft.com/cdo/configuration/sendusing", 
          "2"); 
     //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. 
     //When using this option you have to provide the user name and password 
     //through the sendusername and sendpassword fields. 
     //- cdoNTLM, value 2. The current process security context is used to 
     // authenticate with the service. 
     myMail.Fields.Add 
     ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1"); 
     //Use 0 for anonymous 
     myMail.Fields.Add 
     ("http://schemas.microsoft.com/cdo/configuration/sendusername", 
      pGmailEmail); 
     myMail.Fields.Add 
     ("http://schemas.microsoft.com/cdo/configuration/sendpassword", 
      pGmailPassword); 
     myMail.Fields.Add 
     ("http://schemas.microsoft.com/cdo/configuration/smtpusessl", 
      "true"); 
     myMail.From = pGmailEmail; 
     myMail.To = pTo; 
     myMail.Subject = pSubject; 
     myMail.BodyFormat = pFormat; 
     myMail.Body = pBody; 
     if (pAttachmentPath.Trim() != "") 
     { 
      MailAttachment MyAttachment = 
        new MailAttachment(pAttachmentPath); 
      myMail.Attachments.Add(MyAttachment); 
      myMail.Priority = System.Web.Mail.MailPriority.High; 
     } 

     SmtpMail.SmtpServer = "smtp.gmail.com:465"; 
     SmtpMail.Send(myMail); 
    } 
} 
+0

me funciona bien , donde otras soluciones fallan ... –

+0

¿Los campos son necesarios? – Kiquenet

0

Uso puerto número 587

Con el siguiente código, que funcionará correctamente.

MailMessage mail = new MailMessage(); 
mail.From = new MailAddress("[email protected]omain.com", "Enquiry"); 
mail.To.Add("[email protected]"); 
mail.IsBodyHtml = true; 
mail.Subject = "Registration"; 
mail.Body = "Some Text"; 
mail.Priority = MailPriority.High; 

SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587); 
//smtp.UseDefaultCredentials = true; 
smtp.Credentials = new System.Net.NetworkCredential("[email protected]", "<my gmail pwd>"); 
smtp.EnableSsl = true; 
//smtp.DeliveryMethod = SmtpDeliveryMethod.Network; 

smtp.Send(mail); 

Pero, hay un problema con el uso de gmail. El correo electrónico se enviará con éxito, pero la bandeja de entrada del destinatario tendrá la dirección de Gmail en la "dirección de origen" en lugar de la "dirección de origen" mencionada en el código.

Para resolver esto, siga los pasos mencionados en el siguiente enlace.

http://karmic-development.blogspot.in/2013/10/send-email-from-aspnet-using-gmail-as.html

antes de seguir todos los pasos anteriores, es necesario autenticar su cuenta de Gmail para permitir el acceso a la aplicación y también los dispositivos. Por favor, compruebe todos los pasos para la autenticación de cuenta en el siguiente enlace:

http://karmic-development.blogspot.in/2013/11/allow-account-access-while-sending.html

0
ActiveUp.Net.Mail.SmtpMessage smtpmsg = new ActiveUp.Net.Mail.SmtpMessage(); 
    smtpmsg.From.Email = "[email protected]"; 
    smtpmsg.To.Add(To); 
    smtpmsg.Bcc.Add("[email protected]"); 
    smtpmsg.Subject = Subject; 
    smtpmsg.BodyText.Text = Body; 

    smtpmsg.Send("mail.test.com", "[email protected]", "[email protected]", ActiveUp.Net.Mail.SaslMechanism.Login); 
+1

Algunas palabras sobre lo que su solución sería agradable. –

1

Este han trabajado para mí:

 MailMessage message = new MailMessage("[email protected]", toemail, subjectEmail, comments); 
     message.IsBodyHtml = true; 

     try { 
      SmtpClient client = new SmtpClient("smtp.gmail.com", 587); 
      client.Timeout = 2000; 
      client.EnableSsl = true; 
      client.DeliveryMethod = SmtpDeliveryMethod.Network; 
      //client.Credentials = CredentialCache.DefaultNetworkCredentials; 
      client.UseDefaultCredentials = false; 
      client.Credentials = new System.Net.NetworkCredential("[email protected]", "mypassord"); 
      client.Send(message); 

      message.Dispose(); 
      client.Dispose(); 
     } 
     catch (Exception ex) { 
      Debug.WriteLine(ex.Message); 
     } 

PERO (a partir del momento de este escrito - Oct 2017)

Debe habilitar "Permitir aplicaciones menos seguras" dentro de la opción "aplicaciones con acceso a la cuenta" en el " Mi cuenta "google security/privacy settings (https://myaccount.google.com)

Cuestiones relacionadas