Envío de correo electrónico en .NET a través de Gmail

876

En lugar de confiar en mi host para enviar un correo electrónico, estaba pensando en enviar los mensajes de correo electrónico utilizando mi cuenta de Gmail . Los correos electrónicos son correos electrónicos personalizados a las bandas que toco en mi programa.

¿Es posible hacer lo?

Mike Wills
fuente
1
< systemnetmail.com > es probablemente el sitio más absurdamente completo dedicado a un solo espacio de nombres .NET ... pero tiene TODO lo que pueda desear saber sobre el envío de correo a través de .NET, ya sea ASP.NET o Desktop. < systemwebmail.com > era la URL original en la publicación, pero no debe usarse para .NET 2.0 y versiones posteriores.
Adam Haile
13
Si está utilizando ASP.Net Mvc, recomendaría echar un vistazo a MvcMailer: github.com/smsohan/MvcMailer/wiki/MvcMailer-Step-by-Step-Guide
noocyte
Tengo un buen ejemplo de cómo hacer esto en mi sitio jarloo.com/gmail-in-c
Kelly
¿Cómo enviar un archivo usando este código?
Ranadheer Reddy

Respuestas:

1065

Asegúrese de usar System.Net.Mail, no el obsoleto System.Web.Mail. Hacer SSL con System.Web.Mailes un desastre de extensiones hacky.

using System.Net;
using System.Net.Mail;

var fromAddress = new MailAddress("[email protected]", "From Name");
var toAddress = new MailAddress("[email protected]", "To Name");
const string fromPassword = "fromPassword";
const string subject = "Subject";
const string body = "Body";

var smtp = new SmtpClient
{
    Host = "smtp.gmail.com",
    Port = 587,
    EnableSsl = true,
    DeliveryMethod = SmtpDeliveryMethod.Network,
    UseDefaultCredentials = false,
    Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
};
using (var message = new MailMessage(fromAddress, toAddress)
{
    Subject = subject,
    Body = body
})
{
    smtp.Send(message);
}
Domenic
fuente
49
Aún puede obtener errores de usuario no conectado si Google simplemente decide que ha enviado demasiados en los últimos xx minutos. Siempre debe agregar un trySend, si los errores duermen un rato, y luego intentar nuevamente.
Jason Short
72
Nota interesante: si intercambia 'UseDefaultCredentials = false' y 'Credentials = ...' no se autenticará.
Nathan Wheeler
13
No hay problemas con SPF usando este método. Cada cliente de correo electrónico se puede configurar para hacer exactamente esto. Es posible que tenga problemas si usa su propio servidor (es decir, algo más que smtp.gmail.com) con [email protected]como remitente. Por cierto: smtp.gmail.comsobrescribe automáticamente la dirección del remitente si no es tuya.
Meinersbur
24
Estaba teniendo dificultades para que esto funcionara incluso con varios ajustes. Como se sugirió en una publicación relacionada, descubrí que en realidad era mi antivirus el que impedía que los correos electrónicos se enviaran con éxito. El antivirus en cuestión es McAffee, y su "Protección de acceso" tiene una categoría de "Protección estándar antivirus" que tiene la regla "Evitar que los gusanos de correo masivo envíen correos electrónicos". ¡Ajustar / deshabilitar esa regla hizo que este código funcionara para mí!
yourbuddypal
18
Recibí el mensaje de error 5.5.1 Autenticación requerida hasta que me di cuenta de que estaba probando con una cuenta (mi cuenta personal) que tenía activada la autenticación de dos factores. Una vez que usé una cuenta que no tenía eso, funcionó bien. También podría haber generado una contraseña para mi aplicación que estaba probando en mi cuenta personal, pero no quería hacerlo.
Nick DeVore
153

La respuesta anterior no funciona. Debe configurarlo DeliveryMethod = SmtpDeliveryMethod.Networko volverá con un error "el cliente no se autenticó ". Además, siempre es una buena idea poner un tiempo de espera.

Código revisado:

using System.Net.Mail;
using System.Net;

