Inviare email reminds scadenza

sixdas

Utente Attivo
25 Giu 2012
70
0
6
Salve, mi scuso se sto aprendo molti topic, ma ho molti dubbi, e visto la vostra gentilezza ne approfitto. Come posso fare in modo che avendo una data iniziale e una finale inviare a una x data inviare un email, per avvisare che quella data sta per arrivare?
Siccome lo script che sto realizzando, tratta pagamenti di contributi, che hanno una scadenze, mi piacerebbe, che tipo se io metto che il file caricato ha scadenza il 20/07/12 il 16/07/12 il cliente riceve un email di avviso....Ho reso l'idea? Per salvare le date io utilizzo questo:
PHP:
$date = (date("d/m/Y"));
va bene o converrebbe salvarlo in timestamp?
 
ciao
io uso per registrare nel db il timestamp.
da quel valore poi mi faccio tutto quello che serve, secondo me è più comodo da usare neglio ordinamenti, nei calcoli per differenze date, per quanti gg mancano...
questo perche quasi tutte le funzioni delle date di php vogliono la data in formato Y m d quindi comunque devo trasformarle in italiano, col tmestamp faccio quello che serve. guarda che però è una mia opinione certuni preferiscono usare i formati più umani (cosa che comunque a php e mysql non glene può frega de meno...)
 
ciao
io uso per registrare nel db il timestamp.
da quel valore poi mi faccio tutto quello che serve, secondo me è più comodo da usare neglio ordinamenti, nei calcoli per differenze date, per quanti gg mancano...
questo perche quasi tutte le funzioni delle date di php vogliono la data in formato Y m d quindi comunque devo trasformarle in italiano, col tmestamp faccio quello che serve. guarda che però è una mia opinione certuni preferiscono usare i formati più umani (cosa che comunque a php e mysql non glene può frega de meno...)

Ok, quindi ipotizzando che ho nel db ho salvato le date come timestamp, come data di scadenza il 16/07/12, vorrei che 5 giorni prima quindi il 11/07/12, venga eseguito lo script e l'invio della email. Come mi calcolo tale data?
 
ciao
intanto tieni presente che il timestamp è un intero espresso in secondi, quindi
se hai la scadenza in timestamp ad es potresti fare in questo modo
PHP:
<?php
//.....
$time_scadenza=$valore_da_db['scadenza'];
$oggi=time();//legge il timestamp attuale del server
$gg=abs(($time_scadenza- $oggi))/(24*60*60);//con i dovuti arrotondamenti in difetto o in eccesso
if($oggi > $time_scadenza){
	echo "contratto già scaduto da $gg giorni";
}else{
	echo "contratto scade tra $gg giorni";
}
?>
io ti ho messo un esempio, ma tu puoi giostrarti come vuoui (es) if ($gg <=5) invia email avviso
 
Potresti spiegarmi, un po questo rigo?
PHP:
$gg=abs(($time_scadenza- $oggi))/(24*60*60);//con i dovuti arrotondamenti in difetto o in eccesso
 
ciao
1. abs ritorna il valore assoluto es. abs(-5) = 5 quindi per il calcolo non devo guardare quale è il più piccolo o il più grande
2. ($time_scadenza- $oggi) sono i secondi di differenza tra le due date
3. (24*60*60) un giorno (espresso in secondi) = 24 ore per 60 minuti per 60 secondi, avrei potuto scrivere ($time_scadenza- $oggi)/86400
4. quindi ($time_scadenza- $oggi)/(24*60*60) da l'intervallo in giorni, un numero float
5. poi puoi arrotondare o troncare
ceil(abs(($time_scadenza- $oggi))/(24*60*60)) in eccsso es ceil(5.4) = 6
(int)abs(($time_scadenza- $oggi))/(24*60*60)) tronca es (int)(5.4) = 5
... esistono anche round e floor

spero di essere stato chiaro
 
