JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Cómo enviar correo electrónico por código usando cuentas de GMail

Nota: para que esto funcione debes habilitar en tu cuenta de Google el ajuste "Permitir aplicaciones menos seguras" o te dará un error. Si quieres ver en detalle cómo hacer esto o si te interesa mejor cómo enviar correo a través de GMail usando Java, lee este otro artículo.

Enviar correo electrónico desde código .NET usando un servidor SMTP es muy fácil gracias al uso de la clase System.Net.Mail.MailMessage.

Un servidor SMTP normal trabaja a través del puerto 25 y sólo necesitaremos tener unas credenciales válidas en el mismoq ue nos permitan enviar correo. Lo habitual en una aplicación cualquiera es usar el servidor SMTP de nuestra cuenta de correo favorito con esta técnica sin problemas.

Pero ¿qué pasa si nuestra cuenta de correo es de GMail? Pues que la técnica convencional no funcionará. El motivo es que GMail usa un puerto diferente y además precisa el uso de una conexión cifrada con SSL para seguridad, por lo que el código normal que vas a encontrar por ahí no te servirá.

¿Qué puedo hacer entonces?

La clase SmtpClient nos ayudará para conseguirlo. Básicamente se trata de indicarle un par de parámetros extra para indicar el puerto a utilizar y la obligatoriedad de SSL. Lo demás lo hará esta clase por nosotros.

El siguiente código en C# ilustra un ejemplo de cómo enviar un correo de prueba a través de GMail usando una aplicación de consola:

using System;
using System.Collections;
using System.Net;
using System.Net.Mail;
using System.Net.Mime;

public class EjemploCorreoGMail
{
    public static void Main()
    {
            System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();
            msg.To.Add("[email protected]");
            msg.From = new MailAddress("[email protected]", "Tu Nombre", System.Text.Encoding.UTF8);
            msg.Subject = "Prueba de correo a GMail";
            msg.SubjectEncoding = System.Text.Encoding.UTF8;
            msg.Body = "Cuerpo del mensaje";
            msg.BodyEncoding = System.Text.Encoding.UTF8;
            msg.IsBodyHtml = false

            //Aquí es donde se hace lo especial
            SmtpClient client = new SmtpClient();
            client.Credentials = new System.Net.NetworkCredential("[email protected]", "miclave");
            client.Port = 587;
            client.Host = "smtp.gmail.com";
            client.EnableSsl = true; //Esto es para que vaya a través de SSL que es obligatorio con GMail
            try
            {
                        client.Send(msg);
            }
            catch (System.Net.Mail.SmtpException ex)
            {
                        Console.WriteLine(ex.Message);
                        Console.ReadLine();
            }
    }
}

 

José Manuel Alarcón José Manuel Alarcón
Fundador de campusMVP.es, el proyecto de referencia en formación on-line para programadores en lengua española. Autor de varios libros y cientos de artículos. Galardonado como MVP de Microsoft desde 2004. Gallego de Vigo, amante de la ciencia y la tecnología, la música y la lectura. Ayudando a la gente en Internet desde 1996.
Descarga GRATIS mi último libro (no técnico): "Tres Monos, Diez Minutos".
Banner

Comentarios (22) -

Y mi pregunta es... Y para hacerlo con el equipo local? Con el antiguo namespace System.Web.Mail se podía hacer sin tener que configurar un SMTP remoto...

¿Sabes como?

Saludos

Responder

Es que realmente la cosa no tiene que ver con lo anterior.

De todos modos para enviar con el equipo local es el mismo código pero usando la IP 127.0.0.1 y el puerto normal (25), sin SSL.

Eso sí, hay que asegurarse de tener los permisos adecuados para poder enviar en local. Normalmente no será necesario pasarle credenciales si dejas hacer relaying desde la IP local.

Saludos

JM.

Responder

Sipi, no lo recuerdo de memoria pero si te vas a los ajustes y preferencias de GMail te lo dice.

Saludos

JM

Responder

me funciona cuando envio imagenes pequeñas adjuntas, pero cuando son pesadas me sale un mensaje
tiempo de espera agotado

Responder

Muy buen aporte, estoy dando mis primeros pasos y me fue muy util la clase

Saludos!

Responder

Buenos día tengo una duda, estoy usando el código y no me da error pero el correo no llega al destinatario, estoy trabajando con asp de manera local en mi maquina sabrá porque pasa eso?
Muchas Gracias.

Responder

Spain José M. Alarcón

¿Has mirado si lo tienes en la carpeta de Spam del destinatario?

Muchos filtros anti-spam bloquean correos enviados desde conexiones dinámicas, ADSL, etc...

Saludos,

Responder

