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:
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.
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 .. 😉
Gracias por el ejemplo, sirvio a la perfeccion
tambien aqui hay un link que explica como enviar usando gmail
http://geeks.ms/blogs/jalarcon/archive/2007/06/23/c-243-mo-enviar-correo-electr-243-nico-por-c-243-digo-usando-cuentas-de-gmail.aspx
esta hecho en C, pero logré adptarlo a aplicacion visual basic
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
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)
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!
Cambia esta linea por “False”
Servidor.EnableSsl = False
Estaba buscando otra cosa en msn y di con tu web.Por cierto muy buenos articulos
este codigo lo ingreso enel boton send??
excelente tu website, te felicito!
Muy bueno tu post, te felicito!
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
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
Estupendo!
Muchas gracias.
que pongo en puerto para el hotmail y tambien que pongo en donde dice servidor smtp.. gracias
Prueba con:
Servidor SMTP: smtp.live.com
Puerto SMTP: 25.
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
Aquí os dejo una entrada donde se explica, de forma muy intuitiva, el envío de emails con vb.NET:
http://jpsprogramacion.blogspot.com/2011/07/envio-de-email-con-aspnet.html
hoye me sale un error “Failure sending mail.” smtpexception was unlashed
gran ejemplo vago me salvaste el empleo jajaja
por que putas me mandara duplicados los correos llegan 2 veces
por que putas me mandara duplicados los correos llegan 2 veces
mierda
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
Que error te esta sacando??? depronto es por el SLL ponlo en false
pero que error? puede ser mala autentificacion o el numero del puerto o el tipo de seguridad.
CAmbia al puerto 587 y listo! me paso lo mismo! grrrrrrrrrrrrrrr
perfecto, funciona gracias
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
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
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#.
Excelente post pero si tengo mi propio servidor de correos.. que outlok me da… que puerto debo de usar
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…?
que pasa si tengo un proxy..???? hay que configurar el proxy…???
Depende del servidor de correo, pero si es alguno de Gmail,Hotmail etc… no es necesario.
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.
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.
Excelente!!, me fué de gran ayuda. Un abrazo
Muy buen post. Gracias!!!
Perfecto Maestro !, esto es lo que andaba buscando, funciona al 100% con hotmail.
utilizando el puerto 587
saludos!!
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
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
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 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
donde dice EnableSsl ponle false a ver
Muchas gracias, excelente aportacion es de mucha utilidad;
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!
un correo por obligación debe tener la arroba, ese dominio es otra cosa.
es un web mail de fibertel…
http://wm2.fibertel.com.ar/uwc/auth?err=1
es usuario.dominio.com.ar
es de una empresa…
DISCULPEN HAY ALGUNA FORMA DE QUE EL CORREO SE ENVIE AUTOMATICAMENTE EN DETERMINADO TIEMPO SIN NECESIDAD DE PONER UN BOTON DE ENVIAR
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.
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
debes preguntar la cultura de donde esta ejecutadonse http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.aspx dependiendo de la cultura pones el texto en ingles español etc… pero eso debes hacerlo manual.
como tengo que configurar el puerto para utilizar outlook?
Gracias
no entiendo muy bien tu ppregunta, el codigo no tiene que ver con outlook pero si hay toca tambien configurar el puerto
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.
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);
Hola gracias por tu labor me fue de gran ayuda, me funciona correctamente tanto para hotmail como gmail
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?
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
Gracias!
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.
no, no entiendo le problema, el ejemplo tambien esta hecho en VS2005
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.
si nquiero enviar aun correo interno de una lan por ejemplo correo.scsoft.com.pe como tendria que hacer
Es igual no importa
Excelente, me fue de mucha ayuda
Gracias
hola tengo un problema al enviar por correo, espero pueedas ayudarme!
Gracias! me salvaste el quedar como pollo con el jefe! xDD
“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???
tienes que habilitar el envío por aplicaciones externas https://www.youtube.com/watch?v=_J4EPZnZcSs
Buen artículo, si pudieras complementarlo dando algunas pistas de cómo armar un cuerpo (body) en HTML sería perfecto. Gracias.
Este video me sirvio mucho, espero les sirva, en la descripción del video esta para descargar el codigo: https://www.youtube.com/watch?v=67h7WbCKh_g&t=3s
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.