Enviar emails de GMAIL o dominio propio desde Excel usando CDO y VBA sin tener un cliente de correo configurado - Sergio Alejandro Campos

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.

Nota 11-oct-2020: Para enviar correos usando una cuenta de Office 365 / Microsoft 365, debemos usar el puerto 25 para el servidor SMTP.

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.

Ver Video Enviar emails desde Excel usando cuenta de Office 365

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.

GMAIL nos permite generar contraseñas temporales para usarlas en aplicaciones menos seguras.

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.

El envío de correos se hará en base a la fecha de vencimiento.

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.

Activamos la librería Microsoft CDO for Windows 2000 Library.

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.

Vista del correo enviado de Excel usando CDO.

Figura 4. Vista del correo enviado de Excel usando CDO.

Descarga el archivo de ejemplo

Descargar el ejemplo Enviar emails desde Excel usando CDO y VBA – EXCELeINFO.zip

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top