Hola invitado         02 Sep, 2010 - 04:49
Menú principal
 
Ads
 
Patrocinadores
 
Anuncios
 
© 2009 PortalFox
Mas sobre el envio de mensajes de correo electrónico desde Visual FoxPro lecturas 10812
 Enviado por LuisMaria en Lunes, 21 Julio, 2008
Artículos Un artículo mas sobre el tema de enviar mensajes de correo electrónico desde Visual FoxPro.

Mas sobre el envio de mensajes de correo electrónico desde Visual FoxPro

Luis María Guayán Por Luis María Guayán, Tucumán, Argentina


Existen muchas herramientas y formas de enviar mensajes de correo electrónico desde Visual FoxPro, y seguramente por ello, existen muchos artículos y códigos escritos sobre este tema. La razón de escribir mas de los mismo, es comentarles sobre mi experiencia y elección personal, de la herramienta que utilizo actualmente, la cual me satisface y cubre todas mis necesidades. Estoy convencido que lo mismo le sucede a muchos desarrolladores y espero que al terminar de leer estas líneas, esto ayude a muchos mas.

The winner is ...

Como indico arriba, esto es "mi experiencia y elección personal", obviamente no digo que sea "la mejor", ni digo tampoco "la peor", por lo tanto no entraré en comparación con otras herramientas, solo hablaré de CDO.

¿Qué es CDO?

CDO (Collaboration Data Objects) es un componente COM (Component Object Model) que simplifica la escritura de código para crear y manipular mensajes de Internet y es parte integrante (Cdosys.dll) de los sistemas operativos Windows 2000 y superiores, siendo esta la primer gran ventaja, ya que no necesitamos descargar, comprar, ni licenciar, ninguna otra herramienta extra. CDO no necesita que tengamos un servidor SMTP local, solo necesita acceso a la Web, a algún servidor SMTP que nos permita enviar los mensajes de correo electrónico.

Usando VFP

Otra ventaja adicional, es que se puede utilizar CDO con lenguajes que soporten COM y Automation, y Visual FoxPro lo soporta. A continuación un sencillo código para enviar un mensaje de correo electrónico con CDO desde VFP. Recuerde configurar correctamente el nombre del servidor SMTP, el puerto SMTP, el nombre de usuario y contraseña.

loCfg = CREATEOBJECT("CDO.Configuration")
WITH loCfg.Fields
  .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.mail.com"
  .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
  .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
  .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "user@mail.com"
  .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "password"
  .Update
ENDWITH

loMsg = CREATEOBJECT ("CDO.Message")
WITH loMsg
  .Configuration = loCfg
  .From = "user@mail.com"
  .To = "user1@mail.com.ar"
  .Subject = "Prueba desde VFP"
  .TextBody = "Este es un mensaje de prueba con CDO desde Visual FoxPro."
  .Send()
ENDWITH

Adjuntando archivos en nuestros mensajes

Para enviar archivos adjuntos en un mensaje de correo electrónico, solo debemos llamar al método AddAttachment() del objeto Message, tantas veces como archivos deseamos adjuntar, con la ruta y el nombre del archivo como parámetros:

WITH loMsg
 .AddAttachment("C:\Imagenes\Foto1.jpg")
 .AddAttachment("C:\Imagenes\Foto2.jpg")
 .AddAttachment("C:\Imagenes\Foto3.jpg")
ENDWITH

Autenficación y cifrado SSL

Algunos servidores SMTP, necesitan autentificación y cifrado SSL para iniciar sesión. Para ello debemos configurar las propiedadades smtpauthenticate y smtpusessl del objeto Configuration con el valor .T..

WITH loCfg.Fields
  .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = .T.
  .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = .T.
ENDWITH

Mensajes a múltiples destinatarios

Para enviar el mensaje de correo a mas de un destinatario, solo debemos separar las direcciones de correos electrónicos, con el caracter "," (coma) en la propiedad To. También podemos agregar una copia para otro destinatario, como así también una copia oculta, configurando las propiedades Cc y Bcc respectivamente.

WITH loMsg
 .To = "user1@mail.com, user2@mail.com"
 .Cc = "user3@mail.com"
 .Bcc = "user4@mail.com"
ENDWITH

Podemos hacer que aparezca el nombre completo del remitente y/o del destinatario, anteponiendo el nombre a la dirección de correo electrónico, y encerrando ésta última entre "<" y ">"

WITH loMsg
 .From = "Jose Fox <jose@fox.org>"
 .To = "Usuario Uno <user1@mail.com>, Usuario Dos <user2@mail.com>"
