Enviar mail desde Excel vía correo Web


Hasta ahora hemos visto como podemos enviar un mail con un archivo adjunto con Excel en las versiones 2003/2007/2010 mediante el programa Outlook  Express de Microsoft. Esta plataforma es muy conocida  en el mundo, viene con el paquete de Office. Además ha sido utilizado como cliente de correo de muchas empresas.       
Difícilmente utilicemos Outlook Express para  cuentas de correo Web, Gmail, Hotmail (ahora Outlook), etc. La configuración es complicada o simplemente gusta más la plataforma web, esto es debido a que los proveedores web se esfuerzan cada vez más en hacer plataformas amigables, con más opciones y servicios para los usuarios. Outlook es algo estático, serio y aburrido.
Para nuestras mini aplicaciones puede que necesitemos enviar mails sin disponer de un cliente de correo.  La forma de declaración del código es bastante parecida a la vista sin embargo hay que configurar una conexión de datos con la nube ya que utilizaremos una cuenta de correo web.
Foto2

Para ver el video Click Aquí o en la imagen.


Antes de Empezar
Para comenzar necesitamos una cuenta anfitriona, es decir la cuenta de correo web que utilizaremos para enviar el mail, o cuenta host. Por ejemplo remeras-simpsons@gmail.com. Para dicha cuenta hay que detectar el proveedor de correo al que pertenece, en este caso “Gmail” y sus datos de configuración. El servidor llamado SMTP que es el servidor de salida de nuestro proveedor  y el puerto. El primero es una dirección que tiene esta forma “smtp.gmail.com”, para GMAIL por ejemplo y el puerto tiene la forma de un número de dos o tres cifras, para GMAIL puede ser 457 o 565”.  Además de esto, también necesitaremos autenticar la cuenta de correo desde la cual enviaremos el mail por lo que el código requiere de la contraseña de usuario.
Puede ser natural desconfiar cuando introducimos nuestra contraseña y nombre de usuario en algún código pero no se preocupen ya que como verán se utiliza la autenticación a través de un servidor de MICROSOFT, este actúa de soporte para la conexión. Así que es muy seguro. Tengan en cuenta que si en algún otro código que puedan encontrar les muestra otra dirección que no sea la que utilizamos, NO LO UTILICEN. Si quieren más información pueden consultar en esta página de MICROSOFT.
Hay otra cosa a tener en cuenta, antes de utilizar el código es necesario cargar el objeto de VBA que nos permite efectuar esta serie de acciones. Ese objeto es llamado CDO, este objeto se encuentra en la biblioteca de herramientas de VBA y es necesario activarlo “cargarlo”. Difícilmente lo tengan cargado por defecto así que deben ir a “Herramientas >> Referencias >> Microsoft CDO…”


No se olviden de algo importantísimo, aunque parece obvio, “deben estar conectados a internet para que funcione”.
Proceso
Para este ejemplo queremos enviar un mail a nuestros clientes. El mail además de texto puede contener una imagen, ya sea adjunta o incrustada.
El cuerpo del mensaje cuando se utiliza la biblioteca CDO tiene forma de HTML. Es por eso que puede ser necesario utilizar  etiquetas HTML.
Para ejecutar el códigos se crea una macro llamada “enviar_mail” y se vincula a un objeto, una imagen en forma de sobre.
  
El código es el siguiente:
----------------------------------------------------------------------------------------------
Sub enviar_mail()
' PabloFSix
' Excelminiapps.blogspot.com
'Defino las variables como objetos
    Dim email As Object
    Dim mailconfig As Object
   Dim mfield As Object
'Asigno referencias de objeto a variable
    Set email = CreateObject("CDO.Message")
    Set mailconfig = CreateObject("CDO.Configuration")
    Set mfield = mailconfig.Fields