No debería, yo uso el mismo código y me ha funcionado perfectamente. Fijate si no estan llegando al spam. Saludos!

Responder

Colombia Johann Alexander Quintero

Muchas gracias por el aporte. Muy, pero muy util!!!

Responder

Raul Montes

Hola José Manuel
Tengo un programa de gmail que con Windows 7 y Word me funcionaba bien. Ahora el problema es qhe tengo Windows 10 y OpenOffice y no funciona. He visto los comentarios que hace al inicio sobre cambiar el puerto y he cambiado los dos parámetros :
                                              "smtpServer.Port = 25 " y  "smtpServer.Host = "IP 127.0.0.1"

Y ahora me da error al hacer el "Send". ¿Puede ser que lo que estoy tratando de enviar son documentos extensión "odt"?
      

Responder

by Jose M. Alarcon

Hola Raúl:

El cambio de sistema operativo no te tiene que influir en nada. Es un tema de configuración seguro. No te puedo ayudar mucho con esto más que con lo que cuento en el artículo. Trata de configurar bien GMail para permitir el envío tal y como se explica en los enlaces de la nota del principio del artículo.

Suerte.

Responder

Raul Montes

Gracias José Manuel por tu rápida respuesta. De todas formas te mando el código que yo tengo y me gustaría probar el tuyo pero yo trabajo con visual Studio.

    Private Sub messageSenderCode()
        Try
            Dim smtpServer As New SmtpClient()
            Dim mail As New MailMessage()
            'Username & Password to connect to the sending account (Gmail account)
            smtpServer.Credentials = New Net.NetworkCredential(txtUsername.Text, txtPassword.Text)
            smtpServer.Port = 25  'the gmail's port number
            smtpServer.Host = "IP 127.0.0.1"
            smtpServer.EnableSsl = True        'SSL Checker setn to true
            mail = New MailMessage()
            mail.From = New MailAddress(txtUsername.Text)
            mail.To.Add(txtEmail.Text)
            mail.Subject = txtSubject.Text  'setting the message subject
            mail.Body = txtMessage.Text     'setting the body of the message
            smtpServer.Send(mail)     ' linea de error
            MsgBox("Mail Sent to" & "--" & txtEmail.Text, ) 'this confirms that the message has been sent successfully
        Catch ex As Exception
            MsgBox(ex.Message) ' this code will throw an error if the code does not run successfully
        End Try
    End Sub

Muchas gracias y un saludo

Responder

by Jose M. Alarcon

Yo también trabajo con Visual Studio ¿Te refieres a Visual Basic?

En ese caso la respuesta es la misma: el código es exactamente el mismo. En el tuyo estás apuntando a la dirección de tu equipo local (127.0.0.1) y al puerto 25. Si eso ,tal cual, te funcionaba antes y ahora no,  es porque tenías un servidor local de correo para poder enviar instalado en tu máquina (algo muy poco recomendable por otra parte: la entregabilidad será nula y no llegarán la mayor parte de los correos).

Si quieres entregar usando GMail tienes que configurarlo correctamente (enlace del la nota del principio) y tienes que poner la dirección de GMail ("smtp.gmail.com" en lugar de "127.0.0.1") y el puerto a usar es el 587 (no el 25). Con eso ya tendría que funcionarte, obviamente poniendo la dirección y la clave de GMail en tus controles d ela interfaz de usuario, que como veo en tu código se llaman txtUsername y txtPassword.

Si quieres traducir código de C# a VB.NET puedes usar un "traductor" como este: http://converter.telerik.com

Y en cuanto puedas mi recomendación sería que dejases de lado VB.NET y aprendieses C# cuanto antes, por los motivos expuestos aquí: www.campusmvp.es/.../...enguaje-debo-aprender.aspx y porque desde este año aún será peor porque Microsoft ha dicho que ya no van a mantener paralelos en capacidades a ambos lenguajes, por lo que VB.NET a medio plazo se hundirá en la miseria.

Saludos.

Responder

Raul Montes

Gracias por esta información pues es la segunda comunicación que me dan. La primera ha sido Java, parece ser que ha aparecido un agujero bastante grave  en web y no tiene intención de arreglarlo y lo dejaran morir poco a poco y me fastidia porque llevo cuatro meses aprendiendo Java y ahora me dices esto de Visual Studio con lo contento que estoy con la versión 2017 y empezar otra vez me fastidia porque tengo un montón de librerías que he ido haciendo durante este último año. Así que la pregunta de rigor es si el C# es tan asequible como el Visual.

Gracia y un saludo

Responder

by Jose M. Alarcon