var fromAddress = new MailAddress("[email protected]", "From Name");
var toAddress = new MailAddress("[email protected]", "To Name");
const string fromPassword = "password";
const string subject = "test";
const string body = "Hey now!!";

var smtp = new SmtpClient
{
    Host = "smtp.gmail.com",
    Port = 587,
    EnableSsl = true,
    DeliveryMethod = SmtpDeliveryMethod.Network,
    Credentials = new NetworkCredential(fromAddress.Address, fromPassword),
    Timeout = 20000
};
using (var message = new MailMessage(fromAddress, toAddress)
{
    Subject = subject,
    Body = body
})
{
    smtp.Send(message);
}
Donny V.
fuente
3
Interesante; Funciona en mi máquina (TM). Pero como esto parece plausible, lo agregaré a mi respuesta.
Domenic
3
Hmm, supongo que SmtpDeliveryMethod.Network es el predeterminado, pero tal vez el predeterminado se cambia cuando se ejecuta en IIS --- ¿era eso lo que estabas haciendo?
Domenic
3
Estoy usando el mismo código en la aplicación de consola, es a través del error "
Karthikeyan P
55
Esta respuesta no funciona. Por favor, mire la pregunta stackoverflow.com/questions/34851484/…
110

Para que las otras respuestas funcionen "desde un servidor", primero active el acceso para aplicaciones menos seguras en la cuenta de gmail.

Parece que Google recientemente cambió su política de seguridad. La respuesta mejor calificada ya no funciona hasta que cambie la configuración de su cuenta como se describe aquí: https://support.google.com/accounts/answer/6010255?hl=es-ESingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

A partir de marzo de 2016, Google cambió la ubicación de configuración nuevamente.

Software BCS
fuente
44
Esto funcionó para mí. Y también es preocupante. No estoy seguro de querer desactivar esa seguridad. Puede que tenga que repensar ...
Sully
44
Desde el punto de vista de la seguridad, es mejor activar la verificación en dos pasos y luego generar y usar la contraseña de la aplicación. Consulte ¿Cómo enviar un correo electrónico en .Net de acuerdo con las nuevas políticas de seguridad?
Michael Freidgeim
2
@BCS Software, en mi programa, el usuario inserta cualquier correo electrónico que mi programa tenga que usar para enviar el mensaje. Entonces, ¿cómo puedo hacer que el usuario del correo electrónico pueda enviar el correo electrónico incluso si la autenticación de 2 factores está activada?
Alaa
Esta es la misma configuración que debe modificar si desea utilizar un cliente de Microsoft Outlook (en una computadora de escritorio, teléfono móvil, etc.) para enviar / recibir correos electrónicos a través de GMail de Google.
Brett Rigby
41

Esto es para enviar correos electrónicos con archivos adjuntos. Simple y breve.

fuente: http://coding-issues.blogspot.in/2012/11/sending-email-with-attachments-from-c.html

using System.Net;
using System.Net.Mail;

public void email_send()
{
    MailMessage mail = new MailMessage();
    SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
    mail.From = new MailAddress("your [email protected]");
    mail.To.Add("[email protected]");
    mail.Subject = "Test Mail - 1";
    mail.Body = "mail with attachment";

    System.Net.Mail.Attachment attachment;
    attachment = new System.Net.Mail.Attachment("c:/textfile.txt");
    mail.Attachments.Add(attachment);

    SmtpServer.Port = 587;
    SmtpServer.Credentials = new System.Net.NetworkCredential("your [email protected]", "your password");
    SmtpServer.EnableSsl = true;

    SmtpServer.Send(mail);

}
Ranadheer Reddy
fuente
21

Google puede bloquear los intentos de inicio de sesión de algunas aplicaciones o dispositivos que no utilizan estándares de seguridad modernos. Dado que estas aplicaciones y dispositivos son más fáciles de ingresar, bloquearlos ayuda a mantener su cuenta más segura.

Algunos ejemplos de aplicaciones que no son compatibles con los últimos estándares de seguridad incluyen:

  • La aplicación Mail en tu iPhone o iPad con iOS 6 o inferior
  • La aplicación Mail en su teléfono con Windows anterior a la versión 8.1
  • Algunos clientes de correo de escritorio como Microsoft Outlook y Mozilla Thunderbird

