Page d'envoi de la newsletter - PHP : Créer une newsletter avec Dreamweaver (Part 19)
Merci à tous de votre patience ! Mon activité professionnelle me laisse à nouveau le loisir de reprendre la publication de ce tuto bien que l'interruption ait été bien plus longue que prévue !
Nous arrivons ici au cœur du sujet… Nous allons pour cela utiliser la fonction mail() de PHP pour procéder à l’expédition des newsletters.
Note importante sur la fonction mail() : cette fonction, très utile au demeurant, n’est en principe pas faite pour envoyer des mails en masse. Il est préférable pour cela d’utiliser un serveur SMTP. Avec une page exécutant la fonction mail de PHP vous pouvez en effet, en cas de données importantes à traiter (notamment nombre de destinataires), tomber en timeout. Il existe des solutions pour pallier à ce problème sans utiliser de serveur SMTP : exécuter le script par paquets de 30, 50 (ou plus) adresses mails. Plus le mail à envoyer est léger, plus vous pouvez envoyer de mails. J’ai quant à moi entendu parler de plus de 10000 mails envoyés au moyen d’un script mail() avec un timeout serveur à 30 minutes… A vous donc de vous adapter en fonction de ces différents paramètres. En tout état de cause, il vaut mieux envoyer vos newsletters à des moment de la journée où les serveurs ne sont pas trop saturés. Reportez-vous donc à vos statistiques de fréquentation pour déterminer l’heure optimale d’expédition (ou si vous êtes en hébergement mutualisé interrogez votre hébergeur). A noter aussi, certains hébergeurs interdisent l’envoi en masse de newsletter (notamment Free qui a désactivé la fonction).
Faites Fichier >> Nouveau. Choisissez « Pages dynamiques » et « PHP ». Enregistrer la page en la nommant envoi_newsletter.php. Afficher la fenêtre en mode code.
A la 1re ligne, faites insertion >> Server Side Include et sélectionnez le fichier acces_admin.inc.
Après la balise body, faites insertion >> Server Side Include et sélectionnez le fichier menu_admin.inc.
N’oubliez pas d’importer votre feuille de style admin.css.
Vous devez tout d’abord sélectionner les adresses mails qui permettront l’expédition de votre newsletter à ses destinataires.
Allez dans le panneau Liaison >> Jeu d’enregistrement. Renseignez votre fenêtre comme ci-dessous :
Vous devez ensuite créer un enregistrement permettant de filtrer la newsletter que vous souhaitez envoyer. Celle-ci est déterminée par le paramètre d’URL transmis par le lien de la page admin.php.
Allez dans le panneau Liaison >> Jeu d’enregistrement. Renseignez votre fenêtre comme ci-dessous :
Il s’agit maintenant :
- d’instancier la variable d’objet du mail et la variable de contenu du mail,
- de créer la boucle qui permet d’expédier un mail à chaque destinataire,
- de créer l’en-tête du mail.
En dessous de la ligne :
$totalRows_Recordset2 = mysql_num_rows($Recordset2);
Ajouter la ligne de code suivante qui crée la variable d’objet du mail :
$titre = $row_Recordset2['objet'] ;
Maintenant, pour le contenu du mail :
$contenu = "<html><body> </body></html>";
Dans la balise <body> copiez/collez le code suivant correspondant au template vide la newsletter (attention, les doubles quotes ont été remplacé par des simples quotes, ce qui est volontaire ) :
<style type='text/css'>
div.conteneur {
margin: 10px;
width: 700px;
}
div.header1 {
background-color:#FF6600;
background-image:url(http://www.monsite.com/img/logo.jpg);
background-repeat:no-repeat;
background-position:10px 10px;
font: normal 24px Arial, Helvetica, sans-serif;
padding:23px 10px 23px 180px;
color: #fff;
}
div.header2 {
background-color:#0099CC;
font: bold 11px Verdana, Arial, Helvetica, sans-serif;
padding:5px;
color:#fff;
text-align:right;
}
div.contenu {
font: normal 11px Arial, Helvetica, sans-serif;
color:#777;
margin: 15px 0 0 0;
line-height:15px;
width: 530px;
float:left;
}
p.edito {
border: 2px solid #0099CC;
padding:15px;
line-height:18px;
}
h1.article1 {
font: bold 13px Georgia, 'Times New Roman', Times, serif;
color:#f60;
border-bottom: 1px solid #f60;
margin-top:20px;
}
p.article2 {
color:#555;
}
div.breves {
float: right;
width: 150px;
margin: 15px 0 0 10px;
background-color:#FFDFCA;
padding: 5px;
}
h2.breves1 {
font: bold 11px Verdana, Arial, Helvetica, sans-serif;
color:#f60;
}
p.breves2 {
font: normal 10px Verdana, Arial, Helvetica, sans-serif;
}
div.pied {
clear:both;
border-top: 1px dotted #ccc;
font: normal 11px Arial, Helvetica, sans-serif;
color:#999;
text-align:center;
margin-top: 20px;
padding: 5px;
}
</style>
<div class='conteneur'>
<div class='header1'>
La Lettre newsletter de monsite.com
</div>
<div class='header2'>";
$contenu .= echo $row_Recordset2['folio'];
$contenu .= "</div>
<div class='contenu'>";
$contenu .= echo $row_Recordset2['contenu'];
$contenu .= "</div>
<div class='breves'>";
$contenu .= echo $row_Recordset2['breves'];
$contenu .= "</div>
<div class='pied'>Disclaimer de la newsletter de monsite.com
<br />
<a href='newsletters/desabonne.php'>Se désabonner de cette newsletter</a></div>
</div>
Il faut maintenant créer le fonctionnel qui va expédier la newsletter à chaque abonné.
Nous allons pour cela nous inspirer de l’excellent tutorial de Jpierre sur le site ASP-PHP.net : http://www.asp-php.net/tutorial/asp-php/envoi_lettre.php
Insérer une balise <form> dans votre page que vous nommez form_list et cérer un tableau à 5 colonnes comportant les intitulés suivants (balises <th>) : Abonné, Fonction, Organisation, Mail, Expédition. Dans la 1re balise <td>, faites cliquer/glisser des variables {Recordset2.nom}, {Recordset2.fonction}, {Recordset2.organisme} et {Recordset2.mail}. Dans la 5e colonne ajouter une case à cocher que vous nommerez check_mail[] (les crochet sont importants).
Vous devez maintenant attribuer à cette case à cocher la valeur de la variable mail (vous pouvez faire un cliquer/glisser ou coder à la main):
<input name="check_mail[]" type="checkbox" id="check_mail[]" value="<?php echo $row_Recordset2['mail']; ?>" />
En dessous de votre 1er tableau, ajoutez-en un second avec 3 colonnes sur une ligne. Dans chacune des cellules insérez un bouton :
· 1er bouton : Tout sélectionner – ne cocher aucune action
· 2e bouton : Tout sélectionner – ne cocher aucune action
· 3e bouton : Envoyer la newsletter – action = envoyer le formulaire
Allez maintenant dans la balise <head> et ajouter le code javascript suivant :
<script>
function check() {
adresse_mail = "";
for (i=0; i<document.form_list.elements.length; i++) {
if (document.form_list.elements[i].checked==1) {
if (adresse_mail != "")
adresse_mail += ',' + document.form_list.elements[i].value;
else
adresse_mail = document.form_list.elements[i].value;
}
}
return adresse_mail;
}
function set(n) {
for (i=0; i<document.form_list.elements.length; i++)
document.form_list.elements[i].checked = n;
}
</script>
Allez maintenant dans la table contenant les boutons et ajouter les éléments suivants (en gras ci-dessous) :
<tr>
<td><input name="selection" type="button" value="Tout sélectionner" onclick="set(1)" /></td>
<td><input name="deselection" type="button" id="deselection" value="Tout déselectionner" onclick="set(0)" /></td>
<td><input type="submit" name="Submit" value="Envoyer la lettre" /></td>
</tr>
Dans le code PHP de la page, rajouter les ligne suivante correspondant à l’envoi du formulaire :
$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
$editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}
Vous vous souvenez que plus haut dans ce tuto nous avions instancié la valeur de la variable $titre. Au dessus de cette ligne, ajouter le code suivant (qui est commenté pour une meilleure compréhension) :
// on appelle la méthode post
if (isset($_POST['check_mail']) && $_POST['check_mail'] != "") {
// on avertit l'utilisateur
echo "<p><strong>Le processus d'envoi de mail est en cours... Vous allez être redirigé vers la page d'administration.</strong></p>";
Nous allons, en même temps que nous envoyons la newsletter, mettre à jour la table newsletter afin qu’une même newsletter ne soit pas envoyé 2 fois par erreur. Pour cela ajoutons deux champs masqués dans notre formulaire, en dessous de nos boutons (nous reviendrons plus tard sur la page admin_newsletter .php) :
<input name="id_newsletter" type="hidden" class="input" id="id_newsletter" value="<?php echo $row_Recordset1['id_newsletter']; ?>" />
<input name="date" type="hidden" class="input" id="date" value="<? echo date("Y-m-d"); ?>" />
A la suite de l’instanciation de la variable $contenu, ajoutons le code suivant :
// on ajoute un entête au mail afin qu’il s’affiche en HTML pour sa mise en forme
$entete = "From:moi@monsite.com\nMime-Version: 1.0\n";
$entete .= "Content-Type: text/html; charset=ISO-8859-1\n";
// ici le script de Jpierre envoyant la newsletter
for ($i=0; $i<sizeof($_POST['check_mail']); $i++) {
if (!mail($_POST['check_mail'][$i],$titre,$contenu,$entete)) {
echo "<p>erreur d'envoi</p>";
} else {
echo "<p>mail envoyé à :";
echo $_POST['check_mail'][$i]."</p>";
// Les lignes ci-dessous mettent à jour la table newsletter pour ajouter une sécurité dans l’interface
$updateSQL = sprintf("UPDATE newsletters SET date_envoi=%s, statut='1' WHERE id_newsletter=%s",
GetSQLValueString($_POST['date'], "date"),
GetSQLValueString($_POST['id_newsletter'], "int"));
mysql_select_db($database_connRecherche, $connRecherche);
$Result1 = mysql_query($updateSQL, $connRecherche) or die(mysql_error());
}
}
}
// Si la date d’envoi est bien renseignée et donc le script s’est correctement exécuté on re-route l’utilisateur sur la page d’admin.
if (isset($_POST['date']) && $_POST['date'] != "") {
header('Location: admin_newsletter.php');
}
Voilà nous en avons terminé avec la partie la plus importante de notre administration. Vous pouvez télécharger ci-dessous le totalité du code de la page :
Les prochains billets seront consacrés aux derniers réglages et aux finitions de notre application, notamment la mise à jour de la page admin_newsletter.php et la page de désabonnement à la newsletter.