De lo de Java no sé nada y me extraña, pues suelo estar muy al tanto de esto. De todos modos no creo que sea así: Java siempre ha tenido muchos problemas de seguridad y algunos han tardado mucho en parchearlos, pero no creo que haya intención de dejar algo muy grave sin parche, ni desde luego el lenguaje está en peligro. De hecho es una de las apuestas más firmes a la hora de aprender programación, pues tiene una demanda laboral brutal.

En cuanto a C# y VB, para mi es una cuestión casi de gustos. Lo importante no es el lenguaje sino la plataforma, y ésta es igual para ambos lenguajes. Lo otro es "cosmética" y poco más. Ahora bien, por todo lo que explico en el artículo que te enlacé antes, mi consejo sería que aprendieses C# y dejases paulatinamente VB.NET. Todas las bibliotecas que hayas hecho en VB.NET hasta ahora las puedes utilizar sin problema desde C# ya que son compatibles. Date cuenta de que lo que hay por debajo en cualquier caso es la plataforma .NET y si usas tipos compatibles con el CLR (que es lo más probable) entonces es compatible con cualquiera de los lenguajes de .NET.

Si me permites una pequeña cuña publicitaria, si quieres aprender bien C# tenemos un par de cursos estupendos en campusMVP:

- www.campusmvp.es/.../...a-plataforma-.NET_204.aspx
- www.campusmvp.es/.../...a-Plataforma-.NET_222.aspx (mejor este: mucho más completo)

Saludos!

Responder

Hola  te felicito por tus conocimientos  y dedicacion ... tengo una consulta acerca del codigo para envio de emails, el cual me funciona perfecto en mi casa, sin embargo lo instalo en otro lugar (una empresa) y no funciona. sera por bloqueo de puertos ?

Responder

by Jose M. Alarcon

Pues seguramente. Tienes que preguntar al administrador de red.

Responder

Veo que respondes a las consultas. Tengo una consulta, lo esoty haciendo tal cual tu ejemplo, pero al momento del SEND me vota este error: "El servidor SMTP requiere una conexión segura o el cliente no se autenticó. La respuesta del servidor fue: 5.5.1. .....". Pero desde yá te digo que la contraseña u usuario son los correctos. Llevo ya mas de dos semanas con esto y lo hallo la solución. Muchas gracias por tu ayuda de antemano.

Responder

by Jose M. Alarcon

Hola:

La respuesta la tienes en la nota del principio del artículo. Debes activar lo que te indica ahí. Si lees el otro artículo al que hace referencia (que es sobre Java, pero es idéntico en lo que a esto respecta) verás la solución a ese error exactamente.

Saludos.

Responder

Buenas tardes,  me ayudó bastante este foro; sin embargo a mi me da el error de "No es posible conectar con el escritorio remoto"

Si podrían ayudarme.
Muchas gracias

Responder

Por otro lado comentar que verifique que la opción Acceso a aplicaciones poco seguras este encendido...
no me explico porque me da ese error , si pueden ayudarme

Responder

Este es mi codigo
public static void sendMailSsl(string mailDestino, string mailAsunto, string mailMsj)
        {
            try
            {
                using (MailMessage mm = new MailMessage())
                {
                    mm.Subject = mailAsunto;
                    mm.From = new MailAddress("[email protected]", "INE");
                    mm.Body = mailMsj;
                    mm.To.Add(mailDestino);
                    mm.IsBodyHtml = true;
                    SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587);
                    smtp.EnableSsl = true;
                    NetworkCredential NetworkCred = new NetworkCredential("[email protected]", "in5678");
                    smtp.UseDefaultCredentials = true;
                    smtp.Credentials = NetworkCred;
                    smtp.Timeout = 600000;
                    smtp.Send(mm);
                }
            }
            catch (Exception exp)
        
                WriteLog(exp.Message);
                WriteLog(exp.StackTrace);
            }

        }

y este es un fragmento del archivo LOG
6/3/2019 18:40:01 ==> Error al enviar correo.
6/3/2019 18:40:01 ==>    en System.Net.Mail.SmtpClient.Send(MailMessage message)
   en SendMail.Program.sendMailSsl(String mailDestino, String mailAsunto, String mailMsj) en D:\ACERDATA\SISTEMAS_INFORMATICOS_2015\SendMail\SendMail\SendMail\Program.cs:línea 87
6/3/2019 18:40:22 ==> Error al enviar correo.
6/3/2019 18:40:22 ==>    en System.Net.Mail.SmtpClient.Send(MailMessage message)
   en SendMail.Program.sendMailSsl(String mailDestino, String mailAsunto, String mailMsj) en D:\ACERDATA\SISTEMAS_INFORMATICOS_2015\SendMail\SendMail\SendMail\Program.cs:línea 87

Responder

Pingbacks and trackbacks (1)+

Agregar comentario