Page 1 sur 1

Problème avec script de newsletter

Posté : 15 nov. 2006, 07:59
par ludodoludujodu
Bonjour,

Comme certain auront pu le remarquer je suis nouveau, je ne savais pas trop dans quelle catégorie poster ce sujet mais j'utilise php5 alors tant qu'a faire... ^^

Bon maintanant voici mon problème:

Bonsoir,

Ce script qui permet d'envoyer des newsletters (comme vous aurez pu le remarquer j'utilise le système de template phplib):
<?php
$titrePage = "Envoyer une newsletter"; // Titre de la pages
$cheminTemplate = '../includes/'; // Indique ici le chemin où se trouve le fichier template.php
$cheminHtml = '../templates/'; // Indique ici le chemin des fichiers.tpl
$repBase = "../"; // Indique ici le chemin du répertoire base
$listeCSS = array('formulaire.css'); // Liste des css à charger

include($cheminTemplate.'template.php');
$template = new Template($cheminHtml);

include($cheminTemplate.'redirection.php');

session_start();
if(!empty($_SESSION['admin']) && !empty($_SESSION['superadmin']) && $_SESSION['superadmin'] == 'oui') {
if(isset($_POST['texte'], $_POST['sujet'])) {
if(!empty($_POST['texte']) && !empty($_POST['sujet'])) {

$expediteur = "[email protected]";
$sujet = '[ Newsletter BoT-DoPo ] '.$_POST['sujet'];
$message = '
<html>
<head>
</head>
<body>
'.nl2br($_POST['texte']).'
</body>
</html>
';

$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$headers .= 'To: ' . $expediteur . '' . "\r\n";
$headers .= 'From: ' . $expediteur . '' . "\r\n";

include($cheminTemplate.'sql.php');
connect();

$retour = mysql_query('SELECT email FROM channels WHERE newsletter="oui"'); // On sélectionne les adresses mail des membres
while ($donnees = mysql_fetch_array($retour))
{
mail($donnees['email'], $sujet, $message, $headers);
}
redirection('admin/index.shtml', 'La newsletter a bien été envoyée.', '4', @$repBase,  $template);
}
else {
redirection('admin/envoi-newsletter.shtml', 'Vous n\'avez pas rempli tous les champs.', '4', @$repBase,  $template);
}
}
else {
include($cheminTemplate.'haut.php');

$template->set_filenames(array(
        'envoi_newsletter' => 'admin/envoi_newsletter.tpl'
));

$template->pparse('envoi_newsletter');

include($cheminTemplate.'bas.php');
}
}
else {
redirection('admin/index.shtml', 'Vous n\'êtes pas autorisé à accéder à cette page.', '4', @$repBase,  $template);
}
?>
Pour l'instant je ne l'utilise qu'en local sur un ordinateur assez puissant et une connexion 8 méga avec le serveur smtp de neuf.fr mais je trouve que ce script est quand même long à s'executer.

Il n'y aurait pas moyen qu'il soit donc plus court à s'executer ?

Par exemple comment font les gros site pour envoyer des newsletters à des milliers de personnes, j'imagine que ça ne pend pas 20 minutes...

Merci d'avance pour vos réponse :p

Posté : 15 nov. 2006, 09:20
par Cyrano
Salut,
les sites qui font ça utilisent le plus souvent une classe pour l'envoi, comme par exemple phpmailer pour les envois en masse.

Un système que tu pourrais aussi envisager, c'est de regrouper les envois en nombre avec l'utilisation d'un en-tête BCC pour faire des envois multiples au lieu d'un envoi unique par adresse. Mais ça veut dire une petite modification dans le déroulement de ton code en récupérant d'abord les adresses et ensuite seulement en construisant les en-têtes à partir de listes d'adresses.

Posté : 15 nov. 2006, 11:22
par ludodoludujodu
Je n'ai pas trop compris la deuxième méthode que tu m'explique.

Posté : 15 nov. 2006, 11:25
par Cyrano
Un petit tour sur le manuel PHP à propos de la fonction mail() va te permettre de voir des exemples sur la manière d'envoyer un même message à plusieurs destinataires en copies cachées (bcc). En comprenant ça, il te restera très peu de choses à faire : stocker les adresses récupérées depuis la base dans un tableau indexé et ensuite une boucle pour créer dynamiquement un en-tête BCC pour l'envoi.

Posté : 15 nov. 2006, 12:11
par ludodoludujodu
En fait c'est la signification de bcc que je ne comprenais pas, je n'avais pas pensé à envoyer les mails de cette façon ;-) mais si je l'envois à des centaines de personnes en même temps le serveur smtp va pas saturer (ou refuser l'envoi car j'utilise le serveur smtp.neuf.fr , pour l'instant ce script est en local) ???

Posté : 15 nov. 2006, 12:21
par ludodoludujodu
J'ai fais ça:

Code : Tout sélectionner

$ $bcc = ''; $retour = mysql_query('SELECT email FROM channels WHERE newsletter="oui"'); // On sélectionne les adresses mail des membres while ($donnees = mysql_fetch_array($retour)) { $bcc = $bcc.'; '.$donnees['email']; } $expediteur = "[email protected]"; $sujet = '[ Newsletter BoT-DoPo ] '.$_POST['sujet']; $message = ' <html> <head> </head> <body> '.nl2br($_POST['texte']).' </body> </html> '; $headers .= 'Bcc: ' . $bcc . '' . "\r\n"; // Copies cachées $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; $headers .= 'To: ' . $expediteur . '' . "\r\n"; $headers .= 'From: ' . $expediteur . '' . "\r\n"; include($cheminTemplate.'sql.php'); connect(); mail($expediteur, $sujet, $message, $headers);
Je voudrais juste savoir si c'est bon (car j'ai pas encore allumé mon serveur local :p )

Posté : 15 nov. 2006, 12:53
par ludodoludujodu
Le problème c'est que je viens de voir sur un site que l'utilisation de bcc pour l'envoi de newsletter est déconseillé car l'adresse de la personne n'apparait pas dans le chmap "TO" donc le courrier est cnsidéré comme spam.

Posté : 15 nov. 2006, 14:08
par Cyrano
Ben de toutes façon, si je regarde ton code, le champ "To" est alimenté par l'adresse... de l'expéditeur, c'est pas tellement mieux.

Et pour résumer, si l'opération est trop longue, découpe le problème : fait des paquets d'adresses et expédie en plusieurs fois.

Posté : 15 nov. 2006, 16:01
par ludodoludujodu
Mais le temps ne reviendrait pas au même ? si à la place de faire 2 minutes on fait 4 fois 30 secondes ça sert à rien :p