Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
Dreamgratuit - Philosophie
23 novembre 2007

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  :

news26

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  :

news27

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&eacute;lectionner" onclick="set(1)" /></td>
    <td><input name="deselection" type="button" id="deselection" value="Tout d&eacute;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 :

code_envoi

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.

Publicité
Commentaires
P
Bonjour, après avoir suivi attentivement votre tutoriel jusqu'ici, le dernier tuto ne fonctionne pas au niveau de la réception de la newsletter. Le texte qui provient de la bdd n'apparait pas dans les mails. Avez vous peut_etre une solution a proposer. Merci d'avance de votre réponse
M
Bonjour<br /> <br /> Merci pour ce script. <br /> Je rencontre un PB :<br /> la variable $contenu est issue d'une boucle while ou do (j'essayé les 2) la boucle fonstionne sur la page administration mais pas dans la newsletter que je reçois il y a uniquement le chiffre 1 à la place, est-ce le serveur (ovh) qui n'accepte pas les boucles et qui bloque?<br /> Merci d'avance pour votre réponse
C
Merci à Laurent de ses précisions sur les timeout OVH !
L
Un grand merci pour ce temps passé. Chapeau bas.<br /> <br /> j'ai cherché des fonctions de boucles pour les envois de mails et j'ai tout bonnement rajouté une fonction sleep(10); à la fin du script d'envoi<br /> <br /> Néanmoins, je me suis renseigné sur mon hébergeur ovh et voici ce qui se passe si vous envoyez sans faire de pause d'envoi :<br /> <br /> <br /> Envoi de mail par le Web:<br /> L'envoi de mails par le Web qui utilise la fonction mail() de PHP ou sendmail pour le CGI, ou SMTP (OVH reconnaît que l'envoi vient du Web) est soumis à une temporisation et un quota.<br /> <br /> A- Le quota<br /> Comme pour le SMTP, OVH traite 1 email par seconde et par adresse.<br /> Au delà de 1000 messages envoyés dans la journée, une pénalité d'1 seconde par message et par adresse est ajoutée.<br /> Donc, on arrive avec la temporisation suivante:<br /> Pour un mailing de 1000 e-mails, le dernier e-mail est traité et envoyé en moins de 20 minutes.<br /> Pour un mailing de 10000 e-mails,<br /> - au bout de 16 minutes, le serveur traite 1000 e-mails,<br /> - au bout de 49 minutes, le serveur traite 2000 e-mails,<br /> - au bout de 5h15 minutes, le serveur traite 10.000 e-mails.<br /> Pour un mailing de 50.000 e-mails<br /> - au bout de 16 minutes, le serveur traite 1000 e-mails,<br /> - au bout de 49 minutes, le serveur traite 2000 e-mails,<br /> - au bout de 5h, le serveur traite 10.000 e-mails,<br /> - au bout de 26h, le serveur traite 50.000 e-mails.
N
Enfin quelqu'un qui n'écrit paspour rien dire, sur les forums ou autres, j'ai cherché des reponses, qui ne valent pas un orteil de ce que tu offres! Merci pour les infos, je vais tenter de le mettre en patique sur mon site www.normandiejazzband.com, d'ici un peu moins d'un mois j'espère...enfin sinon bonnes fêtes et continue tes vrais cours, n'hésites pas à m'envoyer de nouvelles infos en news letter sur d'autres sujets, si t'as l'occazzzz!
Archives
Publicité
Publicité