Script newsletter creato da me. Mi date consigli?

lorenzo84

Utente Attivo
22 Lug 2012
239
0
16
Ho realizzato uno script per la gestione di una newsletter. Una prima versione l'ho già creata e sembra funzionare ma volevo sottoporre alla vostra attenzione la parte che invia la newsletter per verificare eventuali errori. Il meccanismo è molto semplice. Ricevo da un'altra pagina l'id della newsletter da inviare e qui mi estraggo dal db il numero di utenti abilitati a ricevere la newsletter. A questo punto mi creo una sorta di paginazione automatica per non far andare la pagina in timeout che reindirizza automaticamente alla medesima pagina fino alla fine degli utenti. La fine la avrò al momento che la pagina attuale sarà uguale al totale delle pagine.
Ho già provato e sembra funzionare ma sicuramente qualcuno più esperto può aiutarmi. Volevo inoltre rendere la newsletter più flessibile sia nella creazione delle news che nella gestione di eventuali gruppi di utenti a cui inviare news personalizzate.
Inoltre è previsto l'inserimento in una tabella temporanea degli indirizzi mail per il quale si è verificato un errore e la news non è stata inviata.L'inizio dell'invio avviene alla pressione di un bottone e da li inizia il ciclo...
Una volta che ho finito volevo rendere lo script pubblico ma per renderlo pubblico voglio essere sicuro che funzioni.
grazie

PHP:
<?php
	require 'lib/controllo.php';
	require 'lib/config.php';
	$conn = @mysqli_connect($host, $user, $pass, $db) or die(mysqli_connect_error());
	require "phpmailer/class.phpmailer.php";
	//cambia metodo invio mail con phpmailer
	if(!isset($_SESSION['ci']))
	{
		$_SESSION['ci']=0;
	}	
	if(isset($_GET['close']))
	{
		unset($_SESSION['ci']);
		$queryerrori="DELETE FROM t6587_newsletter_check_invio where ris_invio=1";
		$risultatoerrori=mysqli_query($conn,$queryerrori);
		header("location: newsletter.php");
		
	}
//Inizio gestione paginazione 
	$nnewstemp=trim($_GET['nnews']);
	$nnews=mysqli_real_escape_string($conn,$nnewstemp);
	$i=0;
	$numutentimax=3;
	$querytot="select count(id) as tot from t6745_newsletter_utenti where stato=1 and attivata=1";
	$risultatotot=mysqli_query($conn,$querytot);
	$row = mysqli_fetch_assoc($risultatotot);
	$utentitot=$row['tot'];
	$numeropagine=ceil($utentitot/$numutentimax);
	if(isset($_GET['gruppo']))
	{
		$pagina=$_GET['gruppo'];
	}
	else
	{
		$pagina=0;
	}
	if ($pagina>=1)
	{
		$paginasucc=$pagina+1;
		$paginaprec=$pagina-1;
	}
	$ultimovisual=0;
	if($pagina>=2)
	{
		for($y=1;$y<$pagina;$y++)
		{	
			$ultimovisual=$ultimovisual+$numutentimax;
		}
	}
	else
	{
		$ultimovisual=0;
	}