Ciao, adesso mi è un po più chiaro, l'unica cosa che adesso ho difficoltà e "umanizzare" la data, ho provato con questa funzione:

PHP:
function timestamp_to_date($timestamp){
   return date("r", $timestamp);
}

echo timestamp_to_date('1342461442');

Ma il timestamp ricevuto dalla tua funzione, non viene riconosciuto e quindi convertito. Cosa mi consigli di fare?
 
ciao
non hai bisogno di tutto quell'ambaradan, ti faccio il solito esempio

PHP:
<?php
$data_tm_stamp=time();
$data_umana=date("d m Y", $data_tm_stamp);//o "d/m/Y" o d-m-Y" o per ore e sec "d m Y H:i:s"
echo "la data in tmestamp è $data_tm_stamp, tradotta in umano $data_umana";
?>
 
ciao
non hai bisogno di tutto quell'ambaradan, ti faccio il solito esempio

PHP:
<?php
$data_tm_stamp=time();
$data_umana=date("d m Y", $data_tm_stamp);//o "d/m/Y" o d-m-Y" o per ore e sec "d m Y H:i:s"
echo "la data in tmestamp è $data_tm_stamp, tradotta in umano $data_umana";
?>

Grazie per l'esempio adesso mi è chiaro come umanizzare un timestamp, ma trovo ancora difficoltà, con lo script sopra. Non pensavo che gestire le date fosse cosi complicato. Io avevo pensato, di inserire questo link per far inserire le date, ma in questo modo verrebbero salvate in 11/07/2012, dovrei a questo punto prima convertire in timestamp giusto?
Ritornando allo script, quello del tuo esempio mi restituisce un timestamp sempre diverso se aggiorno la pagina è normale? invece di calcolare i secondi non si può calcolare il giorno?


Io avevo pensato una cosa del genere ma non so se concettualmente e giusta.

Questa e l'ipotetica tabella dove salvo i dati:

[table="width: 500, class: grid"]
[tr]
[td]id[/td]
[td]data_scadeza[/td]
[td]data_rem[/td]
[td]id_cliente[/td]
[/tr]
[tr]
[td]1[/td]
[td]16/06/2012[/td]
[td]11/06/2012[/td]
[td]1[/td]
[/tr]
[tr]
[td]2[/td]
[td]18/08/2012[/td]
[td]13/08/2012[/td]
[td]2[/td]
[/tr]
[/table]

Poi facendo una select

PHP:
$oggi = (date("d/m/Y"));
$query = "SELECT * FROM doc WHERE data_rem= $oggi'";
$res = mysql_query($query);
if (isset ($res)){
// Invia email
}

Lo script, verrebbe lanciato ogni giorno in automatico dal server, ma non so come ricavarmi la data_rem che sarebbe data_scadenza-5giorni...
 
Ultima modifica:
Basandosi sulla tua tabella sarebbe (ad esempio):
PHP:
SELECT DATEDIFF(data_scadenza,data_rem) AS differenza FROM tabella WHERE id=xx
 
Ciao, ma mi rimane ancora il dubbio, su come spedire più email contemporaneamente. In questo modo io estraggo, tutte le email che hanno la scadenza in quel giorno, ma come faccio poi a inviarle tutte?
 
Ciao, ma mi rimane ancora il dubbio, su come spedire più email contemporaneamente. In questo modo io estraggo, tutte le email che hanno la scadenza in quel giorno, ma come faccio poi a inviarle tutte?

edit:
Ho fatto in questo modo che ne dite?
PHP:
<?php

include_once ('config.php');

$oggi = (date("d/m/Y"));

$query = "SELECT * FROM remid WHERE data_rem = '$oggi'";
$res = mysql_query($query);
while ($row = mysql_fetch_assoc($res))  
if (isset($res)) {

$destinatario = $row['email']; 
$oggetto = "Archivio: Scadenza pagamenti"; 
$messaggio = 
"Gentile Cliente, \n
Hai un dpcumento in scadenza. \n
Nome:  $nome; \n
Cordiali Saluti.";
mail($destinatario, $oggetto, $messaggio, "From: sito.it <sito@sito.it");

if (!$res) {
	die("Errore nella query $sql: " . mysql_error());

}
}
?>

