Foros del Web » Programando para Internet » PHP »

PHP script para envio de correos con cronograma

Estas en el tema de PHP script para envio de correos con cronograma en el foro de PHP en Foros del Web. Hola, probablemente esto sea muy sencillo pero he buscado en este foro y no he encontrado nada al respecto. Mi problema es el siguiente: Para ...
  #1 (permalink)  
Antiguo 14/02/2009, 07:50
 
Fecha de Ingreso: marzo-2005
Mensajes: 41
Antigüedad: 19 años, 1 mes
Puntos: 0
PHP script para envio de correos con cronograma

Hola, probablemente esto sea muy sencillo pero he buscado en este foro y no he encontrado nada al respecto.

Mi problema es el siguiente: Para enviar boletines a los usuarios registrados en mi base de datos (actualmente son 13.000 usuarios) tengo implementado un php script que envía de una sola vez a todos los correos registrados.

El administrador de mi hosting me está solicitando que agregue unas líneas a mi php script para que los correos sean enviados por intervalos de tiempo, ejecutando un script que vaya realizando la tarea cada seg, min, horas, dias, semanas o meses.

Así por ejemplo, cada segundo se puede enviar un correo, garantizando que cada minuto se ha enviado 60 correos, 1 hora 3.600 correos, etc....

Mis conocimientos de programación son muy limitados, por eso me gustaría si alguno de vosotros me puede dar unas líneas de script muy sencillas que pueda añadir a mi programa php para alcanzar este objetivo sin mayores complicaciones .

De antemano muchísimas gracias, realmente necesito esto por exigencias de mi servidor así que cualquier ayuda es altamente agradecida.

Mangels
  #2 (permalink)  
Antiguo 14/02/2009, 21:04
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 18 años
Puntos: 33
Respuesta: PHP script para envio de correos con cronograma

mangels:

Cita:
El administrador de mi hosting me está solicitando que agregue unas líneas a mi php script para que los correos sean enviados por intervalos de tiempo, ejecutando un script que vaya realizando la tarea cada seg, min, horas, dias, semanas o meses.
¿Tienes forma de averiguar si el SAFE MODE de php.ini esta en
OFF o en ON?
¿Y ademas, seria bueno saber como esta el max_execution_time = ?
del php.ini?

Con esa nformacion es facil darte algo definido y facil siempre y cuando
el SAFE MODE este en OFF y el max_execuion_time en 0.
Aunque el max_execution_time lo puedes saber via un
<?php
ini_get('max_execution_time');
?>

Saludos
franco
  #3 (permalink)  
Antiguo 15/02/2009, 07:47
 
Fecha de Ingreso: marzo-2005
Mensajes: 41
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: PHP script para envio de correos con cronograma

Gracias Franco, mi php info es la siguiente:

safe_mode: Off
max_execution_time: 30

¿Es posible hacer el script con esta configuración?

La idea sería enviar un correo por segundo. La base de datos tiene actualmente 14.000 registros.

Gracias de nuevo,
Mangels

Última edición por mangels; 15/02/2009 a las 08:50
  #4 (permalink)  
Antiguo 15/02/2009, 17:01
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 18 años
Puntos: 33
Respuesta: PHP script para envio de correos con cronograma

mangels:

Desde hace mucho tiempo he tenido la necesadad de hacer lo que tu deseas y despues de una cantidad interminable de consultas, busquedas, ideas, ext; encontre algo que me ayudo.

El proceso es el siguiente ->
Realizar un CRON sin utilizar ningun programa CRON, valga la redundancia, NI php como CLI; aunque usted no lo crea aqui te va el detalle.

1.- Haces una archivo activar.php que contenga los siguiente:
<?php
//Abrir una conexion socket hacia cron.php
// $_SERVER['HTTP_HOST'] = 123.456.789.012 (micaso)
$abrirsocket = fsockopen($_SERVER['HTTP_HOST'],80,$errorno,$errorstr,10);
if($abrirsocket) {
$datossocket = "GET /CRONFRanco/CronRevolucionario/cron.php HTTP 1.1\r\n";
$datossocket .= "Host: ".$_SERVER['HTTP_HOST']."\r\n";
$datossocket .= "Connection: Close\r\n\r\n";
fwrite($abrirsocket,$datossocket);
//Normalmente se obtiene toda la Data con fgets y se espera hasta que $socket llega al feof(End of file).
//En este caso solo hacemos esto->
fclose($abrirsocket);
} else {
echo "Hubo Error";
}
?>

2.- Aqui abrimos un socket hacia un archivo que se llamara cron.php e
inmediatamente cerramos el socket. Y cerramos el navegador y de alguna
manera increible has creado un cron cuyas limitantes son:
max_execution_time del php.ini
Ahora bien, si el php.ini contiene esta variable con valor 0; entonces no hay problema y el codigo que te pondre a continuacion correra por dias o meses siempre y cuando todo este encendido.

3.- El cron.php que yo tengo instalado para prueba que lo puedes modificar a tu antojo es el suiguiente->
<?php
set_time_limit(0);
$tiempo = 12000;
for($w = 0; $w < $tiempo; $w++) {
sleep(3);
include("mail.php");
}
?>
OJO -> este codigo, como consecuencia de un BUG o mas bien maravillas de php queda correindo exactamente como un cron.
Puedes probarlo con $tiempos = 20; y sleep(2); y te debera enviar 20 correos
que estan incluidos en el mail.php en 60 segundos o un minuto.
NUEVAMENTE TU LO MODIFICAS A TUS NECESIDADES.

4.- Mi archivo mail.php contiene lo siguiente ->
<?php
$email = "[email protected]";
$asunto = "Esto Es Una Prueba";
$mensaje = "Estamos probando este novedoso sistema de cron de franco!!!.";
mail($email, $asunto, $mensaje);
?>
OJO -> este archivo lo puedes modificar para que $email lo saue de un archivo de trexto o de una base de datos.

Saludos
Y espero te sirva
Franco

P.S. OJO-> Con Windows solo pude detener el cron apagando el Apache o identificando el task o ID de proceso y matarla con un taskkill. De otra manera no se puede detener.
Ten mucho cuidado que No vayas a crear un LOOP o bucle interminable.
P:S OJO2-> Esto funciona dentro del area del servidor por tanto puedes tener acceso desde Internet; es decir lo puedes activar remotamente y aqui va lo mas importante y delicado: ES TREMENDAMENTE PELIGROSO QUE UN INTRUSO SE DE CUENTA DE ESTO Y TE HAGA DAÑO A TI Y A TU PROVEEDOR DE SERVIDIOS DE INTERNET; manejalo con precaucion.
  #5 (permalink)  
Antiguo 28/02/2009, 18:57
 
Fecha de Ingreso: febrero-2009
Mensajes: 2
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: PHP script para envio de correos con cronograma

Cita:
Iniciado por franco190453 Ver Mensaje
mangels:

Desde hace mucho tiempo he tenido la necesadad de hacer lo que tu deseas y despues de una cantidad interminable de consultas, busquedas, ideas, ext; encontre algo que me ayudo.

El proceso es el siguiente ->
Realizar un CRON sin utilizar ningun programa CRON, valga la redundancia, NI php como CLI; aunque usted no lo crea aqui te va el detalle.
............
Hola Franco, me parece muy bueno tu script, yo actualmente deseo hacer una cosa parecida, es decir mi hosting prohibe el envio hasta 250 emails por hora, tengo instalado un sistema de boletines diseñado por mi, el cual funciona de la siquiente manera:

Uno crea el boletin, luego pasa a el formulario de envio el cual contiene la lista de mis 10.000 emails con su respectivo nombre, el asunto, email del que envia.

Utilizo el envio con smtp para poder recibir los mensajes de error en mi correo, claro el smtp externo que le configuro al script es el local osea el de mi hosting, por supuesto porque es el que estoy pagando, ni modo que voy a usar el de otro smtp externo.

Bueno el procedimiento de envio comienza y despues del email 250 empiezo a recibir el mensaje de error del resto de email "Mail delivery" diciendo que excedi mi limite de 250 por hora.

Obviamente debo crear una especie de cron que apenas presione el boton enviar pueda cerrar la venta de mi internet explorer e irme a dormir y que se quede el script trabajando, es decir que escoja un lote de por ejemplo 200 emails para dejar una holgura de 50 por sia acaso y entonces espere una hora ("60minutos") y siga con los siguientes 200 emails y asi sucesivamente hasta que llegue a los 10.000. Es decir pasaran 8 horas para enviar los 1.600 emails y 8 mas y asi sucesivamente.

veo qu tu script mas o menos adapta a esto pero me parece que no podria porque tengo un max_execution_time de 240 por lo tanto alcanzaria el limite de ejecucion y no habra pasado sino 3 horas mas o menos.

QUE HAGO, QUE SUGIEREN, Ya no encuentro solucion y actualmente estoy sacando los emais por lotes de forma manual!!!
  #6 (permalink)  
Antiguo 28/02/2009, 21:03
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: PHP script para envio de correos con cronograma

La ventaja de usar el script cron es que no tiene que estar corriendo siempre, tu programas para que se "levante" cada hora y haga el envio, tu Sistema Operativo es el que levanta la tarea cada hora y ejecuta el comando que requieras (en este caso ejecutar el script PHP).

Saludos
  #7 (permalink)  
Antiguo 01/03/2009, 19:06
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 18 años
Puntos: 33
Respuesta: PHP script para envio de correos con cronograma

davidroy2021:

Cita:
Utilizo el envio con smtp para poder recibir los mensajes de error en mi correo, claro el smtp externo que le configuro al script es el local osea el de mi hosting, por supuesto porque es el que estoy pagando, ni modo que voy a usar el de otro smtp externo.
Esto no te lo entiendo muy bien.
Todos los envios requieren de un servidor SMTP.
No se si lo que quieres decir es que utilizas sockets para absorver todos los errores de conexion con el servidor que enviara el correo o algo diferente?

Los errores que recibiras de los envios los maneja muy bien la funcion mail ya que cuando el servidor que se encargara de valga la redundancia enviar el correo al destinatario final intercambia comunicacin con tu codigo y si el correo esta adecuadamente confeccionado y el dominio es real y no falso pues no habra error; aho ra si el usuario esta errado, entonces el servidor del destinatario final le respondera al servidor de tu ISP, y tu podras saber del resultado final de tu correo unicamente si asi lo dispone tu ISP.

EL proceso es asi ->
Del Codigo -> al Servidor SMTP que enviara -> al servidor SMTP del destinatario final.
Generalmente hablando cuando falla el correo al servidor SMTP del destinatario final, el servidor SMTP que envio es el que recibe los detalles del error; aun cuando los correos son retrazados por estar el servidor SMTP del destinatario muy ocupado una notificacion es enviada al servidor SMTP que envia.

Hay formas de efectivamente controlar si el destinatario final recibe y posteriormente abre el correo pero eso ya es asunto diferente.


Cita:
Obviamente debo crear una especie de cron que apenas presione el boton enviar pueda cerrar la venta de mi internet explorer e irme a dormir y que se quede el script trabajando, es decir que escoja un lote de por ejemplo 200 emails para dejar una holgura de 50 por sia acaso y entonces espere una hora ("60minutos") y siga con los siguientes 200 emails y asi sucesivamente hasta que llegue a los 10.000. Es decir pasaran 8 horas para enviar los 1.600 emails y 8 mas y asi sucesivamente
El cron lo tienes enfrente de tus ojos. Lee con cuidado y esmero el post.
Lo unico que tienes que añadir es que el archivo mail.php
cada vez que corra este bucle o loop
for($w = 0; $w < $tiempo; $w++) {
sleep(3);
include("mail.php");
}
se ejecuta mail.php
y debe incluir de forma incrementante los correos que quieres enviar.

Saludos
Franco
  #8 (permalink)  
Antiguo 02/03/2009, 02:34
 
Fecha de Ingreso: febrero-2009
Mensajes: 2
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: PHP script para envio de correos con cronograma

Cita:
El cron lo tienes enfrente de tus ojos. Lee con cuidado y esmero el post.
Lo unico que tienes que añadir es que el archivo mail.php
cada vez que corra este bucle o loop
for($w = 0; $w < $tiempo; $w++) {
sleep(3);
include("mail.php");
}
se ejecuta mail.php
y debe incluir de forma incrementante los correos que quieres enviar.
Gracias por responderme, con respecto a lo del smtp pviemos eso supongamos que lo hago con mail() okey, hasta alli todo bien, la parte que me tiene realmente confundido es lo de los recurso de php, fijate que tengo el max_execution_time en 240 la gran duda mia es que apenas en lo que ejecuto
Cita:
<?php
//Abrir una conexion socket hacia cron.php
// $_SERVER['HTTP_HOST'] = 123.456.789.012 (micaso)
$abrirsocket = fsockopen($_SERVER['HTTP_HOST'],80,$errorno,$errorstr,10);
if($abrirsocket) {
$datossocket = "GET /CRONFRanco/CronRevolucionario/cron.php HTTP 1.1\r\n";
$datossocket .= "Host: ".$_SERVER['HTTP_HOST']."\r\n";
$datossocket .= "Connection: Close\r\n\r\n";
fwrite($abrirsocket,$datossocket);
//Normalmente se obtiene toda la Data con fgets y se espera hasta que $socket llega al feof(End of file).
//En este caso solo hacemos esto->
fclose($abrirsocket);
} else {
echo "Hubo Error";
}
?>
ese codigo me lanza el cron lo que no entiendo es que el cron queda ejecutandose con el sleep obviamente que le pondria en $tiempo=x y un sleep(y) para que envie 200 emails cada una hora, obviamente ese cron.php estara activo como por 20 horas o mas y el max_execution_time del php me lo va a matar en lo que llegue a 240 minutos.

Por lo tanto no alcanzaria a enviar todos los emails.

Gracias y espero respuesta, :):):):)

PD: Obviamente que lo que dice gator es cierto lo que no entiendo es que este cron.php de franco corre siempre osea no se detiene, esta alli activo las 20 horas o el tiempo que determinemos nosotros seguna la variable tiempo y la funcion sleep(). Deberia haber forma de llamar a ese cron por hora a enviar el lote de emails pendientes y asi sucesivamente, osea se levanta envia 200 marca donde quedo y se acuesta, pasa una hora se vuelve a levantar envia otros 200 maraca donde quedo y se acuesta, asi seria mas o menos el proceso para que no se agote el tiempo que establece el max_execution_time de php.ini que en mi caso repito esta en 240.

Última edición por davidroy2021; 02/03/2009 a las 02:40
  #9 (permalink)  
Antiguo 02/03/2009, 12:58
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 18 años
Puntos: 33
Respuesta: PHP script para envio de correos con cronograma

davidroy2021:
Has probado poniendo el
set_time_limit(0);

Cita:
PD: Obviamente que lo que dice gator es cierto lo que no entiendo es que este cron.php de franco corre siempre osea no se detiene, esta alli activo las 20 horas o el tiempo que determinemos nosotros seguna la variable tiempo y la funcion sleep(). Deberia haber forma de llamar a ese cron por hora a enviar el lote de emails pendientes y asi sucesivamente, osea se levanta envia 200 marca donde quedo y se acuesta, pasa una hora se vuelve a levantar envia otros 200 maraca donde quedo y se acuesta, asi seria mas o menos el proceso para que no se agote el tiempo que establece el max_execution_time de php.ini que en mi caso repito esta en 240.
Desde el momento que activas un servicio cron a nivel de sistema operativo un demonio corre continuamente; en este caso el demonio es exactamente igual y aun mucho mejor porque es manejable remotamente y corre manejado por el servidor web y php.

He probado hacer dos y hasta tres corridas con dos y hasta tres archivos php diferentes y se ejecutan commo si fuera un cron para cada archivo.
Ejemplo: puedes correr en primera instancia mail.php para x cantidad de tiempo y correr por el resto de correos con unmaildos.php y No tendras problemas y ambos correran.

Pienso que si pones un set_time_limit(0) sera suficiente.
Yo, aunque usted no lo crea, activo un cron parecido desde un celular Sonny Ericsson sin problemas y con exito via el servicio WAP local!!!; pero
no deja de ser muy riezgozo como consecuencia de la tremenda cantidad de personas malintencionadas que rondan el Internet como depredadores.

Haciendo un Hash de la ruta se obviaria cualquier problema de seguridad.

Saludos
Franco
P.S. Recuerda que, como todo, php esta lleno de sorpresas, trucos y maravillas que no existen en ASP, u otros lenguajes; asi es que continuemos con tu caso hasta llevarlo a feliz termino y postea tus avances.
P.S. Tenemos pendiente que pruebes manipulando el set_time_limit(0), yo tratare de leer un poco referente
si el set_time_limit(0) overrides o sobreescribe el existente, francamanete en estos momentos NO se averiguare y lo que si se es que si el php.ini tiene el max_exec... (0) entonces el uso de este cron es ilimitado y de mucha utilidad practica.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:13.