Enviar emails de GMAIL o dominio propio desde Excel usando CDO y VBA sin tener un cliente de correo configurado
Este tutorial ya lo venía pensando desde hace mucho tiempo y ahora es tiempo de hacer realidad. En otro tutorial ya habíamos visto cómo enviar correos electrónicos desde Excel usando como cliente de correo Outlook de Office. Aunque dicho tutorial es muy útil, estábamos obligados a tener Outlook de Office, además de tener una cuenta configurada, tanto cuenta gratuita o cuenta de empresa con domino propio.
Pero siempre habrá más opciones de hacer una misma cosa en Excel, es por eso que en este tutorial veremos cómo enviar emails desde Excel sin la necesidad de tener un cliente de correo instalado en nuestra computadora. Lo anterior lo haremos haciendo uso de la librería CDO o Collaboration Data Objects.
Ver Video Enviar emails desde Excel usando CDO y VBA
Suscríbete al canal de EXCELeINFO en YouTube para aprender más de Excel y macros.
Usar librería Collaboration Data Objects (CDO) para enviar correos
La librería CDO salió en Windows 2000 y desde entonces se ha mantenido vigente, sin embargo no se sabe hasta cuándo Microsoft dejará de darle soporte.
Existen varias ventajas al utilizar CDO en lugar de la integración con Outlook de Office:
-
No dependes de un cliente de correo electrónico en tu PC.
-
El código vba expuesto en el tutorial funciona a partir de Office 97 y hasta este momento en Office 2016. Seguro en Office 2019.
-
Se puede enviar un rango de celdas como cuerpo de correo.
-
Se pueden adjuntar cualquier tipo de archivo, tales como imágenes, archivo de Excel, Work, PDF, etc.
-
Puedes configurar cualquier correo, sólo contando con las configuraciones de Servidor SMTP, Puerto SMTP, usuario y contraseña (en la mayoría de los casos).
Enviar mails desde cuentas de GMAIL
Para enviar correos usando una cuenta de GMAIL, prácticamente basta con saber el Servidor SMTP, el puerto, correo y contraseña. Sin embargo, en mis pruebas iniciales no logré enviar correos, ya que en mi cuenta de GMAIL tengo la autenticación en dos pasos, por lo que investigando sobre el tema, GMAIL por temas de seguridad maneja lo que llama Aplicaciones menos seguras. Para poder utilizar una cuenta de GMAL, debemos entrar al siguiente sitio:
https://www.google.com/settings/security/lesssecureapps
Entrando al sitio, debemos elegir Resolver problemas con Microsoft Outlook y generar una contraseña temporal para poder usarla en CDO.
Figura 1. GMAIL nos permite generar contraseñas temporales para usarlas en aplicaciones menos seguras.
Enviar mails desde una cuenta con dominio propio (correos corporativos y de empresa)
Si en tu empresa cuentan con dominio propio y deseas usar tu correo para enviar correos masivos o individuales de Excel, al igual que con cuentas de GMAIL, es necesario tener a la mano los datos de: Servidor SMTP, el puerto, correo y contraseña.
Enviar correos desde cuenta de Outlook, Live o Hotmail
Infortunadamente no logré hacer funcionar CDO usando una cuenta de Hotmail en mis pruebas. Microsoft seguro bloquea esos accesos por tema de seguridad.
Caso práctico: enviar emails a clientes que haya pasado su fecha de vencimiento de pago
Antes ir al código VBA de la macro, veamos el caso práctico que resolveremos. Tenemos una lista de correos donde también tenemos el saldo deudor de clientes, así como la fecha de vencimiento de su deuda y de la misma manera, tenemos el archivo adjunto que le mandaremos a cada cliente.
Figura 2. El envío de correos se hará en base a la fecha de vencimiento.
El envío de correos se hará sólo a los clientes que haya pasado su fecha de vencimiento, es decir, que la fecha de vencimiento sea menor a la fecha actual.
Primeros pasos: Activar la referencia a CDO
Entramos al Editor VBA usando la combinación de teclas [Alt] + [F11]. Dentro del editor entramos al menú Herramientas > Referencias. Buscamos Microsoft CDO for Windows 2000 Library y la activamos. Si no encuentras la librería deberás ir a la carpeta C:\Windows\System32\ y buscar el archivo cdosys.dll.
Figura 3. Activamos la librería Microsoft CDO for Windows 2000 Library.
Entendiendo el código VBA de la macro
Recorremos celda por celda del rango “B8:B10” que es rango donde están las cuentas de correo, y validamos la fecha de vencimiento de cada línea. Si la fecha de vencimiento es menor a la fecha actual, entonces enviamos el correo.
'EXCELeINFO 'MVP Sergio Alejandro Campos 'http://www.exceleinfo.com 'https://www.youtube.com/user/sergioacamposh 'http://blogs.itpro.es/exceleinfo 'http://www.exceleinfo.com/uso-de-colores-en-excel-con-macros/ ' Sub EnviarCorreoSinCliente() ' 'Para que este código funcione debes activar la referencia: 'Microsoft CDO for Windows 2000 en Herramientas > Referencia (cdosys.dll) 'Documentación de Collaboration Data Objects (CDO) 'https://msdn.microsoft.com/en-us/library/ms872853.aspx ' 'https://www.google.com/settings/security/lesssecureapps 'SMTP GMAIL: smtp.gmail.com 'SMTP SERVER PORT: 465 'SMTP HOTMAIL: smtp.live.com 'SMTP SERVER PORT: 25 'Nota: Para configurar un correo corporativo favor de pedir los datos a tu empresa. Dim MiCorreo As CDO.Message For Each Celda In ThisWorkbook.Sheets("Hoja1").Range("B8:B10") FechaVencimiento = Celda.Offset(0, 2).Value If FechaVencimiento >= Date Then 'No se ha cumplido el plazo de 15 días Else
Si la condición de la fecha de vencimiento se cumple entonces creamos un objeto de tipo CDO que llamaremos MiCorreo y pasamos los campos de configuración del correo que utilizamos para el envío:
-
Definimos si el Servidor SMTP utiliza seguridad SSL: True.
-
Si se requiere autenticación: 1
-
El Servidor SMTP de GMAIL: smtp.gmail.com
-
El puerto SMTP de GMAIL: 465
-
El correo electrónico.
-
La contraseña de tu correo.
Set MiCorreo = New CDO.Message ' With MiCorreo.Configuration.Fields .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 'cdoBasic .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com" .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 465 .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 'cdoSendUsingPort .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "tucuentadegmail" .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "tupassword" .Update End With
Ahora asignamos el valor a las variables que almacenarán los elementos del correo.
'Elementos del correo ' Asunto = "Saldo vencido" Destinatario = Celda.Offset(0, -1).Value Correo = Celda.Value Saldo = Format(Celda.Offset(0, 1).Value, "$#,##0") FechaVencimiento = Format(Celda.Offset(0, 2).Value, "dd/mmm/yyyy") Adjunto = Celda.Offset(0, 3).Value
Armando el cuerpo del correo
'Cuerpo del mensaje ' Msg = "Apreciable " & Destinatario & vbNewLine & vbNewLine Msg = Msg & "Queremos informarle que su fecha de pago venció el día " Msg = Msg & FechaVencimiento & "." & vbNewLine & vbNewLine Msg = Msg & "El saldo que debe liquidar es " Msg = Msg & Saldo & vbNewLine & vbNewLine Msg = Msg & "Atentamente:" & vbNewLine Msg = Msg & "Tarjetas de crédito."
Al final usamos los métodos y propiedades del Objeto CDO que llamamos MiCorreo, que serán Asunto, Origen, Destinatario, Cuerpo del mensaje y Adjunto.
Nota: Si deseas enviar un rango de celdas como cuerpo de correo, comenta la línea TextBody y descomenta HTMLBody.
With MiCorreo .Subject = Asunto .From = "tucuentadegmail" .To = Correo '.CC = "correo@dominio.com" '.BCC = "otrocorreo@dominio.com" .TextBody = Msg '.HTMLBody = RangetoHTML(ActiveSheet.Range("A7:E10")) .AddAttachment Adjunto End With ' MiCorreo.Send 'MsgBox "El correo ha sido enviado." ' Set MiCorreo = Nothing ' End If ' Next Celda MsgBox "Correos enviados", vbInformation, "EXCELeINFO" End Sub
Vista de los correos
A continuación te muestro cómo se verán los mensajes enviados.
Figura 4. Vista del correo enviado de Excel usando CDO.