Sembra che funzioni, ma vorrei un vostro parere per migliorarlo.
 
Ultima modifica:
ciao
ecco quelli che secondo me potrebbero essere dei miglioramenti.
comunque stai attento a quante email invii alla volta se superi un centinaio al gg corri rischio di essere messo in una bleack list per spam.
poi ho messo un intervallo di tempo tra un invio e l'altro (500 microsecondi = 0.5 sec) in modo da non intasare il server (puoi ridurlo di un po')
e la verifica delle email inviate e di quelle che ti danno errore
PHP:
<?php
include_once ('config.php');
$oggi = (date("d/m/Y"));
$query = "SELECT * FROM remid WHERE data_rem = '$oggi'";
$res = mysql_query($query);
if(mysql_num_rows($res)> 0){
	while ($row = mysql_fetch_assoc($res)){ 
		$destinatario = $row['email']; 
		$oggetto = "Archivio: Scadenza pagamenti"; 
		//la variabile $nome da dove salta fuori?
		//non la ricavi dalla query?
		//es. $nome=$row['nome']; 
		//nel messaggio metterie anche la data (anche se si legge nell intestazione)
		$messaggio = 
		"Gentile Cliente, \n
		Hai un documento in scadenza. \n
		Nome:  $nome; \n
		Cordiali Saluti. \n
		Ballonzi di sotto, $oggi
		";
		if(mail($destinatario, $oggetto, $messaggio, "From: sito.it <sito@sito.it")){
			$em_inviate[]=$destinatario;// invio ok
		}else{
			$em_errore[]=$destinatario;// invio ko
		}
		usleep(500);//mezzo secondo tra un invio e un altro per non strozzare il srver
	}
}else{
	echo "non ci sono indirizzi da spedire";
}
if(is_array($em_inviate)){
	echo "sono state inviate le seguenti email:<br>";
	foreach($em_inviate as $valore){
		echo "$valore<br>";
	}
}
if(is_array($em_errore)){
	echo "le seguenti email non sono state inviate:<br>";
	foreach($em_errore as $valore){
		echo "$valore<br>";
	}
}
?>
 
Ciao, grazie mille, adesso, è strutturato meglio, ma c'è ancora un errore. Ho fatto una prova con 5 file in scadenza, quindi doveva mandare 5 email diverse, riesce a mandarle solo le prime 3 le altre due dice che non sono state inviate. puo esserci un errore nello script, oppure una limitazione del hosting? nel mio caso sto facendo delle prove con altervista....
 
ciao
1. verifica che gli indirizzi siano giusti
2. invece di usare la funzione mail() dovresi usare la classe phpmailer o simile. la funzione mail() ha dei problemi con l'invio di alcune esmail es. @gmail.com e altri, ci sono alcuni che rifiutano la ricezione da mail() anch se non ti so dire perchè
 
Capito, infatti i problemi, li ho riscontrati con account @gmail.com. del tipo se ne metto una sola parte tranquillamente, se ne metto due ne invia una sola. Ho rifatto un altra prova, mettendo 5 email di diversi gestori (gmail,tiscali,yahoo,libero,emailtemporanea) Vengono inviati solo ai primi 3 record, i successivi no. Ora provo a vedere se riesco a usare phpmailer, vedo che la consigliano in tanti. :byebye:
 
Niente, ho provato con la class Php Mailer, ma nulla, oltre alle 3 email non va ecco il codice con la classe:

PHP:
<?php 
include_once ('config.php'); 
include_once('../archivio/phpmailer/class.phpmailer.php');
$mail = new PHPMailer();

$oggi = (date("d/m/Y")); 

