erwanpia
27/11/2007, 11h50
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
script de test : test.php (facile)
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
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:
$from = 'Diffusion' ; $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; } ?>
Code:
$eol="\n"; // testé : thunderbird, hotmail , laposte.net , // yahoo => 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; ?>
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:
$eol="\n"; set_time_limit(0); function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } function add_notice_message($str) { echo $str; } include("common.php"); include("db_mysql.inc.php"); $db=new DB_Sql; $db2=new DB_Sql; $myFile = "counter.txt"; //read //query to array $counter = file_get_contents($myFile); if ($counter=="") $counter="0"; echo "\n\ncounter : " . $counter; echo"\n\n"; //query $query = "select subscribers_id, email from subscribers where subscribers_id > $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; ?>