Enviar correo desde Visual Basic .Net – Usando System.Net.Mail.MailMessage


En .Net existen muchas clases que nos facilitan la vida y nos permiten hacer código más legible, de igual manera pasa con el envió de correo.
Para poder utilizar el envió de correo con .Net necesitamos utilizar los siguientes namespace:

-	System.Net.Mail
-	System.Net

En el siguiente ejemplo quiero mostrarles una pequeña aplicación de escritorio en donde aplico un sistema básico de envió de correo:

Básicamente la interfaz nos permite ingresar los valores básicos para enviar un correo
– Servidor SMTP – Servidor de donde se enviara el correo
– Puerto – Puerto por el cual se conectara al servidor
– Usuario — Usuario para conectarse al servidor SMTP
– Contraseña — Contraseña para conectarse al servidor SMTP
– Para – A quien se le enviara el correo
– Asunto – El asunto del correo
– Contenido: Lo que llevara el correo
Bueno básicamente lo que hacemos es crear un método para hacer un poco más ordenados, capturamos en una variable cada uno de los valores ingresados a la aplicación:

Dim SMTP As String = txtSMTP.Text
Dim Usuario As String = txtUsuario.Text
Dim Contraseña As String = txtContraseña.Text
Dim A As String = txtA.Text
Dim Contenido As String = txtContenido.Text
Dim Asunto As String = txtAsunto.Text
Dim Puerto As Integer = Integer.Parse(txtPuerto.Text)

En el resto de la aplicacion trabajaremos con estas variables, bueno ahora lo que ahcemos es simplemente preparar el correo creando un objeto tipo Mail y un objeto tipo Address para colocarle al correo de quine va remitido de esta manera:

'Declaro la variable para enviar el correo
Dim correo As New System.Net.Mail.MailMessage()
correo.From = New System.Net.Mail.MailAddress(Usuario)
correo.Subject = Asunto
correo.To.Add(A)
correo.Body = Contenido

Luego en el mismo método realizamos la configuración del servidor para ello utilizaremos una credencial para conectarnos al servidor para el caso de .Net es NetworkCredential y para configurar el servidor SmtpClient, de la siguiente manera:

'Configuracion del servidor
Dim Servidor As New System.Net.Mail.SmtpClient
Servidor.Host = SMTP
Servidor.Port = Puerto
Servidor.EnableSsl = True
Servidor.Credentials = New System.Net.NetworkCredential(Usuario, Contraseña)
Servidor.Send(correo)

Por ultimo podemos agregar un mensaje de confirmacion al usuario:

MessageBox.Show("Correo enviado!", "Correo", MessageBoxButtons.OK, MessageBoxIcon.Information)

Como ven es muy fácil y además algo muy usado es casi necesario en las aplicaciones empresariales realizar este proceso espero le sirva y a todos gracias por estar al tanto del blog.

Les dejo las fuentes:

Codigo fuente Enviar correo

