Enviar correo electrónico

4 envíos / 0 nuevos
Último envío
Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 3 semanas
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Enviar correo electrónico

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:

  1. 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)
  2. Introducir dentro del HTML el CSS correspondiente (mediante la etiqueta <style> dentro de <head>, por ejemplo)
  3. 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/)
  4. Descomponerlo en partes fijas y partes variables
  5. Modificar las partes variables mediante vba
  6. Asignar el mensaje completo al parámetro .HTMLBody
  7. 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)
Y ya está. Tienes un correo electrónico en formato HTML con exactamente todos los apartados que tú quieras, el diseño que prefieras, le puedes añadir firma, imágenes, etc. (las imágenes deben estar accesibles, por ejemplo desde un servidor público de imágenes. Seguro que se pueden enviar como attachments, pero no he probado que funcione)
 
Un saludo
 

 

Etiquetas: 

pacomegia
Imagen de pacomegia
Offline
última acción: Hace 3 días 7 horas
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntosadministrador
alta: 27/12/2006 - 23:26
Puntos: 11175
muchas gracias

Muchas gracias, Cron, por compartirlo y por tus contínuas aportaciones al foro.

 

------
Ya sé Excel, pero necesito más.

visitante (no verificado)
Imagen de visitante
Hola, mediante una tabla de
Alan Garcia (no verificado)
Imagen de visitante
Consulta

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.