Excel y WebMail

Como continuación a la interoperatividad de Excel con los servicios de correos, en el presente post trataré de explicar como podemos mandar un libro, una hoja o un pequeño texto escrito en una hoja excel, usando correo webmail.

La primera macro nos va acomprobar el sistema de correo WebMail que tenemos instalado o si no tenemos ninguno:

Sub sistema_decorreo_instalado()
Select Case Application.MailSystem
    Case xlMAPI
        MsgBox «Está utilizando  Microsoft Mail»
    Case xlPowerTalk
        MsgBox «El sistema de correos es PowerTalk»
    Case xlNoMailSystem
        MsgBox «No tiene ningún sistema de correos instalado»
End Select
End Sub

En principio establecemos un flujo de control (Select Case) que va a verificar que clientes de correos tenemos en el equipo, y esto lo hacemos con la propiedad Application.MailSystem, esta es de sólo lectura y soporta tres constantes xlMAPI que verifica si estamos usando un Internet Message Access Protocol (IMAP) , si usamos el sistema de comandoz por voz de Microsoft PowerTalk o no tenemos nada instalado.

A continuación vamos a ver como podríamos enviar una copia de la hoja activa por correo webmail, en mi caso utilizando WebMail de Microsoft 2011:

Sub EnviarHojaPorCorreoElectrónico()
    ActiveSheet.Copy
    ActiveWorkbook.SendMail Recipients:=»fulanito@loquesea.com», Subject:=»Envío de hoja de Excel»
    ActiveWorkbook.Close savechanges:=False
End Sub

Bueno como podrá ver no tiene mucha complicación, hemos utilizado el método SendMail Recipients (algo así como » enviar correo al buzón»…) y poco más.

Supongamos que ahora tenemos una hoja con un texto escrito, y desamos enviar ese texto en concreto. Supongamos que en la celda E1 hemos escrito la dirección del destinatario y en la E2 la del remitente. Aquí va el código:

Function EnviarMails_CDO() As Boolean

    ‘ Creo la variable de objeto CDO
    Dim Email As CDO.Message
    Dim Autentificacion As Boolean

    ‘ ahora doy vida al objeto
    Set Email = New CDO.Message

    ‘indicamos los datos del servidor:
    Email.Configuration.Fields(cdoSMTPServer) = «smtp.gmail.com»
    Email.Configuration.Fields(cdoSendUsingMethod) = 2
    ‘indicamos el nro de puerto. por defecto es el 25, pero gmail usa el 465. hay otro

    Email.Configuration.Fields.Item _
        («http://schemas.microsoft.com/cdo/configuration/smtpserverport») = CLng(465)
    ‘aqui dejamos en claro si el servidor que usamos requiere o nó autentificación.
    ‘1=requiere, 0=no requiere. Para gmail, entonces, 1
    Email.Configuration.Fields.Item(«http://schemas.microsoft.com/cdo/» & _
                «configuration/smtpauthenticate») = Abs(1)
    ‘segundos para el tiempo maximo de espera. aconsejo no modificarlo:
    Email.Configuration.Fields.Item _
        («http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout») = 30

    ‘aqui defino como True (verdadera) a la autentificación para el envío de mails.
    Autentificacion = True
    ‘ahora configuramos las opciones de login de gmail:
    If Autentificacion Then
        ‘nombre de usuario
        Email.Configuration.Fields.Item _
            («http://schemas.microsoft.com/cdo/configuration/sendusername») = «fulanito@gmail.com»
        ‘contraseña
        Email.Configuration.Fields.Item _
            («http://schemas.microsoft.com/cdo/configuration/sendpassword») = «micontraseña de correo»
        ‘si el servidor utiliza SSL (secure socket layer). en gmail: True
       Email.Configuration.Fields.Item _
            («http://schemas.microsoft.com/cdo/configuration/smtpusessl») = True
    End If

        ‘a partir de ahora tomaremos los datos incluidos en el la hoja de excel:
        ‘ Dirección del Destinatario
        Email.To = Trim([e1].Value)

        ‘ Dirección del remitente
        Email.From = Trim([e2].Value)

        ‘ Asunto del mensaje
        Email.Subject = Trim([e3].Value)

        ‘ Cuerpo del mensaje
        Email.TextBody = Trim([e4].Value)

        ‘Ruta del archivo adjunto
        If [e5].Value <> vbNullString Then
            Email.AddAttachment (Trim([e5].Value))
        End If

        ‘antes de enviar actualizamos los datos:
        Email.Configuration.Fields.Update
        ‘colocamos un capturador de errores, por las dudas:
        On Error Resume Next
        ‘enviamos el mail
        Email.Send
        ‘si el numero de error es 0 (o sea, no existieron errores en el proceso),
        ‘hago que la función retorne Verdadero
        If Err.Number = 0 Then
           EnviarMails_CDO = True
        Else
          ‘caso contrario, muestro un MsgBox con la descripcion y nro de error
           MsgBox «Se produjo el siguiente error: » & Err.Description, vbCritical, «Error nro » & Err.Number
        End If

        ‘destruyo el objeto, para liberar los recursos del sistema
        If Not Email Is Nothing Then
            Set Email = Nothing
        End If
        ‘libero posibles errores
        On Error GoTo 0
    End Function

En principio para que pueda funcionar ha de activar la siguiente referencia: Microsoft (CDO for Windows 2000) . Para ver bien los comentarios y comprender el código debería insertarlo en un módulo y hacer las pruebas.

Quizás lo que cueste un poco más de entender son las líneas referentes a las configuraciones de los campos de correo. Necesitamos decirle al sistema como están configurados los campos referentes al remitente, destinatario etc. Y para ello debemos indicarle donde puede encontrar la información pertinente. Bien pues de la misma manera que a veces precisamos acudir a una biblioteca a buscar información de un tema en concreto, aquí hacemos lo mismo. Por ello en primer lugar debemos abrir la biblioteca de objetos CDO , biblioteca donde se encuentra las referencias que el sistema necesita sobre las interfaces de los programas de correos. Eso es lo que hacemos con la línea:

Email.Configuration.Fields.Item _
            («http://schemas.microsoft.com/cdo/configuration/sendusername»)

y siguientes.

En muchos casos no es necesario especificar esas líneas ya que CDO utilizaría por defecto el gestor de correo incluido en la máquina.

Siguiendo con los ejemplos, en la siguiente macro vamos mandar las celdas que seleccionemos de una hoja:

‘Este procedimeinto envía las celdas seleccionadas en el cuerpo del mensaje
‘Seleccione unas cuantas celdas antes de enviar el mensaje

Sub CDO_enviando_un_rango()
    Dim rng As Range
    Dim iMsg As Object
    Dim iConf As Object
    Dim Flds As Variant

    Set iMsg = CreateObject(«CDO.Message»)
    Set iConf = CreateObject(«CDO.Configuration»)

       iConf.Load -1    ‘ CDO valores por defecto
       Set Flds = iConf.Fields
        With Flds
        .Item(«http://schemas.microsoft.com/cdo/configuration/smtpusessl») = True
        .Item(«http://schemas.microsoft.com/cdo/configuration/smtpauthenticate») = 1
        .Item(«http://schemas.microsoft.com/cdo/configuration/sendusername») = «fulanito@gmail.com»
        .Item(«http://schemas.microsoft.com/cdo/configuration/sendpassword») = «contraseñadefulanito»
        .Item(«http://schemas.microsoft.com/cdo/configuration/smtpserver») = «smtp.gmail.com»

        .Item(«http://schemas.microsoft.com/cdo/configuration/sendusing») = 2
        .Item(«http://schemas.microsoft.com/cdo/configuration/smtpserverport») = 25
        .Update
    End With

    Set rng = Nothing
    On Error Resume Next

    Set rng = Selection.SpecialCells(xlCellTypeVisible)

    On Error GoTo 0

    If rng Is Nothing Then
        MsgBox «La selección o no es un rango o la hoja está protegida» & _
               vbNewLine & «corrigalo e inténtelo de nuevo», vbOKOnly
        Exit Sub
    End If

    With Application
        .EnableEvents = False
        .ScreenUpdating = False
    End With

    With iMsg
        Set .Configuration = iConf
        .To = «fulanito@gmail.com»
        .CC = «»
        .BCC = «»
        .From = «»»FULANITO»» <fulanito@gmail.com>»
        .Subject = «Esto es una prueba»
        .HTMLBody = RangetoHTML(rng)
        .Send
    End With

    With Application
        .EnableEvents = True
        .ScreenUpdating = True
    End With

End Sub

Hay que prestar especial cuidado con los firewalls e incluso con los antivirus. Debe verificar que no le están bloqueando las salidas.

En esta macro utilizamos una función VBA propia de Outlook pero que se traslada mediante CDO a Excel :HTMLBody = RangetoHTML(rng) es decir es una función que convierte a código HTML el rango que hayamos seleccionado.

Deja un comentario