'Configuramos el objeto CDO mediante la dirección del servidor de conf y la declaración siguiente
'También autenticamos el SMTP server, en este caso el de gmail
MicConf = "http://schemas.microsoft.com/cdo/configuration/"
mfield.Item(MicConf & "sendusing") = 2
'servidro smtp de gmail, pueden buscarlo en internet
mfield.Item(MicConf & "smtpserver") = Sheets("Mails").Range("J17").Text
'puerto del servidor smtp, pueden buscarlo en internet
mfield.Item(MicConf & "smtpserverport") = Sheets("Mails").Range("O17").Value
mfield.Item(MicConf & "smtpauthenticate") = 1
'aquí va la cuenta host, una cuenta de correo web
mfield.Item(MicConf & "sendusername") = Sheets("Mails").Range("J15").Text
'aquí va la contraseña que usamos en nuestro correo web, al usar un servidor de microsoft, esta info es segura
mfield.Item(MicConf & "sendpassword") = Sheets("Mails").Range("N15").Value
mfield.Item(MicConf & "smtpusessl") = 1
mfield.Update
'sin la configuración anterior no funcionará el código
     'completo los campos necesarios del e-mail
         With Omail
    .To = Sheets("Mails").Range("C15").Text
    .From = Sheets("Mails").Range("J15").Text
                  .Subject = Sheets("Mails").Range("D19").Text
 'si queremos incrustar una imagen activamos el checkbox2
'con el objeto CDO pueden incluir código html en el cuerpo del msj como se muestra
'en este caso utilizamos las etiqueta “img”: incrustar imagen y “br” :salto de línea.
'todo código html comienza con las etiquedas “html” y el cuerpo se define con “body”
                     If Sheets("Mails").CheckBox2 = True Then
                    .HTMLBody = "<HTML><BODY><img src='" & Sheets("Mails").Range("L22").Text & _ "'/><br>" & Sheets("Mails").Range("D20").Text & "<br/></BODY></HTML>"
                    Else
                  .HTMLBody = "<HTML><BODY>" & Sheets("Mails").Range("D20").Text & _ "</BODY></HTML>"
                   End If
                 .Sender = "RemerasSimpsons"
'cambia la forma en la que se declara un archivo adjunto
 'para adjuntar un archivo  activamos el checkbox1
                  If Sheets("Mails").CheckBox1.Value = True Then
                 .AddAttachment Sheets("Mails").Range("L20").Text & "\" & _ Sheets("mails").Range("B17").Text
                   End If
                 '.Organization = "RemerasSimpsons"
                  '.ReplyTo = ""
                 Set .Configuration = mailconfig
    'con este metodo no podemos visualizar el mail, si quisiéramos podríamos hacerlo mediante un formulario
                 .Send
         End With
  'desvinculo la variable de los objetos
   Set email = Nothing
   Set mailconfig = Nothing
   Set mfield = Nothing
MsgBox "Mail enviado a " & Sheets("Mails").Range("C15").Text
End Sub
----------------------------------------------------------------------------------------------
Como ven el código prácticamente tiene la misma declaración que para el código que utilizamos en las entradas anteriores.
Próximamente se va a colgar el archivo de ejemplo en la zona de Descargas. Si tienen alguna duda o consulta pueden hacerlo a través del formulario de contacto.
Les recomendamos que sigan el blog por alguno de los medios, mail o por redes sociales, para recibir las actualizaciones y novedades.
¡Éxitos!

Keys:
·         Enviar mail con Excel
·         Enviar mail con macro en Excel
·         Enviar mail con CDO en Excel

34 comentarios:

Unknown dijo...

Buenas tardes me parece perfecto esta macro

Solo tengo un problema en caso de querer enviar una tabla en vez de una sola celda... como seria el codigo

Me seria de mucha utilidad

Espero contestacion

te dejo mail por si prefiers mail

ironcel69@gmail.com

Excelminiapps dijo...

Hola amigo, cómo estas! Gracias por el comentario y por tu interés!
Recuerda que el cuerpo del mensaje esta formado por código html así que si deseas enviar una tabla es algo complicado porque debes crear la estructura html, sobretodo si es una tabla grande. Si estas interesado, en internet hay tutos acerca de ello. Por otro lado, si nos quieres escribir directamente lo puedes hacer mediante el formulario de contacto. Saludos

Unknown dijo...

Me aparece el sigiente error, que puedo hacer.
Se producjo el sigueinte error: No se pudo enviar el menaje al servidor SMTP. El codigo de errorde transporte fue 0x80040217. La respuesta del servidor fue not available.

Gracias por el aporte

Excelminiapps dijo...

Hola amigo, cómo estas! Gracias por comentar.
Habría que revisar que servidor de correo estas usando, puedes investigar por internet. En el ejemplo probamos con gmail.
Puedes escribirnos directamente con el formulario de contacto. Saludos

Excelminiapps dijo...

