Excel y WebMail
21 septiembre, 2011 Deja un comentario
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.