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='[email protected]';
		$messaggio->FromName='Newsletter ';
		$messaggio->AddAddress($row['mail']);
		$messaggio->AddReplyTo('[email protected]'); 
		$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: [email protected]<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);
	}
	
	
}
?>
 

Salvo Salvi

Utente Attivo
14 Nov 2012
230
0
0
io ti consiglio fra un email e l'altra di fare passare circa 2 secondi sennò rischi di andare negli spam
 

Salvo Salvi

Utente Attivo
14 Nov 2012
230
0
0
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
 

lorenzo84

Utente Attivo
22 Lug 2012
239
0
16
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?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
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
 

lorenzo84

Utente Attivo
22 Lug 2012
239
0
16
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,...
 

lorenzo84

Utente Attivo
22 Lug 2012
239
0
16
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);
	}
	}
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
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
[email protected]
[email protected]
[email protected] ecc...
al primo ciclo del while inviava a [email protected]
al secondo inviava a [email protected] e [email protected]
al terzo inviava a [email protected], [email protected] e [email protected]
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)
 

lorenzo84

Utente Attivo
22 Lug 2012
239
0
16
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?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
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
 

lorenzo84

Utente Attivo
22 Lug 2012
239
0
16
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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
ciao
l'hai scritta così?
PHP:
<?php
//......
$messaggio_alternativo="quello che vuoi";
//....
$messaggio->AltBody=$messaggio_alternativo;
//....
?>
 

lorenzo84

Utente Attivo
22 Lug 2012
239
0
16
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
Autore Titolo Forum Risposte Data
L problema invio newsletter con script proprio in php PHP 10
M script per invio newsletter Classic ASP 4
B script newsletter in italiano PHP 3
L script per invio newsletter PHP 1
A Script Newsletter su Aruba Hosting 0
S script newsletter PHP 3
D Lukeonweb newsletter .....script Classic ASP 6
G Script notifiche dekstop aiuto Javascript 0
G [PHP] Creare script di prenotazione con controllo disponibilità. PHP 7
P Passare solo alcuni parametri a script per CSV PHP 0
M Collegamento tra form html e script php PHP 4
F Script java elenco alfabetico non funziona Javascript 3
F Script non funzionante. Devo elencare in ordine alfabetico un elenco di nominativi, ma lo script non Javascript 2
P Script upload immagini jQuery 0
M Premature end of script headers PHP 1
Cosina script data aggiornamento pagina Javascript 1
R Distribuire uno Script "Facebook Auto Post" PHP 0
F Creazione script Tv Presentati al Forum 1
N Script elenco file HTML HTML e CSS 5
felino PHP e script generazione file excel PHP 2
MarcoGrazia Se non sai se riceverai da GET o da POST, puoi verificarlo e far scegliere allo script. Snippet PHP 0
Beppe2 Ritardare esecuzione script Javascript 2
R Primo script in PHP / CSS PHP 4
felino Script PHP per leggere un file JSON. autenticazione? PHP 4
T [a pagamento] programmatore PHP che mi aiuti a migrare gli script da vecchia versione PHP a nuova Offerte e Richieste di Lavoro e/o Collaborazione 1
T script jquery non funziona più dopo il passaggio a MVC jQuery 5
F Aiuto java script Javascript 2
Max 1 [PHP] Script che funziona in locale e non online PHP 16
O [PHP] inviare dati da form e script ajax PHP 0
P [PHP] Aggiungere un mio script a prestashop? PHP 10
D [Javascript] inserire uno script in un file php Javascript 6
Gabriele15497514 php testo errato durante la lettura del file txt quando lo script viene eseguito contemporaneamente PHP 3
R [Javascript] Aiuto su questo script Javascript 2
M [HTML] Stesso script su 2 blog CMS (Content Management System) 4
romeocharly [PHP] Script per rinominare in automatico le immagini inviate da ftp PHP 0
elpirata [Javascript] Lo script alle volte funzione altre volte no Javascript 0
A [PHP] Script con array con numeri che iniziano per 00 PHP 2
F [HTML] Failed script su coffee cookies HTML e CSS 1
TpD [PHP] Script per organizzazione presenza eventi PHP 3
D [PHP] script che invii una mail automatica dopo risposta ad una discussione di un forum PHP 0
T interpretare uno script php non fatto da me... PHP 3
Cosina Modifica script textarea jQuery 0
O Script PHP e loro visibilità PHP 4
A [PHP] Script Ip camera su altervista senza sottocartelle PHP 6
M [PHP] Problema script ricezione e invio posta... PHP 1
Y Codice AdSense su script php PHP 4
L [PHP] Problema Script 'Not Found' PHP 4
webmachine [PHP] Script per censurare parole PHP 4
L [HTML] Domanda: Utilizzo script HTML e CSS 0
C richiamare una funzione in un altro script php PHP 1

Discussioni simili