if(isset($_GET['op']))
{
	$querynews="select * from t6935_newsletter_inviate where id=$nnews";
	$risultatonews=mysqli_query($conn,$querynews);
	$rownews = mysqli_fetch_assoc($risultatonews);
	$titolonews=$rownews['titolo'];
	$testonews=$rownews['testo'];
	$mexalto='
		<html><body><head>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		</head>
		<body style="background-color:#DDDDDD;width:80%;margin:auto;">
				<table width="100%">
				<tr>
				<td style="background:#096096;color:silver;font-weight:bold;font-size:16px;">&nbsp; '.$titolonews.' - Newsletter </td>
				</tr>
				<tr>
				<td align="left"><img width="400px" src="#" alt="logo"></td>
				</tr>
				<tr><td>
				
		';		
	$mexmedio='
	</tr>
				<tr>
				<br>
				<td>
				'.$testonews.'
				</td>
				</tr>
				<tr>
				<td>
				<br>
				<hr>
		
				
	';
	$mexbasso='<br>
				</td>
				<hr>
				</tr>
				<tr>
				<td style="background:#096096;color:silver;font-weight:bold;font-size:16px;">
				&nbsp; Footer
				</td>
				</tr>
				</table>';
	//estrazione utenti
	$queryutenti="select * from t6745_newsletter_utenti where stato=1 and attivata=1 order by id desc limit $ultimovisual,$numutentimax";
	$risultatoutenti=mysqli_query($conn,$queryutenti);
	$numrighe=mysqli_num_rows($risultatoutenti);
	while ($row = mysqli_fetch_assoc($risultatoutenti)) 
	{	
		$messaggio = new PHPmailer();
		//$messaggio->IsSMTP();

		//settiamo su true il metodo che indica alla classe 
		//il formato HTML
		$messaggio->IsHTML(true);
		//$messaggio->Host='Host SMTP';

		//intestazioni e corpo dell'email
		$messaggio->From='news@newsletter.it';
		$messaggio->FromName='Newsletter ';
		$messaggio->AddAddress($row['mail']);
		$messaggio->AddReplyTo('news@newsletter.it'); 
		$messaggio->Subject="Newsletter - $titolonews";
		
		//inseriamo i tag HTML e i CSS per formattare il messaggio
		$messaggio->Body = ''.$mexalto.'';
		$messaggio->Body .= '<small>Ricevi questa mail perch&egrave; sei iscritto/a alla newsletter<br>
				Per informazioni scrivi a: info@newsletter.it<br><a title="cancellati" href="#">Se non vuoi pi&ugrave ricevere informazioni clicca qui  </a></small><br><br></td>';
		
		$messaggio->Body .= ''.$mexmedio.'';
		
		$messaggio->Body .= ''.$mexbasso.'';		
		$messaggio->Body .= '</body></html>';
		//parte relativa all'invio
		if(!$messaggio->Send())
		{ 
			$querycheck="insert into t6587_newsletter_check_invio (mail_utente,id_utente,ris_invio,newsletter_id) VALUES ('".$row['mail']."',".$row['id'].",0,$nnews)";
			$risultatocheck=mysqli_query($conn,$querycheck);
				
		}
		else
		{ 
			if($pagina==$numeropagine )
			{
				//Qui quando si arriva alla fine esce e setta la newsletter come inviata
				$querycheck="insert into t6587_newsletter_check_invio (mail_utente,id_utente,ris_invio,newsletter_id) VALUES ('".$row['mail']."',".$row['id'].",1,$nnews)";
				$risultatocheck=mysqli_query($conn,$querycheck);
				$_SESSION['ci']++;
				$nnewstemp=trim($_GET['nnews']);
				$nnews=mysqli_real_escape_string($conn,$nnewstemp);
				$queryinsnews="update t6935_newsletter_inviate set inviata=1 where id=$nnews ";	
				$ricevutainsnews= mysqli_query($conn,$queryinsnews);
			}
			else
			{
				$querycheck="insert into t6587_newsletter_check_invio (mail_utente,id_utente,ris_invio,newsletter_id) VALUES ('".$row['mail']."',".$row['id'].",1,$nnews)";
				$risultatocheck=mysqli_query($conn,$querycheck);
				$_SESSION['ci']++;
				header("location: invionewsletter.php?gruppo=$paginasucc&op=1&nnews=$nnews");
			}
		}		
		$messaggio->SmtpClose();
		unset($messaggio);
		unset($row);
	}
	
	
}
?>
 
io ti consiglio fra un email e l'altra di fare passare circa 2 secondi sennò rischi di andare negli spam
 
non so se può funzionare ma, invii un email per volta e ricarichi con header('location: .....?id=2');
aumentando sempre il numero id.
Ad un numero id deve corrispondere una nuova ricerca dal database e quindi una nuova email.
Non so se mi sono spiegato e se può funzionare
 
Io mi estraggo 20 indirizzi e ne mando venti poi con header ricarico e inizio un altro gruppo da dove ero arrivato fino ad altri venti e così via... Se metto un timer di 2 secondi non rischio il timeout della pagina?
 
io ti consiglio fra un email e l'altra di fare passare circa 2 secondi sennò rischi di andare negli spam
ciao
rischi di andare in spam se mandi troppe email al gg (circa 100), io usavo un intervallo di 1 sec tra una email e l'altra, serve comunque anche per non intasare il server
poi avevo impostato il tempo di vita dello script
PHP:
set_time_limit(240);
un'altra cosa: se vuoi rendere pubblico lo script abbandona mysql e passa a mysqli o meglio alla PDO
 
ma se uso un server smtp rischio di andare nello spam? Per il momento preferisco continuare con mysqli poi mi studierò la PDO che a sua volta richiede la programmazione a oggetti che non ho mai digerito bene,...
 
Ripropongo lo script aggiornato a mysqli. Ma il meccanismo secondo voi può funzionare?

