Ir al contenido


Foto

Envio en correo en segundo plano


  • Por favor identifícate para responder
10 respuestas en este tema

#1 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 16 agosto 2012 - 10:15

Hola a todos, tengo una funcion que envia correo con delphi y esta trabaja de lo mejor, ahora lo que quiero es que al momento de facturar se envie un correo al cliente, al momento de enviar el correo se crea cierto retardo en el connect y send, y estos son retardos naturales.

Mi primera idea para evitar esto al momento de facturar es colocarlo en un hilo aparte de la ejecucion y asi lo hice:



delphi
  1. procedure TCorreoBackground.EnviarCorreo;
  2. begin
  3.   TdmCorreo.corre(chostcorreo, cusername, cPassword, cDestinatario, cAsunto, cArchivo, cportcorreo, lsCuerpo);
  4. end;
  5.  
  6. procedure TCorreoBackground.Execute;
  7. begin
  8.   inherited;
  9.   //Envia un correo en segundo plano
  10.   Synchronize(EnviarCorreo);
  11.   Terminate;
  12. end;



Pero aun asi sigue lanzando el mismo efecto de retardo, me imagino que es o natural al momento de que la VCL se esjecuta siempre en el hilo principal de la aplicacion.

Alguna idea para que en verdad se envie en segundo plano???

Gracias  por las ideas
  • 0

#2 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 16 agosto 2012 - 10:28

La verdad es que no lo he probado, pero con un thread no debería de darte ese efecto.

Otra opción sería un ejecutable aparte que recibiera por parámetro los datos a enviar por correo

Nos leemos
  • 0

#3 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 16 agosto 2012 - 10:49

La verdad es que no lo he probado, pero con un thread no debería de darte ese efecto.

Otra opción sería un ejecutable aparte que recibiera por parámetro los datos a enviar por correo

Nos leemos


En eso mismo pensé... un segundo programa que esté a la escucha en determinado puerto y reciba las solicitudes para el envio de correo....


  • 0

#4 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 16 agosto 2012 - 10:51

¿Usas Indy? ¿Probaste a utilizar "anticongelanate" (TidAntifreeze) ?

Por otro lado usando curl no habría problema  ;)
  • 0

#5 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 16 agosto 2012 - 11:10

¿Usas una conexión segura, SSL? Las librerias de SSL tiene problemas para trabajar con varios threads a la vez.
  • 0

#6 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 16 agosto 2012 - 01:13

¿Usas Indy? ¿Probaste a utilizar "anticongelanate" (TidAntifreeze) ?

Por otro lado usando curl no habría problema  ;)


Gracias por la respuesta, con el antifreeze mejoro demasiado,  que es eso de CURL???
  • 0

#7 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 16 agosto 2012 - 01:20

http://es.wikipedia.org/wiki/CURL

Cómo funciona que te lo explique Seaone, que yo ni idea :D :D
  • 0

#8 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 16 agosto 2012 - 01:30

Creo que aun asi no funciona del todo bien, hace el efecto que todo queda bien, pero el programa queda lento mientras se hace el envio.  Solo que ahora si puedes tomar el control
  • 0

#9 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 16 agosto 2012 - 11:56

Creo que aun asi no funciona del todo bien, hace el efecto que todo queda bien, pero el programa queda lento mientras se hace el envio.  Solo que ahora si puedes tomar el control

El "anticongelante" solamente obliga a llamar el método "processmessage" periódicamente desde dentro de las rutinas de Indy, pero aun así no se esta dejando ejecutar normalmente el bucle de mensajes por lo que es normal que la aplicación vaya mas lenta, sobre todo cuando Indy esta haciendo operaciones bloqueantes como resolver una dirección con el DNS. Pero es lo que hay  :D

Si necesitas mas velocidad yo te recomiendo usar libcurl (las librerías basadas en curl) desde dentro de un thread, a no ser que uses ssl (una cuenta de google por ejemplo) por que mezclar threads y ssl es bastante complicado, aunque no es imposible

  • 0

#10 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 17 agosto 2012 - 12:06

Por cierto se me acaba de ocurrir una solución mejor. Aprovechando que estas trabajando contra una base de datos porque no creas una tabla con, por ejemplo, los campos "destino", "asunto", "mensaje", "fecha", "enviado"; y cuando quieras enviar un mensaje solamente lo guardas en esa tabla, que funcionara como si fuera una cola de envíos, algo parecido a la cola de impresión de windows.

Otro programa, o servicio, que se estará ejecutando continuamente tendría que revisar periódicamente la tabla en busca de mensajes nuevos y enviarlos por orden, marcándolos después como enviados o simplemente borrandolos de la tabla.

Este seria el funcionamiento basico, luego podrias añadir mas funciones como una pantalla donde se pudiera revisar la cola con mensjaes pendiente, ver mensajes enviados, programar los mensajes para que salgan a en una fecha y hora determinadas, espaciar en el tiempo los mensajes para que nuestro proveedor no nos bloquee la cuenta por spam ... etc

Ahí te dejo la idea  :D
  • 0

#11 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 17 agosto 2012 - 07:15

Por cierto se me acaba de ocurrir una solución mejor. Aprovechando que estas trabajando contra una base de datos porque no creas una tabla con, por ejemplo, los campos "destino", "asunto", "mensaje", "fecha", "enviado"; y cuando quieras enviar un mensaje solamente lo guardas en esa tabla, que funcionara como si fuera una cola de envíos, algo parecido a la cola de impresión de windows.

Otro programa, o servicio, que se estará ejecutando continuamente tendría que revisar periódicamente la tabla en busca de mensajes nuevos y enviarlos por orden, marcándolos después como enviados o simplemente borrandolos de la tabla.

Este seria el funcionamiento basico, luego podrias añadir mas funciones como una pantalla donde se pudiera revisar la cola con mensjaes pendiente, ver mensajes enviados, programar los mensajes para que salgan a en una fecha y hora determinadas, espaciar en el tiempo los mensajes para que nuestro proveedor no nos bloquee la cuenta por spam ... etc

Ahí te dejo la idea  :D


esta muy buena esa idea, voy a trabajar en ello gracias.
  • 0




IP.Board spam blocked by CleanTalk.