Hola amigo, cómo estas! Gracias por comentar!
En verdad es un poco avanzada esta aplicacion sino conoces o no estas familiarizado tanto con código, etc. Lo ideal es que hagas una pequeña investigación y te ilustres un poco. Nosotros tratamos de brindar toda la información posible y de la forma más simple en el artículo pero igual puede ser dificultoso entender. En cuanto a la plantilla, más bien es para que vean o estudien los elementos y el código, no esta pensado para edición porque puedes modificar algo sin querer y no andaría. Nos puedes escribir directamente para consultarnos de este tema mediante el formulario del blog. Saludos

Unknown dijo...

Hola, me gustaria saber si se puede hacer lo siguiente.

Tengo una funsion SI
=SI(A16="";"";SI(J16="Cerrado facturado";"concretado";SI(J16="Cancelado";"cancelado";SI(HOY()E16;"Vencida";SI(HOY()=E16;"Ultimo Dia";))))))

y quiero que si se puede, faltando 5 dias para que se termine la cotizacion, mande un email de recordatorio automatico de que su cotizacion esta a punto de vencerse.
Se podra hacer eso? Saludos y quiero felicitarlos por el excelente blog, la verdad que el mundo de excel es infinito.

Excelminiapps dijo...

Hola amigo, cómo estas! Gracias por comentar.
En cuanto a tu consulta, claro que se puede. Lo único es que sino tienes tanto conocimiento de Macros debería encontrar la forma más simple posible. Por ejemplo, sino necesitas críticamente que sea automático se puede hacer manual. Al menos que tengas miles de cotizaciones. El envío de mail se puede hacer con un hipervínvulo y usando outlook si lo tienes. Nos puedes escribir mediante el formulario de contacto si tienes más consultas. Saludos

Francisco dijo...

Hola amigo gracias por el archivo esta genial, pero tengo un problema cuando quiero adjuntar algo, marco la casilla pero, pero al ejecutar la macro salta un error en la linea ".AddAttachment Sheets("Mails").Range("L20").Text & "\" & Sheets("mails").Range("B17").Text"
Error en tiempo de ejecución. Sabes si se puede utilizar con Office 2013?
Gracias y felicidades.

Excelminiapps dijo...

Hola amigo, muchas gracias por comentar!
En cuanto a tu consulta, seguramente algo esta mal en la definición del código. Revisaste si esta bien la dirección del archivo?
En cuanto a tu otra pregunta, a veces hacen unos cambios pequeños en la definición del código pero probablemente funcione en 2013.
Saludos

Excelminiapps dijo...

Hola amigo, muchas gracias por comentar!
En cuanto a tu consulta, seguramente algo esta mal en la definición del código. Revisaste si esta bien la dirección del archivo?
En cuanto a tu otra pregunta, a veces hacen unos cambios pequeños en la definición del código pero probablemente funcione en 2013.
Saludos

Nafer dijo...

Buenos días, me da error en tiempo de ejecución, Se requiere un Objeto y me va a la línea ".To = Sheets("Mails").Range("C1").Text", incluí en la solapa de Referencias según lo indicado en el apartado, por qué puede ser el error ? Muchas gracias y saludos.

Excelminiapps dijo...

Hola amigo, cómo estas! Gracias por escribirnos!
Esa línea supone que da el mail del receptor del mail, es decir en esa hoja, en ese rango esta el mail del receptor. Sino tienes la hoja "Mails" por ejemplo dará un error. Revísalo. Esparamos nuevamente tu contacto. Saludos

Unknown dijo...
Este comentario ha sido eliminado por el autor.
Unknown dijo...
Este comentario ha sido eliminado por el autor.
Excelminiapps dijo...

Hola amigo, cómo estas! La idea de la plantilla es que vean los elementos y el código. Nuestro deseo es que puedan construir con todo nuestro trabajo una mini aplicación propia de acuerdo a sus necesidades. Muchas gracias por tus comentarios.

Saludos

Juan Yilaly dijo...
Este comentario ha sido eliminado por el autor.
Juan Yilaly dijo...
Este comentario ha sido eliminado por el autor.
Juan Yilaly dijo...

saludos, necesito enviar un correo personalizado a 450 empresas. Tengo una base de datos en excel en dos columnas, una con el nombre de cada empresa, y la otra con sus respectivos email. El cuerpo del mensaje sería el mismo, salvo el saludo que me gustaría que fuera "Estimados Sres. `NOMBRE DE LA EMPRESA´." Alguien tiene una idea de como automatizar esto para no tener que hacerlo "a mano"?

Excelminiapps dijo...