PHP:
require 'lib/controllo.php';
	require 'lib/config.php';
	$conn = @mysqli_connect($host, $user, $pass, $db) or die(mysqli_connect_error());
	//fine
	//session_start();
	$nnewstemp=trim($_GET['nnews']); //Recupero ID della newsletter da inviare
	$nnews=mysqli_real_escape_string($conn,$nnewstemp);
	$_SESSION['nnews']=$nnews;
	require "phpmailer/class.phpmailer.php";
	ob_start(); 
	require 'layout/layout1.php'; 
	$page = ob_get_contents(); 
	ob_end_clean(); 
	//$page=file_get_contents("layout/layout1.php");
	
	if(!isset($_SESSION['ci']))
	{
		$_SESSION['ci']=0;
	}	
	//Quando l'invio è terminato una variabile viene settata a "close" e viene 
	//cancellato dalla tabella t6587_newsletter_check_invio tutti i record per il quale 
	//l'invio è andato a buon fine
	if(isset($_GET['close'])) 
	{
		unset($_SESSION['ci']);
		unset($_SESSION['nnews']);
		$queryerrori="DELETE FROM t6587_newsletter_check_invio where ris_invio=1";
		$risultatoerrori=mysqli_query($conn,$queryerrori);
		header("location: indexadmin.php");	
	}
	//Inizio gestione paginazione 
	$i=0;
	//$numutentimax=3;
	$querytot="select count(id) as tot from t6745_newsletter_utenti where stato=1 and attivata=1";
	$risultatotot=mysqli_query($conn,$querytot);
	$row = mysqli_fetch_assoc($risultatotot);
	$utentitot=$row['tot'];
	$numeropagine=ceil($utentitot/$numutentimax);
	if(isset($_GET['gruppo']))
	{
		$pagina=$_GET['gruppo'];
	}
	else
	{
		$pagina=0;
	}
	if ($pagina>=1)
	{
		$paginasucc=$pagina+1;
		$paginaprec=$pagina-1;
	}
	$ultimovisual=0;
	if($pagina>=2)
	{
		for($y=1;$y<$pagina;$y++)
		{	
			$ultimovisual=$ultimovisual+$numutentimax;
		}
	}
	else
	{
		$ultimovisual=0;
	}
	//Fine Paginazione
	if(isset($_GET['op']))
	{
	//estrazione utenti
	$queryutenti="select * from t6745_newsletter_utenti where stato=1 and attivata=1 order by id desc limit $ultimovisual,$numutentimax";
	$risultatoutenti=mysqli_query($conn,$queryutenti);
	$numrighe=mysqli_num_rows($risultatoutenti);
	while ($row = mysqli_fetch_assoc($risultatoutenti)) 
	{	
		$messaggio = new PHPmailer();
		$messaggio->IsHTML(true);
		//intestazioni e corpo dell'email
		$messaggio->CharSet = 'UTF-8';
		$messaggio->From= $inviatoda;
		$messaggio->FromName= $inviatodanome;
		$messaggio->AddAddress($row['mail']);
		$messaggio->AddReplyTo($inviatoda); 
		$messaggio->Subject="Newsletter - ".$nomesito."";
		//inseriamo i tag HTML e i CSS per formattare il messaggio
		$messaggio->Body = ''.$page.'';
		//$messaggio->AltBody("test");
		//parte relativa all'invio
		if(!$messaggio->Send())
		{ 	//inserisco record in una tabella provvisoria se l'invio non va a buon fine
			$querycheck="insert into t6587_newsletter_check_invio (mail_utente,id_utente,ris_invio,newsletter_id) VALUES ('".$row['mail']."',".$row['id'].",0,$nnews)";
			$risultatocheck=mysqli_query($conn,$querycheck);	
		}
		else
		{ 
			if($pagina==$numeropagine )
			{
				//Qui quando si arriva alla fine esce e setta la newsletter come inviata
				$querycheck="insert into t6587_newsletter_check_invio (mail_utente,id_utente,ris_invio,newsletter_id) VALUES ('".$row['mail']."',".$row['id'].",1,$nnews)";
				$risultatocheck=mysqli_query($conn,$querycheck);
				$_SESSION['ci']++;
				$nnewstemp=trim($_GET['nnews']);
				$nnews=mysqli_real_escape_string($conn,$nnewstemp);
				$queryinsnews="update t6935_newsletter_inviate set inviata=1 where id=$nnews ";	
				$ricevutainsnews= mysqli_query($conn,$queryinsnews);
			}
			else
			{
				$querycheck="insert into t6587_newsletter_check_invio (mail_utente,id_utente,ris_invio,newsletter_id) VALUES ('".$row['mail']."',".$row['id'].",1,$nnews)";
				$risultatocheck=mysqli_query($conn,$querycheck);
				$_SESSION['ci']++;
				header("location: invionewsletter.php?gruppo=$paginasucc&op=1&nnews=$nnews");
			}
		}		
		$messaggio->SmtpClose();
		unset($messaggio);
		unset($row);
	}
	}
 