ENDWITH

Mensajes con formato HTML

Con CDO muy fácilmente se puede enviar mensajes de correo electrónico con formato HTML, solamente configurando la propiedad HTMLBody con código HTML válido, en lugar de configurar la propiedad TextBody que es válida para los mensajes con texto sin formato.

WITH loMsg
  .HTMLBody = "<p>Este es un texto HTML con <b>negritas</b> o con <i>cursivas</i>.</p>"
ENDWITH

Esta propiedad la podemos configurar con el contenido de un archivo HTML con la función FILETOSTR() como se muestra a continuación.

WITH loMsg
  .HTMLBody = FILETOSTR("C:\Archivo.htm")
ENDWITH

Mas adelante veremos otra manera de dar formato HTML a un mensaje de correo electrónico, a partir de un archivo HTML ubicado en el disco local o la Web.

Solicitando confirmación de lectura

Podemos configurar nuestros mensajes de correo electrónico para solicitar una confirmación de lectura y recibir ésta confirmación en la dirección predeterminada u otra (siempre y cuando el servidor y/o el programa cliente del destinatario tengan habilitada esta opción). El código para solicitar y recibir la confirmación de lectura en la misma dirección de correo del remitente es el siguiente:

WITH loMsg
  .From = "user@mail.com"
  .Fields("urn:schemas:mailheader:disposition-notification-to") = .From
  .Fields("urn:schemas:mailheader:return-receipt-to") = .From
  .Fields.Update
ENDWITH

Marcar los mensajes con importancia y prioridad

Otra opción que nos brinda CDO es configurar la importancia y prioridad de nuestros mensajes de correo electrónico, marcándolos como Normal (por omision), Alta o Baja. Por ejemplo el código para marcar un mensaje con importancia y prioridad Alta es:

WITH loMsg
  *-- Prioridad
  && -1=Low, 0=Normal, 1=High
  .Fields("urn:schemas:httpmail:priority") = 1
  .Fields("urn:schemas:mailheader:X-Priority") = 1
  *-- Importancia
  && 0=Low, 1=Normal, 2=High
  .Fields("urn:schemas:httpmail:importance") = 2
  .Fields.Update
ENDWITH

Mensajes con imágenes

Bueno, hasta aquí todo marcha bien sin mayores complicaciones; ahora solo nos faltaría saber como añadir imágenes a nuestros mensajes de correo con formato HTML.

Una opción simple, es que en el código HTML hagamos referencia a una URL de un sitio donde este almacenada la imagen, de esta forma se mostrará, siempre y cuando, se tenga acceso a internet. Esta opción tiene a favor que el mensaje enviado tiene un tamaño pequeño, ya que las imágenes estan almacenadas en algún lugar de la Web.

WITH loMsg
  .HTMLBody = "<p><img src='http://www.portalfox.com/logo.gif'></p>" + ;
    "<p>La imagen de arriba esta ubicada en el sitio de PortalFox.</p>"
ENDWITH

Otra opción es embebiendo las imágenes en el mensaje de correo. Para ello tenemos direrentes maneras de hacerlo.

Una forma es reemplazando el contenido: SRC='c:\Imagenes\Imagen10.gif' en la etiqueta IMG, por un ID de Contenido, como por ejemplo: SRC='cid:imagen10-gif'. La ruta y nombre del archivo de imagen, como el ID de Contenido, lo pasamos como parámetro al método AddRelatedBodyPart() que agregará un objeto imagen al cuerpo del mensaje.

WITH loMsg
  .HTMLBody = "<p><img src='cid:id_imagen10'></p>" + ;
    "<p>La imagen de arriba esta embebida en el mensaje.</p>"
  loBP = .AddRelatedBodyPart("c:\Imagenes\Imagen10.gif", "id_imagen10", 1)
  WITH loBP.Fields
    .Item("urn:schemas:mailheader:Content-ID") = "id_imagen10"
    .Update
  ENDWITH
ENDWITH

Esta forma de embeber las imágenes en los mensajes de correo electrónico, se utiliza cuando generamos programáticamente toda la cadena HTML y las imágenes son muy pocas. Cuando la cantidad de imágenes aumenta, este método resulta un poco engorroso.

La otra manera es directamente tomar un archivo HTML, ya sea desde la Web o del disco local, con el método CreateMHTMLBody(), y éste convierte automáticamente los enlaces de las imágenes en un ID de Contenido. A continuación vemos la forma de lograr esto con un ejemplo con la opción de si el archivo está almacenado en la Web o en el disco local:

WITH THIS.oMsg
  IF llFileLocal 
    *-- Si el archivo está en el disco local
    .CreateMHTMLBody("file://c:\documentos\archivo.htm", 0)
  ELSE
    *-- Si el archivo está en la Web
    .CreateMHTMLBody("http://www.portalfox.com/articulos/archivos/correo.htm", 0) 
  ENDIF
ENDWITH

Este método es válido, aun si el archivo HTML no contiene imágenes, con lo que lo podemos usar para reemplazar:

WITH loMsg
  .HTMLBody = FILETOSTR("C:\Archivo.htm")
ENDWITH

con:

WITH loMsg
  .CreateMHTMLBody("file://C:\Archivo.htm")
ENDWITH

como indicamos mas arriba.

El ejemplo final

Para terminar veremos un ejemplo completo y funcional de como enviar un mensaje de correo electrónico desde Visual FoxPro, con varias de las opciones que mostramos. Vamos a usar una cuenta de Gmail (el servidor SMTP de Gmail requiere autenticación y utiliza cifrado SSL), y enviaremos un mensaje de correo a Usuario Uno, con copia a Usuario Dos, con confirmación de lectura y con formato HTML, tomado de la Web y con imágenes embebidas, y un archivo adjunto que seleccionaremos de nuestro disco.

LOCAL loCfg, loMsg, lcFile, loErr
TRY
  loCfg = CREATEOBJECT("CDO.Configuration")
  WITH loCfg.Fields
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com"
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 465 && ó 587
    .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = .T.
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = .T.
    .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "josefox@gmail.com"
    .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "password"
    .Update
  ENDWITH
  loMsg = CREATEOBJECT ("CDO.Message")
  WITH loMsg
    .Configuration = loCfg
    *-- Remitenete y destinatarios
    .From = "Jose Fox <josefox@gmail.com>"
    .To = "Usuario Uno <user1@gmail.com>"
    .Cc = "Usuario Dos <user2@gmail.com>"
    *- Notificación de lectura
    .Fields("urn:schemas:mailheader:disposition-notification-to") = .From
    .Fields("urn:schemas:mailheader:return-receipt-to") = .From
    .Fields.Update
    *-- Tema
    .Subject = "Ejemplo del " + TTOC(DATETIME())
    *-- Formato HTML desde la Web
    .CreateMHTMLBody("http://www.portalfox.com/articulos/archivos/correo.htm", 0)
    *-- Archivo adjunto
    lcFile = GETFILE()
    IF NOT EMPTY(lcFile)
      .AddAttachment(lcFile)
    ENDIF
    *-- Envio el mensaje
    .Send()
  ENDWITH
CATCH TO loErr 
  MESSAGEBOX("No se pudo enviar el mensaje" + CHR(13) + ;
    "Error: " + TRANSFORM(loErr.ErrorNo) + CHR(13) + ;
    "Mensaje: " + loErr.Message , 16, "Error")
FINALLY
  loMsg = NULL
  loCfg = NULL
ENDTRY

Otros enlaces relacionados al uso de CDO con VFP

Notas finales

He tomado la elección de usar CDO para el envio de los mensajes de correo electrónico en mis aplicaciones hace aproximadamente 20 meses. Desde entonces he creado una una clase que encapsula al objeto CDO, y a medida que aparecieron nuevas necesidades, agregaba nuevos métodos y/o propiedades a la definición de la clase, con lo que logre que los cambios no tengan efectos no deseados en mis aplicaciones anteriores. Es por ello que aconsejo a ustedes a que también hagan su propia clase para el envio de mensajes de correo electrónico, con todas sus necesidades, tomandolas de cada ejemplo de este artículo.

Hasta la próxima,

Luis María


 Versión imprimible  
Mas sobre el envio de mensajes de correo electrónico desde Visual FoxPro | Entrar/Crear una cuenta | 22 Comentarios
Los comentarios son propiedad de sus respectivos autores.
No somos responsables de su contenido.

Re: Mas sobre el envio de mensajes de correo electrónico desde Visual FoxPro


