OVH Community, votre nouvel espace communautaire.

HowTo : newsletter PHP simple pour dédié


erwanpia
27/11/2007, 10h50
Bonjour, voici ma propre implémentation d'une newsletter au format HTML avec un script tout simple en php (fonction mail), qui utilise qmail et le shell. C'est du petit jeu, pour les gros consommateurs y'a SYMPA, je vais voir si je peux faire un howto

attention, j'ai testé avec des envois par paquets de 5000 jusqu'à 100000 et faut quand même vérifier la queue de temps (qu'elle se vide bien) et temps ainsi que l'espace disque

plus d'infos ici sur le suivi pendant l'envoi : http://forums.ovh.net/showthread.php?t=28936

ALORS j'ai 2 scripts (un de test et le vrai d'envoi) et un include, plus le fichier body.html qui contient une page HTML avec liens vers images sur le domaine qu'on veut (pas envoyées avec le mail surtout)

l'include (common.php) stocke les fonctions communes aux 2 scripts
Code:
' ;
$headers .= 'From: Diffusion '.$eol; 
$headers .= 'Reply-To:  Diffusion '.$eol; 
$headers .= 'Return-Path:  Diffusion '.$eol;    // these two to set reply
$headers .=  "Content-Transfer-Encoding: 8bit" .$eol; 
 
$headers .=    "X-Mailer: PHP" . phpversion()  . $eol; 
$headers.="Content-Type: text/html; charset=iso-8859-1";
$subject  ="salut tout le monde";
$message_body  = file_get_contents("body.html");

function email_custom($message_body, $recipient)
{
$message = str_replace("unsubscribe.php", "unsubscribe.php?email=" .$recipient,$message_body);
return $message;
}

?>
script de test : test.php (facile)

Code:
 SPAM
// wanadoo  => OK
 
 
include("common.php");

$recipient = "erwan@mondomaine.com";
$message=email_custom( $message_body, $recipient);
$mail_result = mail($recipient, $subject, $message,$headers  . "Content-Type: text/html; charset=iso-8859-1");
echo $mail_result;

?>
script d'envoi des 5000 : (send.php) utilise la table subscribers effacée au fur et à mesure pour pas envoyer 2 fois le mail. On est doublement protégés par une requete qui ne prend que les id>counter
lancer en shell avec php -q send.php
le db_mysql.inc.php peut etre facilement remplacé par une autre librairie de connexion à mysql
Code:
 $counter limit 0,5000";
echo $query;
$db->query($query);
$i=0;
echo "\n\n";
//start loop
while ($db->next_record())
{

$i++;
$recipient  =$db->f("email"); 
$subscribers_id =  $db->f("subscribers_id");
$time_start = microtime_float();
 
//send
$message=email_custom( $message_body, $recipient);
 
$mail_result = mail($recipient, $subject, $message,$headers . "Content-Type: text/html; charset=iso-8859-1");
if ($mail_result==1)
	{ 
	//write to file the id of this send
 
$fh = fopen($myFile, 'w') or die("can't open file");
$number = $subscribers_id;
fwrite($fh, $number);
fclose($fh);
$time_end = microtime_float();
$time = number_format($time_end - $time_start , 2, ',', ' ');
	echo " [$i] " . $recipient . " : " .   $time;
	$db2->query("delete from subscribers where subscribers_id = '$subscribers_id' and email like '" . $recipient . "'"); 
	flush();
	} 
else
	{
	
	echo("\nfail on $recipient [" . $subscribers_id . "]\n");
	}
}
echo "\n\n ending at subscribers_id : " . $subscribers_id;
?>