$query = "SELECT * FROM mail WHERE data_rem = '$oggi'"; 
$res = mysql_query($query); 
if(mysql_num_rows($res)> 0){ 
    while ($row = mysql_fetch_assoc($res)){  
        $destinatario = $row['email'];
		$mail->From = "info@tuosito.com";
		$mail->FromName = "Nome del sito";	
		$mail->Subject = "Archivio: Scadenza pagamenti"; 		
		$mail->Body =   
        "Gentile Cliente, \n 
        Hai un documento in scadenza. \n 
        Cordiali Saluti. \n 
        Ballonzi di sotto, $oggi 
        "; 
		$mail->AddAddress($destinatario);
		if($mail->Send()){
		$em_inviate[]=$destinatario;// invio ok 
        }
		else{ 
            $em_errore[]=$destinatario;// invio ko 
        } 
        usleep(500);//mezzo secondo tra un invio e un
	}
		
	if(is_array($em_inviate)){ 
    echo "sono state inviate le seguenti email:<br>"; 
    foreach($em_inviate as $valore){ 
        echo "$valore<br>"; 
		} 
	}	 
	if(is_array($em_errore)){ 
    echo "le seguenti email non sono state inviate:<br>"; 
    foreach($em_errore as $valore){ 
        echo "$valore<br>"; 
		} 
	} 	
} 
?>

Ho provato con diversi gestori, e il problema non sono loro, perché se tipo metto libero.it come 4° email non viene inviata, mentre se la metto seconda si.
1° esempio
image.png

2° esempio
image.png


Poi una altra cosa, che non va bene, e che tutti i destinatari vedono le email degli altri....
 
Ultima modifica:
ciao
aggiungi le due righe dopo l'invio
PHP:
<?php 
include_once ('config.php'); 
include_once('../archivio/phpmailer/class.phpmailer.php');
$mail = new PHPMailer();
$oggi = (date("d/m/Y")); 
$query = "SELECT * FROM mail WHERE data_rem = '$oggi'"; 
$res = mysql_query($query); 
if(mysql_num_rows($res)> 0){ 
    while ($row = mysql_fetch_assoc($res)){  
        $destinatario = $row['email'];
        $mail->From = "info@tuosito.com";
        $mail->FromName = "Nome del sito";    
        $mail->Subject = "Archivio: Scadenza pagamenti";         
        $mail->Body =   
        "Gentile Cliente, \n 
        Hai un documento in scadenza. \n 
        Cordiali Saluti. \n 
        Ballonzi di sotto, $oggi 
        "; 
        $mail->AddAddress($destinatario);
        if($mail->Send()){
        	$em_inviate[]=$destinatario;// invio ok 
        }else{ 
            $em_errore[]=$destinatario;// invio ko 
        } 
        //aggiungi queste due righe
		$mail->ClearAddresses();
		$mail->ClearAllRecipients();
		usleep(500);//mezzo secondo tra un invio e un
    }
    if(is_array($em_inviate)){ 
    	echo "sono state inviate le seguenti email:<br>"; 
    	foreach($em_inviate as $valore){ 
			echo "$valore<br>"; 
        } 
    }     
    if(is_array($em_errore)){ 
    	echo "le seguenti email non sono state inviate:<br>"; 
    	foreach($em_errore as $valore){ 
        	echo "$valore<br>"; 
        } 
    }     
} 
?>

poi per verificare che sia giusto il db fatti uno scriptnino che visualizzai solo le email (non le invii) che dovrebbero essere inviate
 
Ciao, con questa modifica, ho risolto il problema degli indirizzi, ora come destinatario vedo solo uno (il mio di utente del sito). Mentre non riesco a capire perché più di 3 tre non riesco a inviare....Ho provato diversi gestori ma nulla, ho creato lo script per verificare il db, e vengono estratti tutte e 6 le email che ho messo ...:hammer:
 

Discussioni simili