72 comentarios sobre “Enviar correo desde Visual Basic .Net – Usando System.Net.Mail.MailMessage

    1. cierto digamos un usuario .. no sabria q escribir en esos campos smtp y puerto , etc.. para un usuario hay q hacerlo lo mas amigable posible .. sta exc el post … pero para un usuario seria un enredo .. saber q va ahi .. 😉

      Me gusta

  1. hey amigo está muy interesante el tutorial. Quisiera saber si se puede abjuntar un archivo y enviarlo? Tambien se puede recibir correos en visual basic? Me gustaría si sabes publicarlo

    Me gusta

  2. muy buen post!, sin embargo, tengo como servidor SMTP a Argosoft, y al momento de correr el programa me sale error de que el servidor no admite conexiones seguras y en el servidor me sale el siguiente error: Error[10054] connection reset by peer.
    Ayuda profavor!! Muchas gracias!

    Me gusta

  3. no me funciona tu progrma y no se el xq ?? estoy interesado de agregar esta funcionalidad a mi sistema o ayudameee como debo realizar el llenado de los campos como el de numero de puerto, y nombre de servidor smtp?? ,,,,, ya q cuando lleno los campos en nombre de servidor smtp pongo GMAIL.COM y numero de puerto 587 ..
    o es q se debe a problemas de mi laptop ayudame pleaseee , q esta desconfigurado en mi vusual

    Me gusta

  4. olas

    gracias me funciono a la perfecion con hotmail, yahoo estoy utilizando vb.net 2010

    pero a colocar un correo de google me manda un error q la conexion no es insegura por lo tanto no me deja enviar el correo
    ejemplo:
    tengo el servidor Dim SMTP As String = “mail.coin.desoft.com” con el puerto 25

    me puedes ayudar le agradesco antemano su colaboracion

    Me gusta

  5. Perfecto, pero al intentar enviar a los destinatarios como CC y BC (copia oculta y copia) no da error pero no lo hace.

    miCorreo.Bcc.Add(txt_copia.Text)

    alguien sabe por qué?

    gracias

    Me gusta

  6. Hola estoy tratando con hotmail. Pero con el Try catch me envía error al enviar el correo mientras que sin él me truena en

    Servidor.Send(correo)

    Estoy usando para SMTP:

    SMTP = “SMTP.live.com”

    No sabes porque será???????? Gracias

    Me gusta

  7. A la gente que tiene problemas con gmail, a mi me anduvo a la perfección. Los datos que tienen que poner son

    Dim SMTP As String = “smtp.gmail.com”
    Dim Usuario As String = “xxxxxxxx@gmail.com”
    Dim Puerto As Integer = Integer.Parse(25)

    Saludos

    Me gusta

  8. Oye espero me puedas ayudar, cuando declaro la variable “correo” como mailmessage y quiero asignarle un valor en from, subject etc. el compilador me manda un error “se esperaba una declaracion” ¿sabes por que pasa esto? hasta copie directamente tu codigo y aun asi esto me aparece. Estoy usando visual studio 2010 con framework 4

    Dim correo As New System.Net.Mail.MailMessage()
    correo.From = New System.Net.Mail.MailAddress(Usuario)
    correo.Subject = Asunto
    correo.To.Add(A)
    correo.Body = Contenido

    Me gusta

    1. Estoy probando mandar un correo con servidor de hotmail pero me tira error y me dic que la conexion no es seguro… y en ssl le pongo false me dic que el la conexion no es seguro que puedo hacer…?

      Me gusta

      1. Buen aporte, sin embargo desmiento lo que dices:

        Cuando tu acceso a internet es controlado por un servidor proxy, entonces no se podra realizar el envio del correo.

        Aun no lo descubro pero supongo algo más debe haber de configurarse en esas clases.
        Si es que alguien lo prueba, y puede aportar con este tema, se agradecerá bastante.

        Me gusta

  9. Hola,

    tengo un problema. No envía en mensaje hasta que cierro la aplicación. La única forma que lo hace es si hago correo.dispose, pero me borra los datos del mensaje (attach, body, etc)
    Alguien tiene una solución para este problema?
    Windows 7 Home Premium 64 bits
    VB 2010 – Framework 4.0

    Muchas gracias.

    Me gusta

  10. Hola. Muy interesante el link que me biene muy bien. Mi pregunta es la siguiente ¿Como le indico que quiero recibir confirmacion de lectura del correo enviado? y otra cosa mas. Como hago para recibir correo electronico con adjuntos (sin utilizar programas de correo). Gracias. Un saludo

    Me gusta

  11. amigos me sirvio mucho su codigo y por eso me gustaria complementarlo!! aqui les dejo lo que yo ise es con coneccion a base de datos sql

    ojala les sirva

    cnn = New SqlConnection(coneccion)
    cnn.Open()
    cmm = New SqlCommand
    cmm.CommandType = CommandType.Text
    cmm.CommandText = “select agregar_mails from agregarmails ”
    cmm.Connection = cnn
    Dim reader1 = cmm.ExecuteReader()
    Dim con1 = New SqlConnection(coneccion)
    con1.Open()
    While reader1.Read
    Dim agregar_mails = reader1.GetString(0)

    cnn = New SqlConnection(coneccion)
    cnn.Open()
    cmm = New SqlCommand
    cmm.CommandType = CommandType.Text
    cmm.CommandText = “select mail,pmail from mail ”
    cmm.Connection = cnn

    Dim reader = cmm.ExecuteReader()

    Dim con = New SqlConnection(coneccion)
    con.Open()
    While reader.Read

    Dim mail = reader.GetString(0)
    Dim pass = reader.GetString(1)
    Dim correo As New System.Net.Mail.MailMessage

    correo.From = New System.Net.Mail.MailAddress(mail)

    correo.To.Add(agregar_mails)

    correo.Subject = asun.Text

    correo.Body = tcome.Text

    correo.IsBodyHtml = False

    correo.Priority = System.Net.Mail.MailPriority.Normal

    Dim smtp As New System.Net.Mail.SmtpClient

    smtp.Host = “smtp.live.com”

    smtp.DeliveryMethod = Net.Mail.SmtpDeliveryMethod.Network

    smtp.Credentials = New System.Net.NetworkCredential(mail, pass)

    Try

    smtp.Send(correo)

    MsgBox(“Mensaje enviado satisfactoriamente”)

    Catch ex As System.Net.Mail.SmtpException

    MsgBox(ex.Message)

    End Try
    End While
    End While

    Me gusta

  12. Private Sub enviarCorreo(ByVal Contenido As String, ByVal sucursal As String)

    Dim SMTP As String = “smtp.gmail.com”
    Dim Usuario As String
    Dim Contra As String
    Dim A As String
    Dim Asunto As String = “Reporte diario”
    Dim Puerto As Integer = Integer.Parse(465)

    Usuario = “xxxxxxx@gmail.com”
    Contra = “xxxxxxx”

    A = “yyyyyyy@gmail.com”

    Dim correo As New System.Net.Mail.MailMessage()
    correo.From = New System.Net.Mail.MailAddress(Usuario)
    correo.Subject = Asunto
    correo.To.Add(A)
    correo.Body = Contenido

    ‘Configuracion del servidor
    Dim Servidor As New System.Net.Mail.SmtpClient
    Servidor.Host = SMTP
    Servidor.Port = Puerto
    Servidor.EnableSsl = True
    Servidor.Credentials = New System.Net.NetworkCredential(Usuario, Contra)
    Servidor.Send(correo)

    MsgBox(“Enviado”)
    End Sub:

    Se me traba la aplicación :/ Se me pone como “No responde”
    Hice algo mal?

    Me gusta

  13. Me da el error “El servidor SMTP requiere una conexiión segura o el cliente no se autenticó. La respuesta del servidor fue: 5.5.1 Authentication Required”

    Estoy entrando por el puerto 587

    Me gusta

    1. Claro solo tienes que ponerle un timer y desatas el método cada vez que quieras que envié.

      casi todos los servidores tienen esto controlado y lo mandan al spam asi que no te pongas a mandar muchos correos si es lo que deseas hacer.

      Me gusta

      1. OTRA PREGUNTA SE PUEDE CAMBIAR EL IDIOMA DE LOS LABEL EN VISUAL STUDIO 2010 YA EJECUTADO EL SISTEMA. COMO POR EJEMPLO DISEÑAR UN FORMULARIO PARA ESA CONFIGURACIÓN

        Me gusta

      1. Lo que yo quiero es que se mande desde .net un email mediante el outlook y necesito saber como tengo que hacer la configuracion, es decir, el puerto al que se tiene que conectar el servidor para que se pueda enviar el email desde outlook.

        Me gusta

      2. para eso lo que debes hacer es abrir el outllok y pasarle los datos y que la persona le de enviar por el outlook para ello este es el codigo:

        string outlookName = “Outlook.Application”;
        dynamic outlook;
        try
        {
        //See if Outlook is already running
        outlook = AutomationFactory.GetObject(outlookName);
        }
        catch
        {
        outlook = AutomationFactory.CreateObject(outlookName);
        }

        dynamic mailItem = outlook.CreateItem(0);

        mailItem.Display();

        string msgBody = strBody;

        mailItem.Subject = strSubject;
        mailItem.HTMLBody = msgBody;
        mailItem.Attachments.Add(@”” + path);

        Me gusta

  14. Hola! Tengo un duda…. Estoy haciendo un programa que crea correos diferentes para diferentes diferentes emails, cada uno con un archivo adjunto distinto… La creacion de correos la hace automaticamente en base a una lista… pero a la hora de hacer los envios por medio de un ciclo, luego de hacer el primer envio rapidamente, los siguientes duran una eternidad enviandose… Sabes que puede estar pasando?

    Me gusta

    1. Si, si esta usando un servidor como Gmail, hotmail o cualquiera publico ellos por seguridad evitan que se envíen mensajes así ya que los toma como spam, si usas un servidor propio puede ser que tenga algún filtro o que se llene el pool que tiene para mails, para poder enviar cantidades grandes de mail debes investigar el tema y no hacer un simple ciclo.

      investígalo como bulk email

      Me gusta

  15. Buenos dias…. Estoy en un proyecto donde tengo que enviar correo electronico de forma automatica.. al realizar Imports System.Net.Mail sobre VS 2005 me da un error en el cual dice que no contiene ningun miembro publico o no se encuentran. Si me dan una mano agradecido.

    Me gusta

  16. “El servidor SMTP requiere una conexión segura o el cliente no se autenticó. La respuesta del servidor fue: 5.7.0 Must issue a STARTTLS command first. 9sm1973399qts.26 – gsmtp”

    Eso me sale con una cuenta de gmail, tengo otra cuenta en gmail y lo envia perfectamente!!!!!!!!!!
    Porqueeeeee???

    Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s