8768 sujets

Développement web côté serveur, CMS

Bonjour à Tous,

Je suis en train de faire un système de newsletter pour envoyer aux clients abonnés.
Mon template mailing est un fichier php et non html car je récupère le contenu de mon fichier dynamiquement.
Certains d'entre vous me diront d'aller chercher il y a plusieurs exemples sur internet. Rassurer-vous j'ai déjà fait de recherche mais je ne trouve pas un exemple adapté à mon cas. Je vous montre un exemple de mon code pour bien comprendre. Mais avant cela je rappelle que l'envoi de mail marche bien et je reçois belle et bien le contenu de mon mail (template). Seulement le problème est que mon template ne s'affiche pas correctement vu que je récupère le contenu dynamiquement il m'affiche tout le code des requêtes dans le mailing. Le contenu de mon fichier php est du html classique comme on fait pour les newsletters. C'est juste à la place des textes je mets des variables. Pour bien préciser j'ai fait un test avec un fichier (.html) et ça s'affiche correctement. Donc c'est le bout de code php qui cause problème ou bien le fichier (.php) lui même. Ce sont des hypothèses je n'en sais rien encore. C'est ma première expérience des listes de diffusion en php donc je ne maîtrise pas encore ce côté.

J'ai besoin de votre expérience pour m'aiguiller et m'aider peut être à résoudre ce problème. Merci par avance !

Code:

// fichier qui fait le traitement d'envoi de mail : envoi_mail.php
$now = gmdate('D, d M Y H:i:s') . ' GMT';
header("Expires: $now");
header("Last-Modified: $now");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
 
include "connect.php";
 
$req = $db->prepare('SELECT email FROM newsletter WHERE envoye = '0' LIMIT 100');
$req->execute() or die(print_r($req->errorInfo()));
 
foreach ($req->fetchAll() as $row) {
	$sujet_mail = "Newsletter Nov 2016";
	$dest = $row["email"];
	$mail = "newsletter@domaine.com";
	$envoyeur = "XXX Newsletter <$mailbox>";
	$text_mail = "";
 
	//fichier template mailing
	$fp = fopen("newsletter.php", "r");
 
        while (!feof($fp)) {
		$text_mail .= fgets($fp, 1024);
	}
        fclose($fp);
 
        $header =  "Content-Type: text/html\n";
	$header .= "From: $envoyeur\n";
	$header .= "Reply-To: $mail\n";
	$header .= "X-Mailer: PHP/".phpversion()."\n";
	$header .= "X-Sender: $mail\n"; 
	$header .= "Return-Path: $mail\n";
	$header .= "Errors-To: $mail\n"; 
	$header .= "Date: ".date("r")."\n";
	$header .= "MIME-Version: 1.0\n";
 
	$mailval = mail("$dest", $sujet_mail, $text_mail, $header);
 
    	if ($mailval == true) {
                $q = array('email'=>$dest);
    	        $sql = "UPDATE newsletter SET envoye = '1' WHERE email = :email";
    		$req = $db->prepare($sql);
        	$req->execute($q) or die(print_r($req->errorInfo()));
 
                echo '<p class="success">Votre mail a bien été envoyé avec success !</p>';
        } else {
               echo '<p class="error">Votre mail n\'a pas pu être envoyé.</p>';
        }
}

Et le fichier newsletter.php qui contient le contenu du mail dynamique.

Cdlt,
Modérateur
Bonjour, fopen ouvre et lit le fichier, mais ne l'exécute pas par php, c'est comme ouvrir le fichier avec un éditeur de code.

ce qu'il faudrait, c'est lire le fichier php comme un template, avec qqch du genre:


function get_template($page, $variables=array()){
  // Extracte le contenu de $variables dans le namespace local
  extract($variables, EXTR_SKIP);

  ob_start();
  include $page;
  return ob_get_clean();
}

$text = get_template('fichier.php', array('nom' => 'Albert'));

fichier.php:

Bonjour <?php print $nom; ?>

Modifié par kustolovic (30 Nov 2016 - 17:31)
Bonjour @kustolovic,

Merci d'avoir pris le temps de me répondre.
J'ai des questions à propos de la fonction fopen() et du deuxième paramètre de la fonction get_template(). Je récupère mes variables dynamiquement.

Est-ce que j'aurais besoin de ce 2e paramètre pour afficher mes variables dans mon template ? Puisque je fais directement des requêtes dans mon template pour afficher mes variables.

Ma fonction fopen() ne sert plus à rien dans ce cas ?

Merci !

Cdlt,
Modifié par dinolam (01 Dec 2016 - 09:41)
Modérateur
C'est juste une astuce pour faire les chose proprement.

