IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

problème d'algortihme pour la création d'un email en PHP


Sujet :

Langage PHP

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut problème d'algortihme pour la création d'un email en PHP
    Bonjour tout le monde,

    J'envoie un email à plusieurs utilisateurs.

    Chaque utilisateur a donc droit au même message.

    J'aurais voulu ajouter dans le message de chacun une phrase qui leur permettrait de se désinscrire de la newsletter.

    Le problème est que je ne vois pas du tout comment je peux faire pour mettre le paramètre du destinataire vue que j'envoie l'info à plusieurs utilisateurs.

    Pour créer la liste des destinataires, je fais comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $header.= "Bcc:";
        //plusieurs destinataires cachés
        while($dest = mysql_fetch_array($query_destinataires))
        {
            $header.= $dest['email'].',';
        }
    Ce que je devrais faire, c'est lorsque je suis sur un destinataire (enregistrement de la bd), c'est de lui ajouter à lui seul une phrase du genre :

    Pour ne plus recevoir d'email de nous... avec un paramètre get qui serait du genre $dest['email_crypte'].

    Je ne vois vraiment pas comment faire.

    Un tout grand merci d'avance.

    beegees

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Si le mail est différent, ca devient evidemment un mail par utilisateur.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Je doute que tu puisse faire de la sorte, car c'est l'entête qui contient les différents e-mails en copie, mais pas le corps du message.
    Ici, les entêtes et le corps sont normalement 2 choses très différentes.
    Puis si tu modifie les entêtes et quelles ne sont pas conformes au contenu, ça risque de coincer lorsque l'interpréteur va vouloir afficher le message.

    A mon sens, des copies sont des copies, le contenu (le corps du message) sera le même pour tout le monde.

    Faudrait envoyer non pas en copie, mais de manière individuelle, et là tu pourras personnaliser chaque corps du message.

    Puis envoyés des mails en copie, pourquoi pas, mais même si ont les envoie en mode cachés, un client de messagerie permet de les voir, suffit d'afficher l'entête complète, donc de voir toutes les adresses mails

    [edit]
    sabotage ... toujours plus rapide
    [/edit]
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  4. #4
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Si le mail est différent, ca devient evidemment un mail par utilisateur.
    Salut,

    Ta remarque est pertinente.

    C'est dommage car c'était juste un paramètre qui accompagnait l'URL qui changeait.

    Encore merci pour ton aide.

    beegees

    Citation Envoyé par RunCodePhp Voir le message
    Salut

    Je doute que tu puisse faire de la sorte, car c'est l'entête qui contient les différents e-mails en copie, mais pas le corps du message.
    Ici, les entêtes et le corps sont normalement 2 choses très différentes.
    Puis si tu modifie les entêtes et quelles ne sont pas conformes au contenu, ça risque de coincer lorsque l'interpréteur va vouloir afficher le message.

    A mon sens, des copies sont des copies, le contenu (le corps du message) sera le même pour tout le monde.

    Faudrait envoyer non pas en copie, mais de manière individuelle, et là tu pourras personnaliser chaque corps du message.

    Puis envoyés des mails en copie, pourquoi pas, mais même si ont les envoie en mode cachés, un client de messagerie permet de les voir, suffit d'afficher l'entête complète, donc de voir toutes les adresses mails

    [edit]
    sabotage ... toujours plus rapide
    [/edit]


    Je vais suivre le conseil de mon Ami "Andry" , me disant sur le chat d'envoyer un email différent à chaque utilisateur en boucle.

    Merci à toi aussi pour ton aide.

    beegees

  5. #5
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2010
    Messages : 9
    Points : 10
    Points
    10
    Par défaut Bien différencier chaque mél...
    Si j'ai bien compris, tu veux générer un lien pour se désabonner propre à chacun dans leur newsletter.

    Tu as ta liste de destinataires d'un côté dans ta base de données ; Le corps du message que tu veux envoyer de l'autre.

    Dans ce cas, conçois le corps de ta newsletter dans une variable (ex: $corpnewsletter)

    Puis, tu crées une variable pour le lien de désabonnement (ex: $lienDesabonnement = 'http://www.vivemonsite.net/desabonnement.php?id=';

    Ensuite, dans ta requête pour pour récupérer tes destinataires, fais un SELECT destinataire_id, email FROM...

    Tu remplaces ta boucle,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     while($dest = mysql_fetch_array($query_destinataires))
        {
            $header.= $dest['email'].',';
        }
    Par celle-ci en concaténant tout ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //Initialisation de la variable melComplet
    $melComplet = "";
    $i = 0;
     
    while($dest = mysql_fetch_array($query_destinataires))
        {
    $melComplet['header'][$i]  = $dest['email'];
    $melComplet['corpsmessage'][$i] = $corpnewsletter.$lienDesabonnement.$dest['destinataire_id'];
    $i++;
        }
    Et enfin, une boucle 'FOR' pour chaque envoi de mél.

    Je ne vois pas comment tu peux envoyer des méls bien spécifiques à chacun sans faire ça.

  6. #6
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Salut riplay777,

    Merci pour ta réponse qui est très intéressante.

    J'ai donc suivi ton conseil pour arriver à ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while($dest = mysql_fetch_array($query_destinataires))
    		{
    			$melComplet['header'][$i]  = $dest['email'];
    			$melComplet['corpsmessage'][$i] = $$corpnewsletter.$lienDesabonnement.$dest['email_sha1'].$corpnewsletter_fin;
    			echo $melComplet['corpsmessage'][$i];
    			$i++;
    		}
    Par contre, je me suis planté dans la boucle for :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for($nbre=0; $nbre<$i;$nbre++)
    		{
    			mail($mail,$sujet,$message,$header);
    		}
    Il m'envoie deux fois au même destinataire.

    Voici le code de ma page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    <?php
        session_start();
        include('../includes/connexion.php');
     
     
    		$mail = 'moi@gmail.com'; // Dclaration de l'adresse de destination
    		if (preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $mail)) // O,n filtre les serveurs qui bugs
    		{
    			$passage_ligne = "\r\n";
    		}
    		else
    		{
    			$passage_ligne = "\n";
    		}
     
    		//=====Dclaration des messages au format texte et au format HTML
    		$$corpnewsletter = "<html><head></head><body>*** PLEASE, DO NOT REPLY TO THIS MESSAGE ***</br></br>";
    		//var_dump($_SESSION['tab_jours']);
     
    		$corpnewsletter.= 'Hello,</br></br>';
     
    		$corpnewsletter.= 'This is the news : </br></br>';
     
    		$corpnewsletter.= $_POST['titre']." </br></br>";
     
    		$corpnewsletter.="Regards</br></br>";
    		$corpnewsletter.= "THE 7th INTERNATIONAL HUMAN PEROXIDASE MEETING's team</br></br>";
    		$corpnewsletter.= 'If you do not wish to receive further communications like this, please click';
    		//.dest['email_crypte'].'&amp;choix=Unsubscribe">here</a>  to unsubscribe
    		$corpnewsletter.= '<a href="http://Congres/Confirmation_NL.php?id=';
    		$corpnewsletter_fin = "&amp;choix=Unsubscribe>here</a> to unsubscribe</body></html>";
    			//==========
     
    		//echo $corpnewsletter;
    		//=====Cration de la boundary
    		$boundary = "-----=".md5(rand());
    		//==========
     
    		//=====Dfinition du sujet
    		$sujet = "THE 7th INTERNATIONAL HUMAN PEROXIDASE MEETING's newsletter";
    		//=========
     
    		//=====Cration du header de l'e-mail
    		$header = "From: \"INTERNATIONAL HUMAN PEROXIDASE MEETING\"<moi@gmail.com>".$passage_ligne;
    		$header.= "Reply-to: \"noreply\" <noreply@INTERNATIONAL_HUMAN_PEROXIDASE_MEETING.com>".$passage_ligne;
     
    			$header.= $dest['email'].',';
     
    		//je retire la dernière virgule
    		$header=preg_replace("/,\s*$/","",$header);
    		$header.= $passage_ligne;
    		$header.= "MIME-Version: 1.0".$passage_ligne;
    		$header.= "Content-Type: multipart/alternative;".$passage_ligne."
    		boundary=\"$boundary\"".$passage_ligne;
    		//==========
     
    		//=====Cration du message
    		$message = $passage_ligne.$boundary.$passage_ligne;
    		//==========
     
    		//=====Ajout du message au format texte
    		$message.= "Content-Type: text/plain; charset=\"ISO-
    		8859-1\"".$passage_ligne;
    		$message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
    		$message.= $passage_ligne.$message_txt.$passage_ligne;
    		$message.= $passage_ligne."--".$boundary.$passage_ligne;
     
    		//=====Ajout du message au format HTML
    		$message.= "Content-Type: text/html; charset=\"ISO-
    		8859-1\"".$passage_ligne;
    		$message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
    		$message.= $passage_ligne.$corpnewsletter.$passage_ligne;
     
     
    		$message.= $passage_ligne."--".$boundary."--".$passage_ligne;
    		$message.= $passage_ligne."--".$boundary."--".$passage_ligne;
    		//==========
     
    		$sql_destinataires = "SELECT email FROM newsletter WHERE Envoi_OK = 1";
     
    		$query_destinataires = mysql_query($sql_destinataires);
     
    		$header.= "Bcc:";
    		$melComplet = "";
    		$i = 0;
     
    		while($dest = mysql_fetch_array($query_destinataires))
    		{
    			$melComplet['header'][$i]  = $dest['email'];
    			$melComplet['corpsmessage'][$i] = $$corpnewsletter.$lienDesabonnement.$dest['email_sha1'].$corpnewsletter_fin;
    			echo $melComplet['corpsmessage'][$i];
    			$i++;
    		}
    		//=====Envoi de l'e-mail
    		for($nbre=0; $nbre<$i;$nbre++)
    		{
    			mail($mail,$sujet,$message,$header);
    		}
     
    		//==========
     
     
     
     
     
    ?>
    Merci d'avance pour ton aide.

    beegees

  7. #7
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2010
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    Re,

    Je ne comprends pas bien pourquoi tu mets une variable dynamique : $$corpnewsletter au lieu de $corpnewsletter

    Par rapport à ce que je t'ai envoyé, il manque quelque chose dans ta requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql_destinataires = "SELECT email FROM newsletter WHERE Envoi_OK = 1";
    D'après ce que j'en comprends, tu nommes l'identifiant des personnes qui ont souscrit à ta newsletter : email_sha1

    Donc, pour récupérer cela, il faudrait que ta requête soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql_destinataires = "SELECT email_sha1, email FROM newsletter WHERE Envoi_OK = 1";
    Avec ton while, je suppose que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $melComplet['corpsmessage'][$i];
    te sert à vérifier que ça s'affiche bien.

    Pour l'envoi des méls, je te conseille ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for($nbre=0; $nbre<$i;$nbre++)
    		{
    			mail($melComplet['header'][$i],$sujet,$melComplet['corpsmessage'][$i],$header);
    		}
    Les variables $melComplet['header'] et $melComplet['corpsmessage'] sont des tableaux.

    Enfin, pour ma culture, peux tu m'expliquer à quoi sert
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $boundary = "-----=".md5(rand());
    Surtout qu'après, tu n'en fais rien : boundary=\"$boundary\"".$passage_ligne;

  8. #8
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Salut,

    Merci pour ta réponse qui m'a beaucoup aidé.

    Je peux donc envoyer un email différent à plusieurs utilisateurs.

    Le problème maintenant, c'est qu'il n'y a pas de contenu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    while($dest = mysql_fetch_array($query_destinataires))
    		{
    			//je ne mets par la derniere virgule
    			if($i<$nb-1) $melComplet['header'][$i]  = $dest['email'].',';
    			else $melComplet['header'][$i]  = $dest['email'];
    			$melComplet['corpmessage'][$i] = $corpnewsletter.$lienDesabonnement.$dest['email_sha1'].$corpnewsletter_fin;
    			echo $melComplet['corpmessage'][$i];
    			//mail($mail,$sujet,$melComplet['corpsmessage'][$i],$melComplet['header'][$i]);
    			$i++;
    		}
     
    		//envoi des messages à chaque personnes qui ont laisse leur adresse mail
    		for($nbre=0; $nbre<$i;$nbre++)
    		{
    			mail($melComplet['header'][$nbre],$sujet,$melComplet['corpmessage'][$nbre],$header);
    		}
    Si dans la boucle for, je retire le dernier header, j'ai du contenu mais en format texte.

    As-tu une idée ?

    Encore merci.

    beegees

  9. #9
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2010
    Messages : 9
    Points : 10
    Points
    10
    Par défaut Aïe la syntaxe
    J'ai annoté ton code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    while($dest = mysql_fetch_array($query_destinataires))
    		{
    			//je ne mets par la derniere virgule (note riplay777 : Quelle virgule ? Puisque chaque mél est unique, et envoyé indépendamment des autres.)
    			if($i<$nb-1) $melComplet['header'][$i] = $dest['email'].','; //(note riplay777 : Problème de syntaxe, où sont les {} de ton 'if')
    			else $melComplet['header'][$i]  = $dest['email']; // Pareil, le Else n'est pas écrit correctement
    			$melComplet['corpmessage'][$i] = $corpnewsletter.$lienDesabonnement.$dest['email_sha1'].$corpnewsletter_fin;
    			echo $melComplet['corpmessage'][$i];
    			//mail($mail,$sujet,$melComplet['corpsmessage'][$i],$melComplet['header'][$i]);
    			$i++;
    		}
     
    		//envoi des messages à chaque personnes qui ont laisse leur adresse mail
    		for($nbre=0; $nbre<$i;$nbre++)
    		{
    			mail($melComplet['header'][$nbre],$sujet,$melComplet['corpmessage'][$nbre],$header);
    		}
    Si le header n'est pas correct, regarde ça, et transpose le dans ton code :

    $header ='From: "nom"<adresse@fai.fr>'."\n";
    $header .='Reply-To: adresse_de_reponse@fai.fr'."\n";
    $header .='Content-Type: text/html; charset="iso-8859-1"'."\n";
    $header .='Content-Transfer-Encoding: 8bit';

    Bon courage !

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/08/2013, 20h37
  2. [PHP 5.4] Problème d'algorithme pour la création d'un calendrier
    Par beegees dans le forum Langage
    Réponses: 0
    Dernier message: 16/08/2013, 14h04
  3. problème de droit pour la création d'un fichier
    Par anassss dans le forum Unix
    Réponses: 1
    Dernier message: 26/07/2011, 15h29
  4. Réponses: 0
    Dernier message: 29/07/2009, 11h13
  5. Réponses: 1
    Dernier message: 22/01/2009, 11h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo