Newsgroup: it.comp.www.php
Titolo: Servizio di notifica promemoria via email tramite php e mysql e cronjob

Ciao a tutti.
Sono nuovo del NG e sono nuovo a PHP anche se ho un background da programmatore 
in altri linguaggi ormai passati.
 
Quello che sto cercando di fare � creare un servizio sul mio spazio web che 
mi permetta di inserire dei promemoria per poi essere avvisato via email 
dal sistema quando il promemoria deve attivarsi in base alla data stabilita. 
Ovviamente voglio potermi loggare con diversi utenti e ciascun utente potr� 
gestire i propri promemoria senza vedere quelli degli altri.
Premetto che buona parte del lavoro � gi� fatto : il db con le tabelle ed 
i campi ce l'ho, il codice php che mi permette di autenticarmi con nome utente 
e password ce l'ho e funziona bene (funzione di registrazione e cambio/recupero 
password). Ho anche gi� creato la struttura che mi permette di inserire ed 
eliminare i vari promemoria e l'utente loggato vede solo i suoi e non quelli 
di tutti. Il sistema invia correttamente le mail al verificarsi dell'evento. 
Tutto questo lavoro � frutto di un copia/incolla/modifica di due/tre fonti 
diverse. Il servizio Cronjob funziona perfettamente richiamando la script 
PHP che elabora glli eventi inseriti ed invia la mail. Il mio problema � 
che la struttura che avevo copiato permetteva di inviare le email ad un unico 
destinatario. Inoltre la struttura originale dopo aver inviato cancellava 
il promemoria mentre io vorrei e dovrei tenerlo se � ricorrente. (quest'ultima 
cosa l'ho ottenuta mettendo la condizione che se il campo Ricorrente � valore 
1 non deve cancellare).
 
I dati che specifico durante l'inserimento dei promemoria sono:
 
Oggetto
Messaggio
Data Evento  (non mi voglio smazzare l'ora ..va bene la data)
Ricorrente?
Ogni quanto riccorre?
Preavviso?
Preavviso di quanto?
 
Ho due tabelle : Utenti e Event_reminder
 
Nella tabella utenti ho :
 
IDUtente (contatore)
Nome Completo
username
password
email
telefono
codiceconferma
 
 
Nella tabella Event_Reminder ho :
 
IDEvento (contatore)+
idutente  (durante l'inserimento viene letto l'id dell'utente loggato)
oggetto
messaggio
data evento
schedulazione (si no)
schedulazione_ogni (numerico)
schedulazione_tipo (giorno/mese/anno)
preavviso (si/no)
preavviso_ogni (numerico)
preavviso_ogni_tipo (giorno/mese/anno)
 
 
Il codice che si occupa dell'invio delle mail � il seguente ed � quello che 
dovrei modificare al fine di riuscire ad inviare ad ogni utente i propri 
avvisi e non tutti gli avvisi ad un solo utente.
Inoltre dovrei riuscire a gestire le seguenti cose :
1- la ricorrenza di un evento
2- il preavviso di un determinato evento
3- l'invio del promemoria all'indirizzo email che l'utente ha specificato 
in fase di registrazione ...percui la deve leggere dal db e non deve essere 
fissata da codice ma bens� sparata in variabile.
4- lo script di invio viene eseguito una volta al giorno quindi in questo 
caso non ci sarebbero problemi, ma come fare ad evitare invii multipli nella 
stessa giornata per lo stesso promemoria se lo script di invio venisse eseguito 
ogni mezz'ora? Dovrei forse aggiungere un campo flag al db per ogni evento 
per capire se � gi� stato processato in data odierna?
 
Inutile dire che ringrazio infinitamente chi possa darmi uns dritta su come 
fare.
Di seguito il codice (ps sul web ho trovato diversi sistemi tra cui E-Reminder 
ma non funziona per via di codice obsoleto)
 
 
 
<?PHP
require_once("./include/membersite_config.php");
 
if(!$fgmembersite->CheckLogin())
{
    $fgmembersite->RedirectToURL("login.php");
    exit;
}
?>
<?php
include('database.inc.php'); // Our database connectivity file
 
// Values you need set
$number_of_days_before = 1;
$email = "
mia...@libero.it
";
$reminder_details = "";
$todays_date = date( "Ymd" );
$year = substr($todays_date, 0, 4);
$month = substr($todays_date, 4, 2);
$date = substr($todays_date, 6, 2);
 
$trigger_date = date("Ymd", mktime (0,0,0,$month,$date-$number_of_days_before,$year));
$result = mysql_query( "SELECT * FROM reminder_events WHERE reminder_date 
<= $trigger_date ORDER BY reminder_date ASC" );
$nr = mysql_num_rows( $result );
while( $row = mysql_fetch_array( $result ) )
{
$year = substr($row["reminder_date"], 0, 4);
$month = substr($row["reminder_date"], 4, 2);
$date = substr($row["reminder_date"], 6, 2);
$reminder_date = date("M j, Y", mktime (0,0,0,$month,$date,$year));
$reminder_details .= "Evento: ".$row["reminder_name"]."\n";
$reminder_details .= "Data: ".$reminder_date."\n";
$reminder_details .= $row["reminder_desc"]."\n\n";
}
mysql_free_result( $result );
if( !empty( $nr ) )
{
 
// Send out Reminder mail
$mailheader = "From: Mio servizio promemoria<$email>\nX-Mailer: Reminder\nContent-Type: 
text/plain";
mail("$email","Servizio Promemoria","$reminder_details","$mailheader");
 
// Delete the sent reminders
mysql_query("DELETE FROM reminder_events WHERE reminder_date <= $trigger_date 
and schedulazione <>1" );
}
?>
 
 
 
---
Questa e-mail � priva di virus e malware perch� � attiva la protezione avast! Antivirus.
http://www.avast.com
 
 

 odierna?
 
Dovresti aggiungere un campo "data_ultimo_invio", e controllare se 
l'ultimo invio è già avvenuto nell'ultimo intervallo di preavviso, che è
gli ultimi
 
preavviso_ogni * preavviso_ogni_tipo 
 
 
ciao

Ciao RedWiz,
 
Grazie per aver risposto al mio quesito abbastanza complesso!
Ho postato la domanda e nel frattempo me lo sono fatto finito consapevole
che non essendo programmatore php e nemmeno di mysql la cosa possa essere
sicuramente ottimizzata ed ampliata.
 
Una domanda : tu mi parli di un select join tra le due tabelle ...è forse 
l'equivalente delle relazioni dei dati dei database access? Adesso vado a 
vedermi il link che hai postato cosi capisco meglio ...ma mi pare di capire 
che è quello che poi mi permette con meno difficoltà di leggere i dati relazionati 
da una tabella in un altra.
 
Hai ragione mi ero dimenticato di scrivere che avevo il campo data evento 
e che quindi grazie a quello sapevo quando si verificava l'evento.
 
Avrei piacere ad avere il tuo parere sul codice scritto e/o modificato da 
me per ottenere quello che attualmente funziona diciamo "in modo sporco" 
con quel che è stato un copia e incolla, taglia e cuci, modifica ed implementa. 
Ci metterei troppo a studiarmi php per farlo da zero, ma così funziona.
 
Mi sai suggerire qualche ide o programma in grado di evidenziare eventuali 
errori di programmazione html/php?
Sono convinto che nel mio codice vi siano una marea di inesattezze.
 
Grazie ancora dell'interesse.
 
 
 
---
Questa e-mail è priva di virus e malware perché è attiva la protezione avast! Antivirus.
http://www.avast.com