Hola amigo, cómo estas! Gracias por comentar!
En este artículo tienes una forma de hacerlo, puede haber otras. En tu caso se puede hacer algo más sencillo aún, usando solo formulas. Puedes buscar en internet. Esperamos tus comentarios.
Saludos

lupoque dijo...

Hice todo y perfecto. Lo que quiero es que la celda X que sería parte del cuerpo vaya con Letra diferente o repintada, etc., es decir darle formato. ¿Cómo se hace? Gracias.

Excelminiapps dijo...

Hola amigo, cómo estas! Gracias por comentar!
No habría problemas con cambiar el formato, eso es simple, como ya lo sabes.
Saludos

Unknown dijo...

Cordial saludo.

Dònde puedo conseguir el archivo XLSM donde està eel còdigo
Gracias,

Mi nombre es: Hildebrando
email: hildebrandosv@gmail.com

Excelminiapps dijo...

Hola amiga, cómo estas! Gracias por tu comentario!
En cuanto a tu consulta, no hay necesidad de tener el archivo con lo que damos aquí en el video lo puedes crear tu misma. Sin embargo, puedes descargarlo de la tienda.
Esperamos tus comentarios.
Saludos

Unknown dijo...

Hola he estado intentando utilizar el código tal cual como esta en el archivo descargado modificando las cuentas de correos y la contraseña y con los dos puerto de gmail pero siempre me sale el mensaje "se ha producido el error '-2147220379 (80040213)' en tiempo de ejecución: Error de transporte en la conexión al servidor."

Ya probé con varias cuentas gmail, y los puertos 465 y 587.

¿Que debería hacer? mi experiencia con VBA no es mucha y el código que usted me suministra es la base para la aplicación que quiero pero si esta no me funciona no puedo avanzar.

de ante mano gracias.

Excelminiapps dijo...

Hola amigo, cómo estas! Gracias por comentar
En cuanto a tu consulta o comentario. Con Gmail a veces es un tanto complicado porque cambian las políticas muy seguido. Seguramente además de los puertos tendrás que revisar las opciones de tu correo (en gmail) para ver que estén habilitades las opciones de seguridad.
En nuestra experiencia, y para no renegar, te recomendamos que si no es por algo personal el tema de los mail directamente, crees un correo en otra plataforma más flexible como puede ser outlook.
Esperamos tus comentarios.
Saludos

Unknown dijo...

Hola, gracias por la info, tengo un caso, ¿como puedo hacer? en mi trabajo tengo una cuenta corporativa proporcionada por google, el dominio es correo@hocplc.com, e inicio sesión como podría enviar correos desde excel?, por favor tu apoyo, gracias.

por aca entro a mi correo: https://mail.google.com/

Excelminiapps dijo...

Hola amigo, cómo estas! Gracias por escribirnos!
En cuanto a tu consulta, en teoría debería funcionar con lo que se vio en este artículo. Hay que averiguar que datos necesitas y además ver que restricciones de seguridad tiene la cuenta.
Esperamos tus comentarios.
Saludos

Unknown dijo...

buen día
Excelente archivo, espero me puedas ayudar, estoy intentado mandar un correo de una cuenta de outlook pero me marca error no me a dejado esta es la configuración de mi servidor les estoy poniendo los datos correctos pero no me deja estos son los datos de mi servidor.

Configuracion SMTP
Nombre de servidor: smtp.office365.com
Puerto: 587
Método de cifrado: TLS
me sale este error en tiempo de ejecución

espero que me puedas ayudar
gracias

Excelminiapps dijo...

Hola amigo, cómo estas! Gracias por escribirnos!
Habría que probar, de seguro hay algún error en estos datos. O puede ser que se haya agregado algo de seguridad para el acceso, deberías buscar si hay algún artículo dónde se mencione la utilización de estos servidores que mencionas.
Esperamos tus comentarios.
Saludos

Unknown dijo...

Gracias por tu tiempo.
Ando buscando un artículo relacionado a este error, espero encontrar la solución a esto
En cuanto encuentre la solución a esto se los are saber
Saludos

Terry dijo...

Error en el código .send

Excelminiapps dijo...

Hola amigo, cómo estas! Gracias por comentar
Seguramente algo mal en el código.
Saludos

MARCOS dijo...

Hola a todos!! me parece genial la macro, donde puedo descargar el fichero xlxm?? no encuentro el enlace, por favor enviadme el enlace, muchas gracias.

Excelminiapps dijo...

Hola amigo, cómo estas! Gracias por escribirnos!
Revisa la zona de descargas.
Saludos