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

74 comentarios en «Enviar correo desde Visual Basic .Net – Usando System.Net.Mail.MailMessage»

  1. muy interesante y didáctico sin embargo como le hacemos para averiguar que debo poner como server smtp y número de puerto para un sender de gmail.com.

    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 .. 😉

  2. 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

    1. de esta manera de da de una cualquier cosa me dices

      Dim archivo As New System.Net.Mail.Attachment(“C:\archivo.txt”)

      correo.Attachments.Add(archivo)

  3. 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!

  4. 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

  5. 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

  6. que pongo en puerto para el hotmail y tambien que pongo en donde dice servidor smtp.. gracias

  7. 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

  8. 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

    1. pero que error? puede ser mala autentificacion o el numero del puerto o el tipo de seguridad.

  9. 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

  10. 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

    1. Lo que sucede es que el código que se te ha proporcionado es para Visual Basic, tu estás utilizando visual estudio y lo más probable que el lenguaje en el que estás trabajando sea C#.

  11. Excelente post pero si tengo mi propio servidor de correos.. que outlok me da… que puerto debo de usar

    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…?

      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.

  12. 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.

  13. Perfecto Maestro !, esto es lo que andaba buscando, funciona al 100% con hotmail.
    utilizando el puerto 587
    saludos!!

  14. 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

  15. 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

  16. 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?

  17. 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

  18. te hago una consulta
    tengo mi mail (usuario de cuenta)
    que es
    nombre.2donombre.dominio.com

    y al no tener “@” me arroja error…

    como puedo solucionarlo??

    saludos!

  19. DISCULPEN HAY ALGUNA FORMA DE QUE EL CORREO SE ENVIE AUTOMATICAMENTE EN DETERMINADO TIEMPO SIN NECESIDAD DE PONER UN BOTON DE ENVIAR

    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.

      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

      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.

        1. 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);

  20. 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?

    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

  21. 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.

    1. Hola, fíjate si está instalado Framework 2.0 o superior, ya que está disponible a partir de la 2.0. La versión de VB está bien.

  22. si nquiero enviar aun correo interno de una lan por ejemplo correo.scsoft.com.pe como tendria que hacer

  23. “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???

  24. Buen artículo, si pudieras complementarlo dando algunas pistas de cómo armar un cuerpo (body) en HTML sería perfecto. Gracias.

  25. Muy buen ejemplo, sin embargo me sale un mensaje de error: “El servidor SMTP require una conexion segura o el cliente no se autenticó. La respuesta del servidor fue: 5.7.57 Client not authenticated to send mail. Error: 535 5.7.139.”

    Estoy colocando como parametros:
    Servidor.Host = “smtp.office365.com”
    Servidor.Port = “587”
    Servidor.EnableSsl = True
    Servidor.Credentials = New System.Net.NetworkCredential(“aaa”, “bbbb”)

    Que puede estar faltándome ?

    Gracias de antemano.

Los comentarios están cerrados.