por rene_salamanca (renehs@latinmail.com) en 21 Jul, 2008 - 04:31
(Información del usuario  | Enviar un mensaje http://www.portalfox.com)
Como siempre una vez mas enseñadonos, gracias por todo el apoyo que le das a la comunidad y por el tiempo dedicado a compartir de manera desinteresada tus conocimientos.

Un abrazo desde Colombia.

Cordialmente.


Rene Salamanca


Re: Mas sobre el envio de mensajes de correo electrónico desde Visual FoxPro


por r_herrerab en 21 Jul, 2008 - 06:26
(Información del usuario  | Enviar un mensaje 
Muchas gracias Luis por tus aportes son de gran ayuda para nosotros.

Un Saludo desde Chile

Rodrigo Herrera.

Re: Mas sobre el envio de mensajes de correo electrónico desde Visual FoxPro


por HALCON-VF en 29 Ago, 2008 - 06:17
(Información del usuario  | Enviar un mensaje 
Luis Maria, tu articulo me parecío muy interesante. Lo haces ver todo muy sencillo. Gracias por la explicación tan detallada y documentada con ejemplos.

El mundo de las .dll es un misterio para mi, por lo te pido el favor me expliques como llegaste a conocer los secretos de cdosys.dll. por ejemplo en:

loCfg = CREATEOBJECT("CDO.Configuration")
WITH loCfg.Fields
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.mail.com"
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "user@mail.com"
.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "password"
.Update
ENDWITH

cómo sabes que estos son los campos y no otros? y como sabes que valor pasar a cada campo?

De antemano agradezco tu respuesta, mi nombre es Dario Guerrero, dario_guerrero@hotmail.com



alguien me puede ayudar con referente a esto


por boshhh en 02 Oct, 2008 - 01:44
(Información del usuario  | Enviar un mensaje 
me sale un error 1429

y ya le coloque el usuario pasword smtp

Re: Mas sobre el envio de mensajes de correo electrónico desde Visual FoxPro


por cmra (cmra45@gmailcom) en 10 Oct, 2008 - 06:29
(Información del usuario  | Enviar un mensaje 
Saludos Luis Maria

Te cuento que tengo un sistema de calificaciones y me toca enviarle los boletines de alumnos, a todos los padres de familia por correo electronico desde el sistema estos boletines estan en archivos pdf.

tome tus anotaciones pero me sale un error ERROR DE TRANSPORTE EN LA CONEXION DEL SERVIDOR, todos ellos tiene correo en gmail.

lo otro es que no he podido generar los pdf a travez de codigo, y toca generarlos uno a uno por el preview del informe mediante la instalacion de una impresora PDF

TE AGRADESCO TU COLABORACION EN LO QUE MAS PUEDAS, MI CORREO ES CMRA45@GMAIL.COM

ATTE

Carlos Mario Rivera Ayala
Colombia - Choco - Quibdó

  • Re: Mas sobre el envio de mensajes de correo electrónico desde Visual FoxPro


    por delioaperez en 24 Mar, 2009 - 09:47
    (Información del usuario | Enviar un mensaje
    Necesito crear archivos PDF con codigo desde Visual FoxPro 6.0. Mi email es delioaperez@gmail.com

    [ No se permiten comentarios a los usuarios anónimos. Por favor, Inicia tu cuenta o registrate ]

  • Re:Crear PDF desde FoxPro


    por delioaperez en 24 Mar, 2009 - 09:48
    (Información del usuario | Enviar un mensaje
    Necesito crear archivos PDF con codigo desde Visual FoxPro 6.0. Mi email es delioaperez@gmail.com

    [ No se permiten comentarios a los usuarios anónimos. Por favor, Inicia tu cuenta o registrate ]

  • Re: Mas sobre el envio de mensajes de correo electrónico desde Visual FoxPro


    por ashernandez en 18 Abr, 2009 - 10:52
    (Información del usuario  | Enviar un mensaje 
    Excelente informacion, de antemano una felicitacion. lo he probado y funciona perfectamente, ahora viene mi duda, hay forma de hacer lo mismo pero a traves de mi outlook? .

    tengo un programa que recibe los reportes de fallas de toda la empresa pero quiero que envie el aviso de recepcion de reporte via email, a traves de mi cuenta empresarial, es posible???

    Re: Mas sobre el envio de mensajes de correo electrónico desde Visual FoxPro


    por joe90 en 04 Nov, 2009 - 01:46
    (Información del usuario  | Enviar un mensaje 
    Fue de gran ayuda esta rutina, gracias Luis.
    Con el servidor de Gmail funciono muy bien.
    Con otro tipo de servidor (arnet, etc) no funciona, error de transporte.
    Como lo puedo solucionar ??

    Saludos y gracias.
    JOse

    Espectácular


    por eumar (eugenio@eumar.com.ar) en 06 Ene, 2010 - 03:21
    (Información del usuario  | Enviar un mensaje http://www.eumar.com.ar)
    Lo que me has enseñado con estas explicaciones no tiene precio, pero sí un inmenso GRACIAS por tu aporte a mi cerebro.
    Eugenio Marceca (BSAS)

    Re: Mas sobre el envio de mensajes de correo electrónico desde Visual FoxPro


    por alexcor10 en 11 Ene, 2010 - 09:14
    (Información del usuario  | Enviar un mensaje 
    Hola que tal, de ante mano gracias por tu aportación apenas voy a implementar la solución que nos diste, mi pregunta es como hacer lo inverso? es decir como descargar el archivo adjunto de manera automatica sin q tenga que usar el outlook o entrar a gmail y descargar el archivo enviado.
    Espero me puedas orientar, una vez mas gracias por la ayuda saludos.

    • Re: Mas sobre el envio de mensajes de correo electrónico desde Visual FoxPro


      por alexcor10 en 14 Ene, 2010 - 01:47
      (Información del usuario | Enviar un mensaje
      Buenos Dias:
      Espero me pueda orientar, hice una aplicacion que me genera un archivo zip con mis tablas y con la ayuda de usted pude enviarlas a una cuenta de correo electronico, ahora necesito descargar ese archivo adjunto de manera automatica.
      De ante mano muchas gracias.

      [ No se permiten comentarios a los usuarios anónimos. Por favor, Inicia tu cuenta o registrate ]

    Re: Mas sobre el envio de mensajes de correo electrónico desde Visual FoxPro


    por estebantobio en 21 May, 2010 - 06:17
    (Información del usuario  | Enviar un mensaje 
    Hola Luis María, muy bueno el articulo me saco de apuros. pero se me presento un problema y no se si es un error mio, que no lo puedo detectar.
    Cuando envió un correo con un archivo adjunto ZIP, sale perfectamente pero cuando lo reciben y bajan el archivo esta roto, si envió el mismo archivo por Outlook anda todo bien. me podrías ayudar. Gracias
    Esteban Tobío

    GRACIAS !!


    por sistemascls en 24 May, 2010 - 11:51
    (Información del usuario  | Enviar un mensaje 
    Hola:

    Precisamente estaba buscando la manera de enviar correos desde VFP9
    Tarde como 10 minutos en encontrar, leer y probar tu codigo.
    Me funciono perfectamente para lo que necesito.
    Muchisimas Gracias

    Re: Mas sobre el envio de mensajes de correo electrónico desde Visual FoxPro


    por manuelbarredo (asdfasdfasdfasdfasdf) en 28 May, 2010 - 10:43
    (Información del usuario  | Enviar un mensaje 
    Gracias Luis de antemano.
    Lo probe con mi cuenta, y funciono excelente , con gmail tambien excelente , pero quise configurar con una cuenta de hotmail y me manda un error. no se puedan decierme en donde esta el error :
    SMTP: smtp.live.com
    Puerto: 25 Segun.
    Algo le falta o poque me manda un error numero: 1429
    OLEIDispathc exception code 0 from CDO.Message.1:Error transpofte en la conexion al servidor.


    De antemano muchas gracias.

    Re: Mas sobre el envio de mensajes de correo electrónico desde Visual FoxPro


    por delioaperez en 24 Jun, 2010 - 06:37
    (Información del usuario  | Enviar un mensaje 
    Hola, envio los correos electronicos pero cuando pongo un archivo PDF como archivo adjunto, este llega y no abre bien, por que ??? Mi email es delioaperez@gmail.com

    Re: Mas sobre el envio de mensajes de correo electrónico desde Visual FoxPro


    por willy_zuluaga en 30 Jun, 2010 - 05:42
    (Información del usuario  | Enviar un mensaje 
    MUCHAS GRACIAS LUIS, CASI QUE NO LOGRO ENVIAR EL CORREO CON ARCHIVO ADJUNTO DESDE VFP6, ME SALIA EL MISMO ERROR QUE LOS COMPAÑEROS COMENTAN, PERO AL FINAL PUDE...PERO CON ESTE ARTICULO TODO QUEDA MUY CLARO Y APRENDE UNO LAS DIVERSAS POSIBILIDADES.




    Todas las marcas y los logos utilizados en este sitio son propiedad de sus respectivos dueños.
    Los artículos, noticias y comentarios son propiedad y responsabilidad de sus respectivos autores.
    Copyright © 2000-2010 PortalFox. Todos los derechos reservados.