Por lo tanto, debe habilitar el inicio de sesión menos seguro en su cuenta de Google.

Después de iniciar sesión en la cuenta de Google, vaya a:

https://myaccount.google.com/lesssecureapps
o
https://www.google.com/settings/security/lesssecureapps

En C #, puede usar el siguiente código:

using (MailMessage mail = new MailMessage())
{
    mail.From = new MailAddress("[email protected]");
    mail.To.Add("[email protected]");
    mail.Subject = "Hello World";
    mail.Body = "<h1>Hello</h1>";
    mail.IsBodyHtml = true;
    mail.Attachments.Add(new Attachment("C:\\file.zip"));

    using (SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587))
    {
        smtp.Credentials = new NetworkCredential("[email protected]", "password");
        smtp.EnableSsl = true;
        smtp.Send(mail);
    }
}
mjb
fuente
16

Aquí está mi versión: " Enviar correo electrónico en C # usando Gmail ".

using System;
using System.Net;
using System.Net.Mail;

namespace SendMailViaGmail
{
   class Program
   {
   static void Main(string[] args)
   {

      //Specify senders gmail address
      string SendersAddress = "[email protected]";
      //Specify The Address You want to sent Email To(can be any valid email address)
      string ReceiversAddress = "[email protected]";
      //Specify The password of gmial account u are using to sent mail(pw of [email protected])
      const string SendersPassword = "Password";
      //Write the subject of ur mail
      const string subject = "Testing";
      //Write the contents of your mail
      const string body = "Hi This Is my Mail From Gmail";

      try
      {
        //we will use Smtp client which allows us to send email using SMTP Protocol
        //i have specified the properties of SmtpClient smtp within{}
        //gmails smtp server name is smtp.gmail.com and port number is 587
        SmtpClient smtp = new SmtpClient
        {
           Host = "smtp.gmail.com",
           Port = 587,
           EnableSsl = true,
           DeliveryMethod = SmtpDeliveryMethod.Network,
           Credentials    = new NetworkCredential(SendersAddress, SendersPassword),
           Timeout = 3000
        };

        //MailMessage represents a mail message
        //it is 4 parameters(From,TO,subject,body)

        MailMessage message = new MailMessage(SendersAddress, ReceiversAddress, subject, body);
        /*WE use smtp sever we specified above to send the message(MailMessage message)*/

        smtp.Send(message);
        Console.WriteLine("Message Sent Successfully");
        Console.ReadKey();
     }

     catch (Exception ex)
     {
        Console.WriteLine(ex.Message);
        Console.ReadKey();
     }
    }
   }
 }
tehie
fuente
8
Si bien su artículo puede responder la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia. Stack Overflow solo es tan útil como sus preguntas y respuestas, y si el host de su blog deja de funcionar o sus URL se mueven, esta respuesta se vuelve inútil. ¡Gracias!
sarnold
14

Espero que este código funcione bien. Puedes intentarlo.

// Include this.                
using System.Net.Mail;

string fromAddress = "[email protected]";
string mailPassword = "*****";       // Mail id password from where mail will be sent.
string messageBody = "Write the body of the message here.";


// Create smtp connection.
SmtpClient client = new SmtpClient();
client.Port = 587;//outgoing port for the mail.
client.Host = "smtp.gmail.com";
client.EnableSsl = true;
client.Timeout = 10000;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Credentials = new System.Net.NetworkCredential(fromAddress, mailPassword);


// Fill the mail form.
var send_mail = new MailMessage();

