Hola
Llevo algún tiempo desarrollando una aplicación interna que debe seleccionar datos de una consulta y enviarlos por correo electrónico. Como no he encontrado por internet nada que resuelva el problema, y dado que hay multitud de información desfasada por internet, voy a exponer aquí la solución que le he dado, teniendo todos los datos juntos.
En una primera aproximación, intenté utilizar la expresión:
DoCmd.SendObject
Esta expresión está bien, y funciona. Tiene el problema de que necesita que esté instalado Outlook, y además toma como remitente al usuario por defecto. Esa no era mi intención. Yo quería entrar en el servidor de correo con un usuario diferente (que los receptores puedan identificar como robot) y enviar los datos.
Mi segunda aproximación fue creando un objeto CDO.Message. Esto solo funciona si se activa en Herramientas|Referencias las librerías Microsoft CDO 1.21 Library y Microsoft CDO for Windows 2000 Library. Si tienes otra versión de Office, quizás cambien las versiones de las librerías CDO. A continuación, vía código, lo hice de la siguiente manera (las variables destinatario1, title, txt1, etc. las asigné por código previamente, leyendo desde la consulta):
Dim cdoMsg As New CDO.Message
With cdoMsg
With .Configuration.Fields
.Item(cdoSendUsingMethod).Value = cdoSendUsingPort
.Item(cdoSMTPServerPort).Value = 25
.Item(cdoSMTPServer).Value = "servidor.desalida.com"
.Item(cdoSendUserName).Value = "direccion@dominio.com"
.Item(cdoSendPassword).Value = "Contraseñadeldominio"
.Item(cdoSMTPAuthenticate).Value = 1 'cdoBasic
.Item(cdoSMTPUseSSL).Value = False
.Update
End With
.From = """NOMBREdelEmisorDelCorreoQueQuieroQueAparezca""" & "remitente@dominio.com"
.To = """Receipient""" & destinatario1
.Subject = title
.TextBody = txt1 & vbNewLine & vbNewLine _
& txt15 & vbNewLine & vbNewLine _
& txt16 & vbNewLine & vbNewLine _
& txt2 & vbNewLine & vbNewLine _
& txt3 & vbNewLine & vbNewLine _
& txt4 & vbNewLine & vbNewLine _
& txt5 & vbNewLine & vbNewLine _
& txt6 & vbNewLine & vbNewLine _
& txt7 & vbNewLine & vbNewLine _
& "Nota: No responder a este mensaje."
'Debug.Print .TextBody ---->línea para hacer pruebas. Es prescindible
'.AddAttachment App.Path & "\attach.txt" --->Solo si hay archivos adjuntos
On Error Resume Next
.Send
DoEvents ----> como lo pongo en un bucle, no quiero que intente enviar el siguiente antes de haber terminado de enviar el actual
End With
Set cdoMsg = Nothing ----> Limpio memoria (no sé si es necesario o si lo limpia automáticamente vba, pero creo que no sobra)
-----------------------------------------------------
El problema de este código es que manda el correo en texto plano, por lo que es difícil hacer tablas y cosas por el estilo. Por lo tanto, busqué la mejora, principalmente por hacerlo bonito. Es la siguiente:
Sustituir la línea .TextBody por .HTMLBody
Y sustituir todo el chorizo de txt1 & vbNewLine & vbNewLine ....... por una variable que incluye código HTML.
Por lo tanto, debo definir previamente mi documento HTML, con su CSS correspondiente. Esto lo hago mediante código, y me voy componiendo las distintas partes del mensaje. Es importante saber que no es necesario introducir indentados ni saltos de línea, etc. Todo eso está muy bien para entenderlo tú cuando lo miras en pantalla, pero el ordenador lo entiende perfectamente. A estos efectos, propongo lo siguiente:
- Crear el diseño HTML con tu programa favorito como diseñas HTML habitualmente (no seas vago, hay cursos rapidísimos por internet para aprender esto)
- Introducir dentro del HTML el CSS correspondiente (mediante la etiqueta <style> dentro de <head>, por ejemplo)
- Utilizar un servicio web para minimizar el código HTML y reducirlo a una sola línea para que sea manejable (por ejemplo http://refresh-sf.com/)
- Descomponerlo en partes fijas y partes variables
- Modificar las partes variables mediante vba
- Asignar el mensaje completo al parámetro .HTMLBody
- En fase de debugging, puedes utilizar un servicio web de HTML Beautifier para pasar del código todojunto a un código legible (por ejemplo http://www.freeformatter.com/html-formatter.html)
Muchas gracias, Cron, por compartirlo y por tus contínuas aportaciones al foro.
------
Ya sé Excel, pero necesito más.
[comentario movido a tema nuevo en el foro http://www.necesitomas.com/enviar-correo-electronico-automaticamente]
Buenas tardes,
les consulto, Como puedo hacer para que en el mail saque datos de una base? es decir que de la base saque un condicional y en base a este copie datos de la misma fila de diferentes columnas.