include inclut (et interprète) le fichier php à l'endroit ou se trouve la commande include. Le fichier php ainsi inclut a accès à toutes les variables accessibles à l'endroit de l'include.

Comme on est dans une fonction, il n'a donc accès à à peu près rien (ce qui est le but recherché).

Le second paramètre permet de passer des variables en tableau associatif, sous la forme nomDeVariable => valeur, qui seront accessible dans le template grâce à «extract»

a écrit :
Est-ce que j'aurais besoin de ce 2e paramètre pour afficher mes variables dans mon template ? Puisque je fais directement des requêtes dans mon template pour afficher mes variables.

Non, mais j'ai copié/collé un code que j'avais dans un coin pour l'exemple. En terme de bonne pratique, on ne devrait jamais faire des requêtes dans un template. La version simplifiée dans laquelle le template n'a accès a aucune variable:

function get_template($page){
  ob_start();
  include $page;
  return ob_get_clean();
}


a écrit :
Ma fonction fopen() ne sert plus à rien dans ce cas ?

Toutafé
dinolam a écrit :
Bonjour à Tous,

Je suis en train de faire un système de newsletter pour envoyer aux clients abonnés.
Mon template mailing est un fichier php et non html car je récupère le contenu de mon fichier dynamiquement.
Certains d'entre vous me diront d'aller chercher il y a plusieurs exemples sur internet. Rassurer-vous j'ai déjà fait de recherche mais je ne trouve pas un exemple adapté à mon cas. Je vous montre un exemple de mon code pour bien comprendre. Mais avant cela je rappelle que l'envoi de mail marche bien et je reçois belle et bien le contenu de mon mail (template). Seulement le problème est que mon template ne s'affiche pas correctement vu que je récupère le contenu dynamiquement il m'affiche tout le code des requêtes dans le mailing. Le contenu de mon fichier php est du html classique comme on fait pour les newsletters. C'est juste à la place des textes je mets des variables. Pour bien préciser j'ai fait un test avec un fichier (.html) et ça s'affiche correctement. Donc c'est le bout de code php qui cause problème ou bien le fichier (.php) lui même. Ce sont des hypothèses je n'en sais rien encore. C'est ma première expérience des listes de diffusion en php donc je ne maîtrise pas encore ce côté.

J'ai besoin de votre expérience pour m'aiguiller et m'aider peut être à résoudre ce problème. Merci par avance !

Code:

// fichier qui fait le traitement d'envoi de mail : envoi_mail.php
$now = gmdate('D, d M Y H:i:s') . ' GMT';
header("Expires: $now");
header("Last-Modified: $now");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
 
include "connect.php";
 
$req = $db-&gt;prepare('SELECT email FROM newsletter WHERE envoye = '0' LIMIT 100');
$req-&gt;execute() or die(print_r($req-&gt;errorInfo()));
 
foreach ($req-&gt;fetchAll() as $row) {
	$sujet_mail = "Newsletter Nov 2016";
	$dest = $row["email"];
	$mail = "newsletter@domaine.com";
	$envoyeur = "XXX Newsletter &lt;$mailbox&gt;";
	$text_mail = "";
 
	//fichier template mailing
	$fp = fopen("newsletter.php", "r");
 
        while (!feof($fp)) {
		$text_mail .= fgets($fp, 1024);
	}
        fclose($fp);
 
        $header =  "Content-Type: text/html\n";
	$header .= "From: $envoyeur\n";
	$header .= "Reply-To: $mail\n";
	$header .= "X-Mailer: PHP/".phpversion()."\n";
	$header .= "X-Sender: $mail\n"; 
	$header .= "Return-Path: $mail\n";
	$header .= "Errors-To: $mail\n"; 
	$header .= "Date: ".date("r")."\n";
	$header .= "MIME-Version: 1.0\n";
 
	$mailval = mail("$dest", $sujet_mail, $text_mail, $header);
 
    	if ($mailval == true) {
                $q = array('email'=&gt;$dest);
    	        $sql = "UPDATE newsletter SET envoye = '1' WHERE email = :email";
    		$req = $db-&gt;prepare($sql);
        	$req-&gt;execute($q) or die(print_r($req-&gt;errorInfo()));
 
                echo '&lt;p class="success"&gt;Votre mail a bien été envoyé avec success !&lt;/p&gt;';
        } else {
               echo '&lt;p class="error"&gt;Votre mail n\'a pas pu être envoyé.&lt;/p&gt;';
        }
}

Et le fichier newsletter.php qui contient le contenu du mail dynamique.

Cdlt,