send_mail.IsBodyHtml = true;
//address from where mail will be sent.
send_mail.From = new MailAddress("[email protected]");
//address to which mail will be sent.           
send_mail.To.Add(new MailAddress("[email protected]");
//subject of the mail.
send_mail.Subject = "put any subject here";

send_mail.Body = messageBody;
client.Send(send_mail);
Premdeep Mohanty
fuente
2
mensaje send_mail = nuevo MailMessage (); ¿Cómo se supone que funciona esta línea? No puede convertir implícitamente 'System.Net.Mail.MailMessage' a 'System.Windows.Forms.Message'
Debaprasad
9

Incluye esto,

using System.Net.Mail;

Y entonces,

MailMessage sendmsg = new MailMessage(SendersAddress, ReceiversAddress, subject, body); 
SmtpClient client = new SmtpClient("smtp.gmail.com");

client.Port = Convert.ToInt16("587");
client.Credentials = new System.Net.NetworkCredential("[email protected]","password");
client.EnableSsl = true;

client.Send(sendmsg);
GOPI
fuente
8

Fuente : Enviar correo electrónico en ASP.NET C #

A continuación se muestra un código de trabajo de muestra para enviar un correo usando C #, en el siguiente ejemplo estoy usando el servidor smtp de google.

El código se explica por sí mismo, reemplace el correo electrónico y la contraseña con sus valores de correo electrónico y contraseña.

public void SendEmail(string address, string subject, string message)
{
    string email = "[email protected]";
    string password = "put-your-GMAIL-password-here";

    var loginInfo = new NetworkCredential(email, password);
    var msg = new MailMessage();
    var smtpClient = new SmtpClient("smtp.gmail.com", 587);

    msg.From = new MailAddress(email);
    msg.To.Add(new MailAddress(address));
    msg.Subject = subject;
    msg.Body = message;
    msg.IsBodyHtml = true;

    smtpClient.EnableSsl = true;
    smtpClient.UseDefaultCredentials = false;
    smtpClient.Credentials = loginInfo;
    smtpClient.Send(msg);
}
Yasser Shaikh
fuente
En lugar de var, he usado un nombre de clase como NetworkCredential, MailMessage y SmtpClient. Funciona para mí.
Jui Test
7

Si desea enviar un correo electrónico de fondo, haga lo siguiente

 public void SendEmail(string address, string subject, string message)
 {
 Thread threadSendMails;
 threadSendMails = new Thread(delegate()
    {

      //Place your Code here 

     });
  threadSendMails.IsBackground = true;
  threadSendMails.Start();
}

y agregar espacio de nombres

using System.Threading;
RAJESH KUMAR
fuente
5

Prueba esto,

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            MailMessage mail = new MailMessage();
            SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");

            mail.From = new MailAddress("[email protected]");
            mail.To.Add("to_address");
            mail.Subject = "Test Mail";
            mail.Body = "This is for testing SMTP mail from GMAIL";

            SmtpServer.Port = 587;
            SmtpServer.Credentials = new System.Net.NetworkCredential("username", "password");
            SmtpServer.EnableSsl = true;

            SmtpServer.Send(mail);
            MessageBox.Show("mail Send");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
Solución de software Trimantra
fuente
4

usar de esta manera

MailMessage sendmsg = new MailMessage(SendersAddress, ReceiversAddress, subject, body); 
SmtpClient client = new SmtpClient("smtp.gmail.com");

client.Port = Convert.ToInt32("587");
client.EnableSsl = true;
client.Credentials = new System.Net.NetworkCredential("[email protected]","MyPassWord");
client.Send(sendmsg);

No olvides esto:

using System.Net;
using System.Net.Mail;
alireza amini
fuente
4

Para evitar problemas de seguridad en Gmail, primero debe generar una contraseña de aplicación desde su configuración de Gmail y puede usar esta contraseña en lugar de una contraseña real para enviar un correo electrónico, incluso si usa la verificación en dos pasos.

Sayed Uz Zaman
fuente
3

Cambio de remitente en el correo electrónico de Gmail / Outlook.com:

Para evitar la suplantación de identidad: Gmail / Outlook.com no le permitirá enviar desde un nombre de cuenta de usuario arbitrario.

Si tiene un número limitado de remitentes, puede seguir estas instrucciones y luego configurar el Fromcampo a esta dirección: Enviar correo desde una dirección diferente

Si desea enviar desde una dirección de correo electrónico arbitraria (como un formulario de comentarios en el sitio web donde el usuario ingresa su correo electrónico y no desea que le envíen correos electrónicos directamente), lo mejor que puede hacer es:

        msg.ReplyToList.Add(new System.Net.Mail.MailAddress(email, friendlyName));

Esto le permitiría presionar 'responder' en su cuenta de correo electrónico para responder al fanático de su banda en una página de comentarios, pero no recibirían su correo electrónico real, lo que probablemente generaría una tonelada de correo no deseado.

Si está en un entorno controlado, esto funciona muy bien, pero tenga en cuenta que he visto que algunos clientes de correo electrónico envían a la dirección de origen incluso cuando se especifica la respuesta (no sé cuál).

Simon_Weaver
fuente
3

Tuve el mismo problema, pero se resolvió yendo a la configuración de seguridad de gmail y Permitiendo aplicaciones menos seguras . El Código de Domenic & Donny funciona, pero solo si habilitó esa configuración

Si ha iniciado sesión (en Google), puede seguir este enlace y alternar "Activar" para "Acceso para aplicaciones menos seguras"

DarkPh03n1X
fuente
3
using System;
using System.Net;
using System.Net.Mail;

namespace SendMailViaGmail
{
   class Program
   {
   static void Main(string[] args)
   {

      //Specify senders gmail address
      string SendersAddress = "[email protected]";
      //Specify The Address You want to sent Email To(can be any valid email address)
      string ReceiversAddress = "[email protected]";
      //Specify The password of gmial account u are using to sent mail(pw of [email protected])
      const string SendersPassword = "Password";
      //Write the subject of ur mail
      const string subject = "Testing";
      //Write the contents of your mail
      const string body = "Hi This Is my Mail From Gmail";

      try
      {
        //we will use Smtp client which allows us to send email using SMTP Protocol
        //i have specified the properties of SmtpClient smtp within{}
        //gmails smtp server name is smtp.gmail.com and port number is 587
        SmtpClient smtp = new SmtpClient
        {
           Host = "smtp.gmail.com",
           Port = 587,
           EnableSsl = true,
           DeliveryMethod = SmtpDeliveryMethod.Network,
           Credentials = new NetworkCredential(SendersAddress, SendersPassword),
           Timeout = 3000
        };

        //MailMessage represents a mail message
        //it is 4 parameters(From,TO,subject,body)

        MailMessage message = new MailMessage(SendersAddress, ReceiversAddress, subject, body);
        /*WE use smtp sever we specified above to send the message(MailMessage message)*/

        smtp.Send(message);
        Console.WriteLine("Message Sent Successfully");
        Console.ReadKey();
     }
     catch (Exception ex)
     {
        Console.WriteLine(ex.Message);
        Console.ReadKey();
     }
}
}
}
Moin Shirazi
fuente
2

Aquí hay un método para enviar correo y obtener credenciales de web.config:

public static string SendEmail(string To, string Subject, string Msg, bool bodyHtml = false, bool test = false, Stream AttachmentStream = null, string AttachmentType = null, string AttachmentFileName = null)
{
    try
    {
        System.Net.Mail.MailMessage newMsg = new System.Net.Mail.MailMessage(System.Configuration.ConfigurationManager.AppSettings["mailCfg"], To, Subject, Msg);
        newMsg.BodyEncoding = System.Text.Encoding.UTF8;
        newMsg.HeadersEncoding = System.Text.Encoding.UTF8;
        newMsg.SubjectEncoding = System.Text.Encoding.UTF8;

        System.Net.Mail.SmtpClient smtpClient = new System.Net.Mail.SmtpClient();
        if (AttachmentStream != null && AttachmentType != null && AttachmentFileName != null)
        {
            System.Net.Mail.Attachment attachment = new System.Net.Mail.Attachment(AttachmentStream, AttachmentFileName);
            System.Net.Mime.ContentDisposition disposition = attachment.ContentDisposition;
            disposition.FileName = AttachmentFileName;
            disposition.DispositionType = System.Net.Mime.DispositionTypeNames.Attachment;

            newMsg.Attachments.Add(attachment);
        }
        if (test)
        {
            smtpClient.PickupDirectoryLocation = "C:\\TestEmail";
            smtpClient.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.SpecifiedPickupDirectory;
        }
        else
        {
            //smtpClient.EnableSsl = true;
        }

        newMsg.IsBodyHtml = bodyHtml;
        smtpClient.Send(newMsg);
        return SENT_OK;
    }
    catch (Exception ex)
    {

        return "Error: " + ex.Message
             + "<br/><br/>Inner Exception: "
             + ex.InnerException;
    }

}

Y la sección correspondiente en web.config:

<appSettings>
    <add key="mailCfg" value="[email protected]"/>
</appSettings>
<system.net>
  <mailSettings>
    <smtp deliveryMethod="Network" from="[email protected]">
      <network defaultCredentials="false" host="mail.exapmple.com" userName="[email protected]" password="your_password" port="25"/>
    </smtp>
  </mailSettings>
</system.net>
iTURTEV
fuente
2

Prueba este

public static bool Send(string receiverEmail, string ReceiverName, string subject, string body)
{
        MailMessage mailMessage = new MailMessage();
        MailAddress mailAddress = new MailAddress("[email protected]", "Sender Name"); // [email protected] = input Sender Email Address 
        mailMessage.From = mailAddress;
        mailAddress = new MailAddress(receiverEmail, ReceiverName);
        mailMessage.To.Add(mailAddress);
        mailMessage.Subject = subject;
        mailMessage.Body = body;
        mailMessage.IsBodyHtml = true;

        SmtpClient mailSender = new SmtpClient("smtp.gmail.com", 587)
        {
            EnableSsl = true,
            UseDefaultCredentials = false,
            DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network,
            Credentials = new NetworkCredential("[email protected]", "pass")   // [email protected] = input sender email address  
                                                                           //pass = sender email password
        };

        try
        {
            mailSender.Send(mailMessage);
            return true;
        }
        catch (SmtpFailedRecipientException ex)
        { 
          // Write the exception to a Log file.
        }
        catch (SmtpException ex)
        { 
           // Write the exception to a Log file.
        }
        finally
        {
            mailSender = null;
            mailMessage.Dispose();
        }
        return false;
}
reza.cse08
fuente
1

El problema para mí fue que mi contraseña tenía una barra negra "\" , que copié pegada sin darme cuenta de que causaría problemas.

Satbir Kira
fuente
1

Al copiar desde otra respuesta , los métodos anteriores funcionan, pero gmail siempre reemplaza el correo electrónico "de" y "responder a" con la cuenta real de envío de gmail. aparentemente hay una solución alternativa sin embargo:

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

"3. En la pestaña Cuentas, haga clic en el enlace" Agregue otra dirección de correo electrónico que posea "y luego verifíquela"

O posiblemente esto

Actualización 3: el lector Derek Bennett dice: "La solución es ingresar a la configuración de gmail: Cuentas y" Establecer como predeterminado "una cuenta que no sea su cuenta de gmail. Esto hará que gmail reescriba el campo De con cualquier correo electrónico de la cuenta predeterminada La dirección es."

rogerdpack
fuente
1

Puedes intentarlo Mailkit. Le brinda una funcionalidad mejor y avanzada para enviar correo. Puedes encontrar más de esto Aquí hay un ejemplo

    MimeMessage message = new MimeMessage();
    message.From.Add(new MailboxAddress("FromName", "[email protected]"));
    message.To.Add(new MailboxAddress("ToName", "[email protected]"));
    message.Subject = "MyEmailSubject";

    message.Body = new TextPart("plain")
    {
        Text = @"MyEmailBodyOnlyTextPart"
    };

    using (var client = new SmtpClient())
    {
        client.Connect("SERVER", 25); // 25 is port you can change accordingly

        // Note: since we don't have an OAuth2 token, disable
        // the XOAUTH2 authentication mechanism.
        client.AuthenticationMechanisms.Remove("XOAUTH2");

        // Note: only needed if the SMTP server requires authentication
        client.Authenticate("YOUR_USER_NAME", "YOUR_PASSWORD");

        client.Send(message);
        client.Disconnect(true);
    }
Naveen
fuente