Envio automatico de informes por email con FoxyPreviewer

1,491 views
Skip to first unread message

Jose Ignacio

unread,
Oct 20, 2016, 2:40:23 PM10/20/16
to Comunidad de Visual Foxpro en Español

He implentado FoxyPreviewer en una aplicación que tengo, la verdad es que ha sido muy facil, y funciona de maravilla, pero tengo la necesidad de automatizar el envio de email con un archivo adjunto. El archivo no tiene porque ser un report, pero al no encontrar ninguna forma de enviar sin report he creado uno que lo envio en formato PDF.

En el formato simplificado no he encontrado ninguna opcion que me permita automatizar sin tener que parar en cada correo a ver o aceptar envio, asi que he probado con el metodo completo, la verdad es que con muy pocas lineas he logrado hacer lo que buscaba, el unico problema es que no logro que me use incluya un archivo en formato html como texto del mensaje. Es una pena pues en el formato simplificado si me funciona perfectamente.

He intentado simplificar el codigo para ver si alguien puede comentarme alguna solución. O cualquier otra forma de hacerlo, incluso sin ejecutar el report pues con adjuntar un fichero en PDF, o incluso una imagen en formato JPG tambien me ayudaria bastante.

Muchas gracias de antemano.

El codigo es el siguiente

***********************************************************************************

 

SET PROCEDURE TO LOCFILE("FoxyPreviewer.App") ADDITIVE

LOCAL loReport as "PreviewHelper" OF "FoxyPreviewer.Prg"

loReport = CREATEOBJECT("PreviewHelper")