ciao
è un po' difficile dirti se funzia o no, uno dovrebbe farsi il db e provare ad inviare.
vista così non segnala errori di sintassi, ma ho un paio di dubbi.
1. dici di usare l'smtp ma non vedo di dati per settare phpmailer

PHP:
$messaggio->IsSMTP();  // send via SMTP
$messaggio->Host     = "smtp.tuo_server_smtp.it"; // SMTP servers
$messaggio->SMTPAuth = true;     // turn on SMTP authentication
$messaggio->Username = "tuo_username";  // SMTP username
$messaggio->Password = "tua_password"; // SMTP password

attento non tutti i provider accettano una cosa del genere

poi nel ciclo while
2. io quando l'avevo fatta anni fa mi ero accorto di una cosa
es tu hai in t6745_newsletter_utenti
pinco@pallo.it
sempronio@pallino.it
pallonzi@pancrazio.it ecc...
al primo ciclo del while inviava a pinco@pallo.it
al secondo inviava a pinco@pallo.it e sempronio@pallino.it
al terzo inviava a pinco@pallo.it, sempronio@pallino.it e pallonzi@pancrazio.it
ecc...
immagina te quante email ricevono a testa mandandoti come minimo a quel paese
quindi nel while dopo l'invio ho messo dopo l'invio
PHP:
$messaggio->ClearAddresses();
$messaggio->ClearAllRecipients();//questo è ridondante ma meglio che inviare diverse email a testa
3.
sempre nel while tra un invio e l'altro
PHP:
usleep(50);//mezzo secondo di attesa

comunque stai attento, nonostante tutto in molti casi ero stato messo in balcklist

per fare delle prove ti conviene mettere nel db solo alcune email di tuoi conoscenti (molto pazienti) avvisandoli che stai facendo delle prove

p.s.
se vuoi inviare via smtp verifica che nella cartella di phpmaler ci sia class.smtp.php (non devi richiamarla ci pensa phpmailer a richiamarsela se serve)
 
grazie per i consigli. Alcune precisazioni:

Smtp attualmente non lo uso ecco perchè non ci sono le stringhe in phpmailer.
Nel ciclo while le mail vengono inviate una ad una mentre scorre l'array di mysql quindi in teoria invia una mail per volta e dai test che ho fatto mi sono sempre arrivate una mail a indirizzo. In teoria, correggimi se sbaglio, quando faccio il while della query degli utenti dovrebbe estrarre un record per volta e quindi un indirizzo per volta. no?
 
ciao
simile avevo fatto anch'io un invio di newsletter, il problema per fortuna si è evidenziato nelle prove (il pechè vattelaapesca) sino a che non ho insertito il ClearAddresses(); nel while dopo l'invio
per l'smtp bo visto l'istruzione $messaggio->SmtpClose(); per quello dicevo che ti mancavano le istruzioni per smtp
 
era rimasta la riga dell'smtp ma non lo uso...

volevo chiedervi se esiste ancora AltBody in phpmailer perchè quando lo inserisco mi dice:

Fatal error: Call to undefined method PHPMailer::AltBody() in D:\xampp\htdocs\newsletter\invionewsletter.php on line 87
 
ciao
l'hai scritta così?
PHP:
<?php
//......
$messaggio_alternativo="quello che vuoi";
//....
$messaggio->AltBody=$messaggio_alternativo;
//....
?>
 
Vi chiedo se secondo voi per partire queste funzioni sono sufficienti e ovviamente se vi va aggiungete le vostre idee...

Le funzioni che ho previsto sono le seguenti:

Funzioni Generali:

  • Invio Mail con layout personalizzato
  • Invio per gruppi
  • Registro mail non inviate
  • Verifica Inserimento mail doppia
  • Importazione indirizzi da specifici fogli exel
  • Personalizzazione Interfaccia layout mail basilare con colori a scelta

Gestione News:

  • Visualizzazione elenco newsletter inviate
  • Stato news (inviata/da inviare)
  • Modifica del testo e titolo di una news
  • Cancellazione news


Gestione Utenti:

  • Inserimento Utente Manuale da Amministratore
  • Registrazione Utente
  • Attivazione/disattivazione Utente
  • Cancellazione Utente

Altre funzioni:

  • Possibilità di inviare singola newsletter a singolo utente
 

Discussioni simili