Foros del Web » Programando para Internet » PHP »

sistema Newsletter, ¿por donde empiezo?

Estas en el tema de sistema Newsletter, ¿por donde empiezo? en el foro de PHP en Foros del Web. Hola, bueno ya que no obtuve respuestas rearmo mi consulta. Mi pregunta es si a la función mail le puedo definir como destinatario todos los ...
  #1 (permalink)  
Antiguo 18/05/2007, 02:58
 
Fecha de Ingreso: septiembre-2006
Mensajes: 141
Antigüedad: 17 años, 7 meses
Puntos: 1
sistema Newsletter, ¿Retardo de los envios?

Hola, bueno ya que no obtuve respuestas rearmo mi consulta.
Mi pregunta es si a la función mail le puedo definir como destinatario todos los emails de los usuarios resgitrados en mi Bd..
¿Podría esto funcionar así?..


Código PHP:
<? $destinatario =mysql_db_query("db","select * from usuarios");
while (
$row=mysql_fetch_array($destinatario))
{
$row["Email"];
}

mail($row["Email"],$asunto,$cuerpo,$headers?>

Agradezco cualquier ayuda o consejo.

Saludos!

Última edición por elbastardo; 25/05/2007 a las 20:32 Razón: Agrego más info...
  #2 (permalink)  
Antiguo 19/05/2007, 02:47
 
Fecha de Ingreso: septiembre-2006
Mensajes: 141
Antigüedad: 17 años, 7 meses
Puntos: 1
Re: sistema Newsletter, ¿por donde empiezo?

Obviamente no tengo mucha idea, pero un "faa pibe eso no podría nunca funcionar así" alcanza.. :(

Todos los scripts que he intentado usar no funcionan correctamente y, obviamente, no enseñan nada.
  #3 (permalink)  
Antiguo 19/05/2007, 07:56
Avatar de vb2005  
Fecha de Ingreso: noviembre-2005
Ubicación: Paderborn - Alemania
Mensajes: 566
Antigüedad: 18 años, 5 meses
Puntos: 24
Re: sistema Newsletter, ¿por donde empiezo?

claro que puedes, los correos los tienes que separar por medio de comas

el codigo quedaría algo asi:

Código PHP:
<?php
$destinatario 
=mysql_db_query("db","select email from usuarios");
while (
$row=mysql_fetch_array($destinatario))
{
    
$mails.=$row["Email"].", ";
}

mail($mails,$asunto,$cuerpo,$headers?>
Suerte con ese script
  #4 (permalink)  
Antiguo 19/05/2007, 18:18
Avatar de geq
geq
 
Fecha de Ingreso: agosto-2006
Ubicación: Rosario
Mensajes: 655
Antigüedad: 17 años, 8 meses
Puntos: 22
Re: sistema Newsletter, ¿por donde empiezo?

hola ^^

yo estaba en algo similar (pero con otro fin) y se me ocurrio consultar a mi proovedor de hosting si tenia limitaciones para hacer eso,

y efectivamente, al menos aqui en la argentina, la mayoria de los servicios de conexion a internet y los hostings tienen el envio de correo electronico limitado a un numero especifico por hora (en mi caso, 200)

por eso idee un sistema para enviar grandes cantidades de mails. Te dejo la idea, porque es mejor probarlo antes de abrir un dia tu gestor de mails y encontrarte cn qe te han suspendido el servicio! xD

la idea es crear un script que envie los mails necesarios si es que son pocos, o que envie una cantidad especifica, y almacenar en una base de datos hasta donde se mando y la cantidad de mails que salieron.

entonces un cronjo ejecuta periodicamente ese script (en mi caso cada 5 minutos) y vuelve a repetirse el proceso hasta que se alcance un limite (que por supuesto se compara con el valor que guardo en la base de datos la ejecucion anterior). una vez que se alcanzo el limite, el script sigue ejecutandose pero no hara nada

una hora despues de alguna manera se pone el contador en 0 y el script puede continuar enviando. en mi caso lo hago con otro script que se ejecuta cada una hora y unos minutos, y eso es todo lo que hace.

me parece que es una forma efectiva, y si te fijas bien la mayoria de los sites utilizan un metodo similar.. por ejemplo estoy suscripto a newsleters que conozco otras personas que tambien lo estan, y siempre recibimos los mensajes con horas y hasta dias de diferencia

espero que te sea util y que me puedas interpretar ^^u

cualqier cosa ya sabes dnde encontrarme :P

exitos!!
  #5 (permalink)  
Antiguo 19/05/2007, 18:29
Avatar de vb2005  
Fecha de Ingreso: noviembre-2005
Ubicación: Paderborn - Alemania
Mensajes: 566
Antigüedad: 18 años, 5 meses
Puntos: 24
Re: sistema Newsletter, ¿por donde empiezo?

no se pero ya que los datos estan en una base de datos de MySQL, se podría jugar con LIMIT tambien, que siempre es util
  #6 (permalink)  
Antiguo 19/05/2007, 18:35
Avatar de geq
geq
 
Fecha de Ingreso: agosto-2006
Ubicación: Rosario
Mensajes: 655
Antigüedad: 17 años, 8 meses
Puntos: 22
Re: sistema Newsletter, ¿por donde empiezo?

bueno pero si usas limit asi solamente,, como sabes donde quedo, por un lado, y cuando terminara de enviar el resto?

la idea es automatizar todo el proceso, pero por supuesto que tendras qe usar limit cuando vayas a buscar la informacion ^^

exitos
  #7 (permalink)  
Antiguo 20/05/2007, 07:00
Avatar de vb2005  
Fecha de Ingreso: noviembre-2005
Ubicación: Paderborn - Alemania
Mensajes: 566
Antigüedad: 18 años, 5 meses
Puntos: 24
Re: sistema Newsletter, ¿por donde empiezo?

emm.. limit puede ser una variable que se puede ir sumando, osea despues de que envia por ejemplo los 200 mails, hace que la variable $limit por ejemlpo, sume 200 entonces la proxima consulta sería

select email from usuarios limit 200,0

y la proxima select email from usuarios limit 400,0
  #8 (permalink)  
Antiguo 21/05/2007, 02:32
 
Fecha de Ingreso: septiembre-2006
Mensajes: 141
Antigüedad: 17 años, 7 meses
Puntos: 1
Re: sistema Newsletter, ¿por donde empiezo?

Bueno agradezco muchísimo las respuestas, veo que tan mal encaminado no andaba. Por otro lado se me complicó bastante la cosa ya que no tengo idea de cuántos mails puedo enviar por día, y mucho menos idea de cómo hacer un cronjob.. voy a mandarle mail al soporte del hosting preguntando esos datos y bue, habrá que seguir probando.

Te agradecería un ejemplo de cómo hacer un cron o los pasos a seguir.

Ya postearé como me ha ido, muchas gracias a los 2.

Adiós!
  #9 (permalink)  
Antiguo 21/05/2007, 05:43
Avatar de vb2005  
Fecha de Ingreso: noviembre-2005
Ubicación: Paderborn - Alemania
Mensajes: 566
Antigüedad: 18 años, 5 meses
Puntos: 24
Re: sistema Newsletter, ¿por donde empiezo?

el tema pasa por si tenes o no el cronjob en el cpanel o no, porque aveces no lo tenés...
  #10 (permalink)  
Antiguo 22/05/2007, 21:02
 
Fecha de Ingreso: septiembre-2006
Mensajes: 141
Antigüedad: 17 años, 7 meses
Puntos: 1
Re: sistema Newsletter, ¿por donde empiezo?

Bien, continúo.. estuve viendo el panel de control y no tiene el cronjob hecho, y me dijeron que el máximo de mails por hora es de 60.
Usando el LIMIT lo puedo aplicar a esto?.. no sé cómo se continuaría el código, a ver si me explico mejor.

Código PHP:
<?
$destinatario 
=mysql_db_query("db","select email from usuarios limit 60,0");
while (
$row=mysql_fetch_array($destinatario))
{
    
$mails.=$row["Email"].", ";
}

mail($mails,$asunto,$cuerpo,$headers?>
Tendría que poner algo que defina que luego de 1 hora envie a 60 mails más o los que haya no?

Espero tengan alguna solución más coherente, de esta manera no veo mucha posibilidad.. saludos.
  #11 (permalink)  
Antiguo 22/05/2007, 21:20
Avatar de geq
geq
 
Fecha de Ingreso: agosto-2006
Ubicación: Rosario
Mensajes: 655
Antigüedad: 17 años, 8 meses
Puntos: 22
Re: sistema Newsletter, ¿por donde empiezo?

la verdad me siento mal diciendote esto xD parezco re mala onda

pero empieza por pensar qe los 60 son en total, es decir entre scripts, cuentas de correo y demas
es decir qe no podras utilizar tu correo mientras este enviando los emails tu script

el LIMIT es: "LIMIT comienzo,cantidad", o sea qedaria "LIMIT comienzo,60" ^^

para saber cual es comienzo, podrias usar una base de datos, una tabla cn un campo nada mas, qe almacene dnde qedo la ultima vez

pero me temo qe si no puedes hacer qe se ejecute continuamente no habra forma :\ a menos qe te pongas vs a abrirlo desde tu navegador cada una hora buuu

no confirmo qe no se pueda, ojala qe si, pero escapa de mi conocimiento


exitos!
  #12 (permalink)  
Antiguo 22/05/2007, 21:39
 
Fecha de Ingreso: septiembre-2006
Mensajes: 141
Antigüedad: 17 años, 7 meses
Puntos: 1
Re: sistema Newsletter, ¿por donde empiezo?

Hola, gracias por la explicación de LIMIT, sinceramente no tengo conocimientos (te habrás dado cuenta) y lo apliqué sin pensarlo mucho de acuerdo a lo que VB2005 puso, en fin, no queda mala onda.

Por vuestro script, estuve leyendo y se puede usar un "pseudocron" que valería para largar tareas programadas mediante un script externo, podría dejar un enlace al ejemplo que me enviaron pero me apareció una advertencia que no puedo poner enlaces todavía.

Bien, el pseudocron teóricamente podría ser programado para que cada una hora abra 1 script y realice el envio de mails pero no entiendo cómo hacerlo ni si se podría hacer en base a lo creado en este hilo (no sé si me explico)..

Supongo que si meto esto en 1 php y le digo al pseudocron que lo abra cada una hora hará siempre el mismo envío ¿no?

Código PHP:
<?
$destinatario 
=mysql_db_query("db","select email from usuarios");
while (
$row=mysql_fetch_array($destinatario))
{
    
$mails.=$row["Email"].", ";
}

mail($mails,$asunto,$cuerpo,$headers?>

¿Cómo aplicarías tu lo de separar la cantidad de mails de a 60 y que se fije en la BD dónde quedó para que continúe con los siguientes?

Gracias por las respuestas y perdón la insistencia.
  #13 (permalink)  
Antiguo 22/05/2007, 21:48
Avatar de geq
geq
 
Fecha de Ingreso: agosto-2006
Ubicación: Rosario
Mensajes: 655
Antigüedad: 17 años, 8 meses
Puntos: 22
Re: sistema Newsletter, ¿por donde empiezo?

bueno yo crearia en la misma db una nueva tabla por ejemplo 'envio' con un campo 'total' de tipo int, crea un nuevo registro en el qe total valga '0' y luego

Código PHP:
$result mysql_query("select total from envio limit 1");
$desde mysql_result($result,0,"total");

$destinatario =mysql_db_query("db","select email from usuarios limit $desde,60");
if(
mysql_num_rows($destinatario)) {
while (
$row=mysql_fetch_array($destinatario)) 

    
$mails.=$row["Email"].", "
}
$result=mysql_query("update envio set total=".$desde+60);
}else{
$result=mysql_query("update envio set total=0");

pruebalo (lo scribi directamente aca en el foro xD) cualqier cosa me avisas

espero qe te sirva ^^
exitos
  #14 (permalink)  
Antiguo 25/05/2007, 20:28
 
Fecha de Ingreso: septiembre-2006
Mensajes: 141
Antigüedad: 17 años, 7 meses
Puntos: 1
Re: sistema Newsletter, ¿por donde empiezo?

Hola, sigo sin poder lograrlo.. tengo una idea y quiero que me digas si es viable o si directamente no se puede usar, pego lo último que me aconsejaste y te digo lo que se me ocurrió con la función sleep () que vi por ahí en otro hilo.

Código PHP:
<? $result mysql_query("select total from envio limit 1");
$desde mysql_result($result,0,"total");

$destinatario =mysql_db_query("db","select email from usuarios limit $desde,60");
if(
mysql_num_rows($destinatario)) {
while (
$row=mysql_fetch_array($destinatario)) 

    
$mails.=$row["Email"].", "
}
$result=mysql_query("update envio set total=".$desde+60);
}else{
$result=mysql_query("update envio set total=0");
?>
Mi idea, ¿se puede usar en el if la función sleep () de modo que si envió los mails del 0 al 60 espere 1 hora y despierte de nuevo? o en el caso contrario realice el envío..

Sacado del manual de php en español:
La función sleep() retarda la ejecución del programa por el número dado de segundos.

Código PHP:
 <?

// hora actual
echo date('h:i:s') . "\n";

// dormir por 10 segundos
sleep(10);

// despertar !
echo date('h:i:s') . "\n";

?>
Agradezco tu opinión a ver si lo puedo resolver de esa manera, no sé como aplicar lo que te escribí antes, es todo teórico lo mío :(

Saludos
  #15 (permalink)  
Antiguo 27/05/2007, 19:41
Avatar de geq
geq
 
Fecha de Ingreso: agosto-2006
Ubicación: Rosario
Mensajes: 655
Antigüedad: 17 años, 8 meses
Puntos: 22
Re: sistema Newsletter, ¿por donde empiezo?

lo dudo, pues los scripts tienen una duracion maxima de ejecucion, qe normalmente es de 30 segundos. es decir qe cuando su ejecucion dura ese determinado tiempo, se detiene y tira unerror qe seguramente habras visto..

pero pruebalo puede ser qe funcione, aunqe tampoco lo veo eficiente ^^u

exitos
  #16 (permalink)  
Antiguo 27/05/2007, 21:31
(Desactivado)
 
Fecha de Ingreso: diciembre-2006
Mensajes: 529
Antigüedad: 17 años, 5 meses
Puntos: 11
Re: sistema Newsletter, ¿por donde empiezo?

Hola a todos.

Para hacer un sistema de envío de emails está bueno lo de la base de datos para no exceder el limite de la ejecución de un script.

Luego para zafar del limite de tu proveedor de hosting entonces utilizad phpmailer por ejemplo.

Haces algun script que envie pocos, 2 o 3, se desconecte y vuelva a conectarse y siga mandando con phpmailer no tendras el limite de tu proveedor.

Es una idea y la pienso implementar para mi ya que también necesito un sistema asi.

Saludos
  #17 (permalink)  
Antiguo 29/05/2007, 02:38
 
Fecha de Ingreso: septiembre-2006
Mensajes: 141
Antigüedad: 17 años, 7 meses
Puntos: 1
Re: sistema Newsletter, ¿por donde empiezo?

Cita:
Luego para zafar del limite de tu proveedor de hosting entonces utilizad phpmailer por ejemplo.

Haces algun script que envie pocos, 2 o 3, se desconecte y vuelva a conectarse y siga mandando con phpmailer no tendras el limite de tu proveedor.
Lo que no logro entender es como se sincroniza lo de la base de datos y lo del phpmail. O sea, se hace la funcion mail para que trabaje en la BD, luego me falta comprender cómo se aplica el phpmail desde ahí.

Idem con el script de envio de mails (creo que es el mismo de la BD?), cómo se hace para que envie pocos, se desconecte y vuelva a conectarse?..

Perdón pero me limita el desconocimiento.
Gracias por el aporte, saludos.
  #18 (permalink)  
Antiguo 29/05/2007, 17:11
Avatar de geq
geq
 
Fecha de Ingreso: agosto-2006
Ubicación: Rosario
Mensajes: 655
Antigüedad: 17 años, 8 meses
Puntos: 22
Re: sistema Newsletter, ¿por donde empiezo?

pero tienes cronjobs o no o.o?

exitos
  #19 (permalink)  
Antiguo 29/05/2007, 19:05
 
Fecha de Ingreso: septiembre-2006
Mensajes: 141
Antigüedad: 17 años, 7 meses
Puntos: 1
Re: sistema Newsletter, ¿por donde empiezo?

No. En el panel de control no figura y la respuesta del soporte me dijeron que "se tiene que realizar mediante un script externo". Como verás no sé como realizarlo, y no logro comprender como debería estar armado tal script.

Agradezco una orientación. Si quieres te envío el ejemplo que me dieron.

Saludos
  #20 (permalink)  
Antiguo 29/05/2007, 19:14
Avatar de geq
geq
 
Fecha de Ingreso: agosto-2006
Ubicación: Rosario
Mensajes: 655
Antigüedad: 17 años, 8 meses
Puntos: 22
Re: sistema Newsletter, ¿por donde empiezo?

dale postealo
a mi no se me ocurre como armarlo si no es asi
tal vez se pueda encontrar algun site qe ofrezca cronjobs pero no me confiaria mucho de eso yo ya qe si ese site falla o no cumple, tu sistema no funcionara :( y sera por su culpa

tu host no puede no ofrecerte cronjobs :\ la mayoria de los servicios de hosting lo incluyen y hasta hay hosts gratuitos qe tambien,, qe tacaños XD (no significa por supuesto qe te esten mintiendo, sino qe en mi opinion no te estan brindando un servicio completo, aunqe hayas contratado el plan mas basico :(

bueno espero tu nueva respuesta XD

exitos
  #21 (permalink)  
Antiguo 29/05/2007, 19:26
 
Fecha de Ingreso: septiembre-2006
Mensajes: 141
Antigüedad: 17 años, 7 meses
Puntos: 1
Re: sistema Newsletter, ¿por donde empiezo?

Bueno es bastante largo el script, no tengo otra manera de mostrártelo que publicándolo acá. Aparentemente es para realizar tareas programadas durante el día, back ups, etc. Fijate si lo entendés y me decis que te parece.

Aquí va la parte del script:

Código PHP:
<?

/****************************************/
/*        config section                    */
/****************************************/

// || PLEASE NOTE:
// || all paths used here and in cron scripts 
// || must be absolute or relative to pseudo-cron.inc.php!
// ||
// || To easily use absolute paths, have a look at how the
// || crontab location is defined below.


// The file that contains the job descriptions.
$cronTab dirname(__FILE__)."/cronjobs/crontab.txt";

// The directory where the script can store information on completed jobs and its log file.
// include trailing slash
$writeDir dirname(__FILE__)."/cronjobs/";

// Control logging, true=use log file, false=don't use log file
$useLog true;

// Where to send cron results.
//$sendLogToEmail = "[email protected]";
$sendLogToEmail "";

// Maximum number of jobs run during one call of pseudocron.
// Set to a low value if your jobs take longer than a few seconds and if you scheduled them
// very close to each other. Set to 0 to run any number of jobs.
$maxJobs 1;

// Turn on / off debugging output
// DO NOT use this on live servers!
$debug false;

/****************************************/
/*        don't change anything here        */
/****************************************/

define("PC_MINUTE",    1);
define("PC_HOUR",    2);
define("PC_DOM",    3);
define("PC_MONTH",    4);
define("PC_DOW",    5);
define("PC_CMD",    7);
define("PC_COMMENT",    8);
define("PC_CRONLINE"20);

$resultsSummary "";

function 
logMessage($msg) {
    GLOBAL 
$writeDir$useLog$debug$resultsSummary;
    if (
$msg[strlen($msg)-1]!="\n") {
        
$msg.="\n";
    }
    if (
$debug) echo $msg;
    
$resultsSummary.= $msg;
    if (
$useLog) {
        
$logfile $writeDir."pseudo-cron.log";
        
$file fopen($logfile,"a");
        
fputs($file,date("r",time())."  ".$msg);
        
fclose($file);
    }
}

function 
lTrimZeros($number) {
    GLOBAL 
$debug;
    while (
$number[0]=='0') {
        
$number substr($number,1);
    }
    return 
$number;
}

function 
multisort(&$array$sortby$order='asc') {
   foreach(
$array as $val) {
       
$sortarray[] = $val[$sortby];
   }
   
$c $array;
   
$const $order == 'asc' SORT_ASC SORT_DESC;
   
$s array_multisort($sortarray$const$c$const);
   
$array $c;
   return 
$s;
}

function 
parseElement($element, &$targetArray$numberOfElements) {
    GLOBAL 
$debug;
    
$subelements explode(",",$element);
    for (
$i=0;$i<$numberOfElements;$i++) {
        
$targetArray[$i] = $subelements[0]=="*";
    }
    
    for (
$i=0;$i<count($subelements);$i++) {
        if (
preg_match("~^(\\*|([0-9]{1,2})(-([0-9]{1,2}))?)(/([0-9]{1,2}))?$~",$subelements[$i],$matches)) {
            if (
$matches[1]=="*") {
                
$matches[2] = 0;        // from
                
$matches[4] = $numberOfElements;        //to
            
} elseif ($matches[4]=="") {
                
$matches[4] = $matches[2];
            }
            if (
$matches[5][0]!="/") {
                
$matches[6] = 1;        // step
            
}
            for (
$j=lTrimZeros($matches[2]);$j<=lTrimZeros($matches[4]);$j+=lTrimZeros($matches[6])) {
                
$targetArray[$j] = TRUE;
            }
        }
    }
}

function 
incDate(&$dateArr$amount$unit) {
    GLOBAL 
$debug;
    
    if (
$debug) echo sprintf("Increasing from %02d.%02d. %02d:%02d by %d %6s ",$dateArr[mday],$dateArr[mon],$dateArr[hours],$dateArr[minutes],$amount,$unit);
    if (
$unit=="mday") {
        
$dateArr["hours"] = 0;
        
$dateArr["minutes"] = 0;
        
$dateArr["seconds"] = 0;
        
$dateArr["mday"] += $amount;
        
$dateArr["wday"] += $amount 7;
        if (
$dateArr["wday"]>6) {
            
$dateArr["wday"]-=7;
        }

        
$months28 = Array(2);
        
$months30 = Array(4,6,9,11);
        
$months31 = Array(1,3,5,7,8,10,12);
        
        if (
            (
in_array($dateArr["mon"], $months28) && $dateArr["mday"]==28) ||
            (
in_array($dateArr["mon"], $months30) && $dateArr["mday"]==30) ||
            (
in_array($dateArr["mon"], $months31) && $dateArr["mday"]==31)
        ) {
            
$dateArr["mon"]++;
            
$dateArr["mday"] = 1;
        }
        
    } elseif (
$unit=="hour") {
        if (
$dateArr["hours"]==23) {
            
incDate($dateArr1"mday");
        } else {
            
$dateArr["minutes"] = 0;
            
$dateArr["seconds"] = 0;
            
$dateArr["hours"]++;
        }
    } elseif (
$unit=="minute") {
        if (
$dateArr["minutes"]==59) {
            
incDate($dateArr1"hour");
        } else {
            
$dateArr["seconds"] = 0;
            
$dateArr["minutes"]++;
        }
    }
    if (
$debug) echo sprintf("to %02d.%02d. %02d:%02d\n",$dateArr[mday],$dateArr[mon],$dateArr[hours],$dateArr[minutes]);
}

function 
getLastScheduledRunTime($job) {
    GLOBAL 
$debug;

    
$extjob = Array();
    
parseElement($job[PC_MINUTE], $extjob[PC_MINUTE], 60);
    
parseElement($job[PC_HOUR], $extjob[PC_HOUR], 24);
    
parseElement($job[PC_DOM], $extjob[PC_DOM], 31);
    
parseElement($job[PC_MONTH], $extjob[PC_MONTH], 12);
    
parseElement($job[PC_DOW], $extjob[PC_DOW], 7);
    
    
$dateArr getdate(getLastActualRunTime($job[PC_CMD]));
    
$minutesAhead 0;
    while (
        
$minutesAhead<525600 AND 
        (!
$extjob[PC_MINUTE][$dateArr["minutes"]] OR 
        !
$extjob[PC_HOUR][$dateArr["hours"]] OR 
        (!
$extjob[PC_DOM][$dateArr["mday"]] OR !$extjob[PC_DOW][$dateArr["wday"]]) OR
        !
$extjob[PC_MONTH][$dateArr["mon"]])
    ) {
        if (!
$extjob[PC_DOM][$dateArr["mday"]] OR !$extjob[PC_DOW][$dateArr["wday"]]) {
            
incDate($dateArr,1,"mday");
            
$minutesAhead+=1440;
            continue;
        }
        if (!
$extjob[PC_HOUR][$dateArr["hours"]]) {
            
incDate($dateArr,1,"hour");
            
$minutesAhead+=60;
            continue;
        }
        if (!
$extjob[PC_MINUTE][$dateArr["minutes"]]) {
            
incDate($dateArr,1,"minute");
            
$minutesAhead++;
            continue;
        }
    }

    
//if ($debug) print_r($dateArr);
    
    
return mktime($dateArr["hours"],$dateArr["minutes"],0,$dateArr["mon"],$dateArr["mday"],$dateArr["year"]);
}

function 
getJobFileName($jobname) {
    GLOBAL 
$writeDir;
    GLOBAL 
$debug;
    
$jobfile $writeDir.urlencode($jobname).".job";
    return 
$jobfile;
}

function 
getLastActualRunTime($jobname) {
    GLOBAL 
$debug;
    
$jobfile getJobFileName($jobname);
    if (
file_exists($jobfile)) {
        return 
filemtime($jobfile);
    }
    return 
0;
}

function 
markLastRun($jobname$lastRun) {
    
$jobfile getJobFileName($jobname);
    
touch($jobfile);
}

function 
runJob($job) {
    GLOBAL 
$debug$sendLogToEmail$resultsSummary;
    
$resultsSummary "";
    
    
$lastActual $job["lastActual"];
    
$lastScheduled $job["lastScheduled"];
    
    if (
$lastScheduled<time()) {
        
logMessage("Running     ".$job[PC_CRONLINE]);
        
logMessage("  Last run:       ".date("r",$lastActual));
        
logMessage("  Last scheduled: ".date("r",$lastScheduled));
        if (
$debug) {
            
$e = @error_reporting(0);
            include(
dirname(__FILE__)."/".$job[PC_CMD]);        // display errors only when debugging
            
@error_reporting($e);
        } else {
            
$e = @error_reporting(0);
            @include(
$job[PC_CMD]);        // any error messages are supressed
            
@error_reporting($e);
        }
        
markLastRun($job[PC_CMD], $lastScheduled);
        
logMessage("Completed    ".$job[PC_CRONLINE]);
        if (
$sendLogToEmail!="") {
            
mail($sendLogToEmail"[cron] ".$job[PC_COMMENT], $resultsSummary);
        }
        return 
true;
    } else {
        if (
$debug) {
            
logMessage("Skipping     ".$job[PC_CRONLINE]);
            
logMessage("  Last run:       ".date("r",$lastActual));
            
logMessage("  Last scheduled: ".date("r",$lastScheduled));
            
logMessage("Completed    ".$job[PC_CRONLINE]);
        }
        return 
false;
    }
}

function 
parseCronFile($cronTabFile) {
    GLOBAL 
$debug;
    
$file file($cronTabFile);
    
$job = Array();
    
$jobs = Array();
    for (
$i=0;$i<count($file);$i++) {
        if (
$file[$i][0]!='#') {
//            old regex, without dow abbreviations:
//            if (preg_match("~^([-0-9,/*]+)\\s+([-0-9,/*]+)\\s+([-0-9,/*]+)\\s+([-0-9,/*]+)\\s+([-0-7,/*]+|Sun|Mon|Tue|Wen|Thu|Fri|Sat)\\s+([^#]*)(#.*)?$~i",$file[$i],$job)) {
            
if (preg_match("~^([-0-9,/*]+)\\s+([-0-9,/*]+)\\s+([-0-9,/*]+)\\s+([-0-9,/*]+)\\s+([-0-7,/*]+|(-|/|Sun|Mon|Tue|Wed|Thu|Fri|Sat)+)\\s+([^#]*)\\s*(#.*)?$~i",$file[$i],$job)) {
                
$jobNumber count($jobs);
                
$jobs[$jobNumber] = $job;
                if (
$jobs[$jobNumber][PC_DOW][0]!='*' AND !is_numeric($jobs[$jobNumber][PC_DOW])) {
                    
$jobs[$jobNumber][PC_DOW] = str_replace(
                        Array(
"Sun","Mon","Tue","Wed","Thu","Fri","Sat"),
                        Array(
0,1,2,3,4,5,6),
                        
$jobs[$jobNumber][PC_DOW]);
                }
                
$jobs[$jobNumber][PC_CMD] = trim($job[PC_CMD]);
                
$jobs[$jobNumber][PC_COMMENT] = trim(substr($job[PC_COMMENT],1));
                
$jobs[$jobNumber][PC_CRONLINE] = $file[$i];
            }
            
$jobfile getJobFileName($jobs[$jobNumber][PC_CMD]);
            
            
$jobs[$jobNumber]["lastActual"] = getLastActualRunTime($jobs[$jobNumber][PC_CMD]);
            
$jobs[$jobNumber]["lastScheduled"] = getLastScheduledRunTime($jobs[$jobNumber]);
        }
    }
    
    
multisort($jobs"lastScheduled");
    
    if (
$debugvar_dump($jobs);
    return 
$jobs;
}

if (
$debug) echo "<pre>";

$jobs parseCronFile($cronTab);
$jobsRun 0;
for (
$i=0;$i<count($jobs);$i++) {
    if (
$maxJobs==|| $jobsRun<$maxJobs) {
        if (
runJob($jobs[$i])) {
            
$jobsRun++;
        }
    }
}
if (
$debug) echo "</pre>";
?>
Perdón el tamaño del mismo, pero no tengo otra manera de publicarlo.
Agradezco tu opinión acerca de esto y cómo lo usarías.

Sigue...
  #22 (permalink)  
Antiguo 29/05/2007, 19:28
 
Fecha de Ingreso: septiembre-2006
Mensajes: 141
Antigüedad: 17 años, 7 meses
Puntos: 1
Re: sistema Newsletter, ¿por donde empiezo?

Esta parte explicativa no entraba en el post anterior, el script comienza con esta breve ayuda.

Usually regular tasks like backup up the site's database are run using cron
jobs. With cron jobs, you can exactly plan when a certain command is to be
executed. But most homepage owners can't create cron jobs on their web
server – providers demand some extra money for that.
The only thing that's certain to happen quite regularly on a web page are
page requests. This is where pseudo-cron comes into play: With every page
request it checks if any cron jobs should have been run since the previous
request. If there are, they are run and logged.

Pseudo-cron uses a syntax very much like the Unix cron's one. For an
overview of the syntax used, see a page of the UNIXGEEKS. The syntax
pseudo-cron uses is different from the one described on that page in
the following points:

- there is no user column
- the executed command has to be an include()able file (which may contain further PHP code)


All job definitions are made in a text file on the server with a
user-definable name. A valid command line in this file is, for example:

* 2 1,15 * * samplejob.inc.php

This runs samplejob.inc.php at 2am on the 1st and 15th of each month.


Features:
- runs any PHP script
- periodical or time-controlled script execution
- logs all executed jobs
- can be run from an IMG tag in an HTML page
- follow Unix cron syntax for crontabs


Usage:
- Modify the variables in the config section below to match your server.
- Write a PHP script that does the job you want to be run regularly. Be
sure that any paths in it are relative to pseudo-cron.
- Set up your crontab file with your script
- put an include("pseudo-cron.inc.php"); statement somewhere in your most
accessed page or call pseudo-cron-image.php from an HTML img tag
- Wait for the next scheduled run :)


Note:
You can log messages to pseudo-cron's log file from cron jobs by calling
logMessage("log a message");



Release notes for v1.2.2:

This release changed the way cron jobs are called. The file paths you specify in
the crontab file are now relative to the location of pseudo-cron.inc.php, instead
of to the calling script. Example: If /include/pseudo-cron.inc.php is included
in /index.php and your cronjobs are in /include/cronjobs, then your crontab file
looked like this:

10 1 * * * include/cronjobs/dosomething.php # do something

Now you have to change it to

10 1 * * * cronjobs/dosomething.php # do something

After you install the new version, each of your cronjobs will be run once,
and the .job files will have different names than before.



Ahora si, saludos.
  #23 (permalink)  
Antiguo 29/05/2007, 19:40
Avatar de geq
geq
 
Fecha de Ingreso: agosto-2006
Ubicación: Rosario
Mensajes: 655
Antigüedad: 17 años, 8 meses
Puntos: 22
Re: sistema Newsletter, ¿por donde empiezo?

ah habia escuchado de este script
no lo he probado, pero no parece malo
pero es probable qe no te sirva en esta ocasion. este script no es un cronjob propiamente dicho, sino qe comprueba si hay tareas programadas pendientes cada vez qe un usuario entra a las paginas qe esten configuradas para ello (puede ser tu index, o todas) y si es asi lo ejecuta

para tu newsletter necesitas ejecutarlo cada una hora y unos minutos como mucho (si no te retrazara mucho el proceso) y aqi no puedes fiarte del hecho de qe al menos una persona va a cargar tu pagina cada una hora,, la hora qe no pase se te retraso toodo el proceso, y el dia qe tngas poco trafico?

si qieres mi opinion, lamento decirte qe este script no te servira para este fin


exitos
  #24 (permalink)  
Antiguo 30/05/2007, 01:51
 
Fecha de Ingreso: septiembre-2006
Mensajes: 141
Antigüedad: 17 años, 7 meses
Puntos: 1
Re: sistema Newsletter, ¿por donde empiezo?

Estaba pidiendo tu opinión :)

Bueno y entonces, con todo lo visto y lo hablado por aquí, ¿cómo te parece que puedo implementar este newsletter que tanto trabajo da?

No sé bien si lo que me diste para que instertara en la BD el envio funciona ya que no entendí qué proceso debo hacer después, ni cómo hacer el script que dijiste que debía chequear que se siguiera ejecutando el proceso.

Agradezco una vez tus aportes y opiniones, voy sacando dudas y desechando opciones que creía iban a funcionar.

Saludos
  #25 (permalink)  
Antiguo 30/05/2007, 02:40
 
Fecha de Ingreso: mayo-2007
Mensajes: 1
Antigüedad: 17 años
Puntos: 0
Re: sistema Newsletter, ¿por donde empiezo?

Seguramente existirá algun programilla por hay para hacerlo, yo creo que hay muchos, por lo menos, buscando en softonic habia varios
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 05:58.