WITH loReport as ReportHelper

 

       .AddReport("c:\aplicacion\infor\"+"NombredeReport", "NODIALOG")

 

       .cDestFile      = "c:\aplicacion\temp\informe.pdf"

       .lAutoSendMail  = .T.

       .nEmailMode = 2

       .lEmailAuto     = .T.  

       .lSilent        = .T.

       .lQuietMode     = .T.

 

       .cSMTPServer    = "smtp.gmail.com"

       .nSMTPPort      = 465

       .lSMTPUseSSL    = .T.

       .cSMTPUserName  = "usuario"

       .cSMTPPassword  = "*******"

 

       .cEmailTo       = "correo...@gmail.com"

       .cEmailFrom     = "Empresa <usu...@empresa.es>"

       .cEmailSubject  = "Asunto de prueba para probar el correo"

       .cEmailBodyFile = "c:\Mail.html"

 

       .RunReport()

ENDWITH

 

loReport = NULL

 

***********************************************************************************


Saúl Piña

unread,
Oct 20, 2016, 3:38:25 PM10/20/16
to Comunidad de Visual Foxpro en Español
Yo lo hago de la siguiente manera y me ha funcionado bien hasta ahora
1. crear el reporte en mi caso .html
_ticket    =    FULLPATH("")+"TicketsClientes\Ticket"+;
            SPACE
(1)+ALLTRIM(clientesgrid.Nombre)+;
            SPACE
(1)+ALLTRIM(ventas.Ticket)+".html"

Thisform.ticketemail = _ticket

IF FILE
(_ticket)
        thisform
.olecontrol1.navigate(_ticket)
    ELSE
        IF MESSAGEBOX
("No existe el Archivo de este ticket, desea crearlo?",4+32,"Atención") =6
            DO LOCFILE
("FoxyPreviewer.App")
            SELECT ventas_movimientos
            _screen
.Visible= .T.
            KEYBOARD
'{CTRL+F10}'
               
Report Form reportes\ticketCompra OBJECT TYPE(15) To FILE(_ticket)
            _screen
.Visible = .F.
            thisform
.olecontrol1.navigate(_ticket)
            RETURN
0
        ELSE
       
        ENDIF
               
    ENDIF


2. Enviar adjunto por email. se supone que ya tengo los datos para los emails en una tabla.

LOCAL _archivoEmail as Character
_archivoEmail
= Thisform.ticketemail
*WAIT window _archivoEmail

Do FoxyPreviewer.App
With _Screen.oFoxyPreviewer
   
.lEmailAuto     = .T.   && Automatically generates the report output file
   
.cEmailType     = "Html" && The file type to be used in Emails (PDF, RTF, HTML or XLS)
   
.nEmailMode     = 2     && 1 = MAPI, 2 = CDOSYS HTML, 3 = CDOSYS TEXT, 4 = Custom procedure
   
.cEmailTo       =  ALLTRIM(clientesgrid.Email) &&&6Alltrim(Thisform.txtemail.Value)
   
.cSMTPServer    = 'smtp.gmail.com'
   
.cEmailFrom     = ALLTRIM(clientesgrid.Email)
   
.cEmailSubject  = "Ticket compra a Crédito (Fecha realizado: "+TTOC(DATETIME())+')'

   
.nSMTPPort      = 465
   
.lSMTPUseSSL    = .T.

   
.cSMTPUserName  =  ALLTRIM(parametros.EmailReceptor) &&&&&Alltrim(tmpvendedor.correo)
   
.cSMTPPassword  =  ALLTRIM(parametros.Pass1)  &&&&&&Alltrim(tmpvendedor.pase)
   
.lReadReceipt   = .T.
   
.lPriority      = .T.
     
.cEmailBody = "<HTML><BR>"+ "Adjunto Ticket compra a crédito en Jugos Itzamara" + TTOC(DATETIME())+" </b></HTML>"

    cfile
= _archivoEmail    &&&'file://'+FULLPATH(CURDIR())+'firmas\firma.html'
   
.cEmailBodyFile = cfile
   
.SendEmailUsingCDO(cfile)
ENDWITH


saludos.

HernanCano

unread,
Oct 20, 2016, 5:09:45 PM10/20/16
to Comunidad de Visual Foxpro en Español
Jose:
Estoy de acuerdo con Saúl.

Quizá la clave de esta solución está en el uso de "  KEYBOARD '{CTRL+F10}'  " para que se "salga automáticamente" del preview. Sería lo que --tal vez-- debas implementarle a tu solución original con el método standard (no el "completo" como lo llamas tú).
Message has been deleted

HernanCano

unread,
Oct 20, 2016, 5:32:06 PM10/20/16
to Comunidad de Visual Foxpro en Español
Con tu permiso, Saúl.

Solicito a los admores del grupo bloquear el spam que está llegando de balaton.....

Interak

unread,
Oct 20, 2016, 5:35:01 PM10/20/16
to Comunidad de Visual Foxpro en Español
Yo lo utilizo así:
 
WITH _SCREEN.oFoxyPreviewer
      .lSilent=.T.
      vdirtmp = "c:\Temp\hhh.pdf"
      vreport = "REPORT FORM '" +SYS(5)+ SYS(2003) + "\reports\report.frx' "  + " OBJECT TYPE 10 To File "  + "'" + vdirtmp + "'"
      &vreport


      .cEmailTo = xcorreo &&correo cliente
      .lEmailAuto = .T. && Automatically generates the report output file
      .cEmailType = "PDF" && The file type to be used in Emails (PDF, RTF, HTML or XLS)
      .nEmailMode = 2 && 1 = MAPI, 2 = CDOSYS HTML, 3 = CDOSYS TEXT, 4 = Custom procedure 37
* GMAIL
      .cSMTPServer = "smtp.gmail.com"
      .cEmailFrom = "usu...@gmail.com"
      .cEmailSubject = "Gestion de Cobro"
      .nSMTPPort = 465
      .lSMTPUseSSL = .T.
      .cSMTPUserName = "suco...@gmail.com"
      .cSMTPPassword = "sucontraseña"
      .lReadReceipt = .T.
      .lPriority = .T.
      *.cAttachments = GETFILE() && Comma delimited
* Other possible properties
*!* .cEmailCC
*!* .cEmailBCC
*!* .cEmailReplyTo
      .cEmailBody = "<HTML><BR>GESTION DE COBRO<BR><b>Adjunto documento pdf con el cobro correspondiente</b></HTML>"
      .SendEmailUsingCDO("c:\Temp\hhh.pdf")
   ENDWITH

Carlos Hidalgo

unread,
Oct 20, 2016, 5:40:04 PM10/20/16
to publice...@googlegroups.com
Tengo el presentimiento que uno de los amdinistradores hizo un prestamo y de esta forma lo estan presionando para que pague

jajajaja

HernanCano

unread,
Oct 20, 2016, 5:50:03 PM10/20/16
to Comunidad de Visual Foxpro en Español
Muy bien. Muchísimas gracias. Con .lSilent queda mejor.

Pero también te cambiaría 

      vreport = "REPORT FORM '" +SYS(5)+ SYS(2003) + "\reports\report.frx' "  + " OBJECT TYPE 10 To File "  + "'" + vdirtmp + "'"
      &vreport

por 

Report Form (SYS(5)+ SYS(2003) + "\reports\report.frx") OBJECT TYPE(15) To FILE (vdirtmp)

********** perdón... no tengo a la mano conocer la diferencia entre los Object Type 10(PDF) y 15(HTML??).

Jose Ignacio

unread,
Oct 21, 2016, 4:01:50 AM10/21/16
to Comunidad de Visual Foxpro en Español

Muchas gracias a todos por vuestro tiempo, os agradezco un monton vuestra rapida respuesta, voy a probar todas las opciones que me proponeis, me parececen muy interesantes.
Message has been deleted

Jose Ignacio

unread,
Oct 23, 2016, 1:11:16 PM10/23/16
to Comunidad de Visual Foxpro en Español

He probado las sugerencias propuestas, me parecen muy interesantes, de hecho no sabía que se podía enviar un adjunto que ya tenías creado, y me ha venido genial pues para este caso es lo que necesitaba, pues envió el mismo archivo en todos los correos, esto me evita tener que crearlo cada vez.

He reescrito el código tal como me indicáis y funciona perfectamente, pero sigue sin funcionarme incluir una firma al final del cuerpo del correo con los datos de la empresa. Veo que en un ejemplo usáis la opción cEmailBodyFile pero por más que lo he probado no logro que me lo coja. He creado un fichero HTML muy sencillo con los datos de la empresa, sin imágenes, solo texto, pero necesitaba que estuviera en un archivo independiente, pues el propio cliente lo necesita retocar de vez en cuando, y lo he ubicado en el raíz del  disco duro para hacer las pruebas. Lo he llamado “firmas.html”. Después lo indico en la opción pero como digo no me lo añade al cuerpo del mensaje. Esta misma opción la uso cuando envió un correo pero primero previsualizando el informe y desde allí pinchando en el botón de “Enviar email” y me funciona perfectamente, a lo mejor es que si no muestra el correo en pantalla antes de enviar no lo carga.

¿A vosotros si os funciona esta opción en el ejemplo que me enviasteis? Vuelvo a subir el código que uso ya rectificado según vuestros consejos y simplificado al máximo, en el solo envió un archivo ya en PDF, detallo el asunto y un pequeño texto en el cuerpo, y le indico que me coja la firma de la empresa. Lo he probado también sin usar cEmailBody, por si interfería con cEmailBodyFile pero tampoco me añade la firma

De nuevo muchas gracias,

 

 El código es el siguiente

***********************************************************************************

 

local lcEmailBodyFile,lcDestFile

 

lcEmailBodyFile = "c:\Mail.html"

lcDestFile      = "c:\informe.pdf"

 

Do FoxyPreviewer.App

 

WITH _SCREEN.oFoxyPreviewer

      .cLanguage = "SPANISH"

 

      .nEmailMode = 2

      .lEmailAuto = .T.

      .cEmailType = "PDF"

      .lSilent    =.T.

     

      .cSMTPServer    = "smtp.gmail.com"

      .nSMTPPort      = 465

      .lSMTPUseSSL    = .T.

      .cSMTPUserName  = "usuario"

      .cSMTPPassword  = "*******"

 

      .cEmailTo       = "correo...@gmail.com"

      .cEmailFrom     = "Empresa <usu...@empresa.es>"

      .cEmailSubject  = "Asunto de prueba para probar el correo"

           

      .cEmailBody     = "<HTML><BR>Información sobre su pedido. Etc.....</b></HTML>"

      .cEmailBodyFile = lcEmailBodyFile

 

      .SendEmailUsingCDO(lcDestFile)

ENDWITH

 

***********************************************************************************

HernanCano

unread,
Oct 23, 2016, 8:30:59 PM10/23/16
to Comunidad de Visual Foxpro en Español
Jose Ignacio:

Las propiedades son excluyentes: si utilizas una es por que no utilizas la otra.

Ajusta tu escenario a este comentario y nos cuentas.

Jose Ignacio

unread,
Oct 24, 2016, 4:20:00 AM10/24/16
to Comunidad de Visual Foxpro en Español
Muchas gracias por tu respuesta,

Efectivamente HernanCano, suponia que eran excluyentes, y primero probe solo con la propiedad cEmailBodyFile, pero como no me funcionaba, y revisando el mensaje de Saul vi que el ponia los dos, pues hice tambien una prueba asi, y fue la que copia al mensaje. Tambien probe solo con cEmailBody y esta opcion me funciona bien, es cuando intento que carge un fichero html cuando no lo consigue. Tambien por asegurarme de que no era problema del fichero de firmas probe a usar dicho fichero pero previsualizando el report y pinchando en el boton de enviar por email y de esa forma si me coge correctamente la firma y me la incluye en el cuerpo del mensaje. Por eso os preguntaba si a alguno os funcionaba el envio de email sin previsualizar report y cargando una firma.

Si veo que no es posible, probare a abrir el fichero HTML con fopen y pasar su contenido a cEmailBody, pero me temo que si el fichero tiene muchos datos me de error, pues no se el maximo que puede cargar en caracteres la propiedad cEmaiyBody

Un abrazo.


HernanCano

unread,
Oct 24, 2016, 8:37:20 PM10/24/16
to Comunidad de Visual Foxpro en Español
Correcto, Ignacio.

Entonces esó es lo que se debe informar: has detectado un probable bug en cuanto que las dos propiedades no se puden usar juntas en modo "automático". Funcionan bien en modo interactivo, pero no "ambas juntas en modo automático".

Eso ya se le puede informar a César.

Trata de implementar algún workaround y se lo pasas a César o lo publicas por aquí. Es conveniente no esperar que él (o cualq programador de las utilidades primarias de este foro) haga todo. Le ayudamos con una probable solución y él buscará cómo ajustaro al escenario final.

Chao.

HernanCano

unread,
Oct 24, 2016, 8:38:51 PM10/24/16
to Comunidad de Visual Foxpro en Español
Otra alternativa:

Trata de enviar todo dentro del mismo HTML y sólo utilizas .cEmailBodyFile.... por ejemplo....

Jose Ignacio

unread,
Oct 25, 2016, 4:25:00 AM10/25/16
to Comunidad de Visual Foxpro en Español

Muchas gracias HernanCano

He probado lo que me dices, solo usar cEmailBodyFile y tampoco me funciona, por lo que llego a la conclusión de que el problema es exclusivamente de este parámetro (en modo automático) independientemente de si se usa cEmaiBody.

Para solucionarlo lo que hago es que si detecto que se quiere enviar firma, leo fichero a bajo nivel y lo paso directamente al parámetro cEmailBody

Adjunto los códigos lo más simplificados posible. Lo público aquí pues no sé cómo pasárselo a Cesar, si me indicáis su blog o correo se lo paso a el también.

Un abrazo y muchas gracias de nuevo por hacer que estos foros funcionen tan bien.

 

***********************************************************************************

&& Ejemplo de envio automatico con uso de cEmailBodyFile que no me funciona

 

local lcEmailBodyFile,lcDestFile

 

lcEmailBodyFile = "c:\Mail.html"

lcDestFile      = "c:\informe.pdf"

 

Do FoxyPreviewer.App

 

WITH _SCREEN.oFoxyPreviewer

      .cLanguage = "SPANISH"

 

      .nEmailMode = 2

      .lEmailAuto = .T.

      .lSilent    =.T.

 

      .cSMTPServer    = "smtp.gmail.com"

      .nSMTPPort      = 465

      .lSMTPUseSSL    = .T.

      .cSMTPUserName  = "usuario"

      .cSMTPPassword  = "*******"

 

      .cEmailTo       = "correo...@gmail.com"

      .cEmailFrom     = "Empresa <usu...@empresa.es>"

      .cEmailSubject  = "Asunto de prueba para probar el correo"

 

      .cEmailBodyFile = lcEmailBodyFile

 

      .SendEmailUsingCDO(lcDestFile)

ENDWITH

 

***********************************************************************************

 

&& Para solucionarlo si detecto que quiere enviar fichero html lo cargo como Cuerpo directamente

                                                               

LOCAL lnTamaFich

lnTamaFich=0

 

IF !empty(lcEmailBodyFile)

      if file(lcEmailBodyFile)

            Fi=FOPEN(lcEmailBodyFile)

            lnTamaFich=FSEEK(Fi,0,2)

            =FSEEK(Fi,0,0)

            IF lnTamaFich > 0

                  lcEmailBody=FREAD(Fi,lnTamaFich)

            ENDIF

            =FCLOSE(Fi)

      endif

ENDIF

 

.cEmailBody = lcEmailBody

 

***********************************************************************************

 


Reply all
Reply to author
Forward
0 new messages