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 :

Insérer du php dans le corps d'un mail html


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut Insérer du php dans le corps d'un mail html
    Bonjour,

    J'aurais souhaité reprendre la discussion car j'ai pratiquement les mêmes difficultés à insérer une balise php au sein d'un mail php (fonction mail()).
    Le post a été taggé résolu mais je ne vois pas bien, pour ma part, où placer ces balises.
    En fait, pour mon site de vente en ligne, j'envoie à chaque étape de la commande, un mail qui reprends des informations importantes.
    Tout fonctionne parfaitement bien, la boundery fonctionne à merveille, les clients mails reçoivent, selon leurs disposition, un mail en txt ou en html, le tout avec des variables bien prises en compte mais là où je sèche, c'est de pouvoir insérer dans la partie HTML un tableau dynamique contenant une ou plusieurs lignes d'articles (issus de la bdd).


    Voici mon 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <?php 
    	$date = $row_rsRappelCommandes['date'];
        $date = preg_replace('!^([0-9]{4})+-([0-9]{2})+-([0-9]{2})$!', '$3/$2/$1', $date);  
        $nom = $row_rsRappelCommandes['nom'];
        $prenom = $row_rsRappelCommandes['prenom']; 
        $expediteur = $row_rsRappelCommandes['email']; 
        $to = $expediteur;
    
    $boundary = "-----=".md5(uniqid(rand()));
    $sujet = "mon_sujet"; 
    $header = "MIME-Version: 1.0\r\n";
    $header .= "Content-Type: multipart/alternative; boundary=\"$boundary\"\r\n";
    $header .= "Bcc: info@mondomaine.com\n";
    $header .= 'From: '.$prenom.' '.$nom.' <'.$expediteur.'>'."\r\n"; 
    $header .= "\r\n";
    $msg = "Je vous informe que ceci est un message au format MIME 1.0 multipart/alternative.\r\n";
    $msg .= "--$boundary\r\n";
    $msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n";
    $msg .= "Content-Transfer-Encoding:8bit\r\n";
    $msg .= "\r\n
    Bonjour $prenom $nom,\r\n";
    $msg .= "\r\n";
    $msg .= "--$boundary\r\n";
    $msg .= "Content-Type: text/html; charset=\"ISO-8859-1\"\r\n";
    $msg .= "Content-Transfer-Encoding: 8bit\r\n";
    $msg .= "\r\n";
    $msg .= "<html><body><table><tr><td><div align='center'><a href='http://www.mondomaine.com/accueilfr.php'><img src='http://www.mondomaine.com/img/bandeau2_new.gif' width='650' height='122'></a></div></td>
            </tr>
    	    <tr>
             <td>Bonjour $prenom $nom</td>
            </tr>
    	    <tr>
             <td>c'est ici que je voudrais intégrer un tableau qui est une boucle php do...while contenant éventuellement plusieurs lignes d'articles commandés</td>
            </tr></table></body></html>";
    $msg .= "\r\n";
    $msg .= "--$boundary--\r\n";
    mail($to, $sujet, $msg, $header);
    ?>
    Est ce une syntaxe approximative ?
    Suis je hors sujet?
    Faut-il passer cette boucle sur une variable qui serait elle même exploitable par cette fonction mail.
    Je sais que tout est déjà en php mais si je mets une "enclave php" en mettant une balise de fin et que je reprends ensuite le déroulement normal du mail, j'ai alors un warning de syntaxe (à priori).

    C'est bête, je le sais, mais je sèche.
    Merci de vos réponses.

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Le msg que tu envoies est stocké dans une variable $msg.
    Remplace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <td>c'est ici que je voudrais intégrer un tableau qui est une boucle php do...while contenant éventuellement plusieurs lignes d'articles commandés</td>
    Par :

    ... $products étant une variable contenant le tableau HTML de produits à transmettre par email.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $products = '<table>' ;
    foreach ( $cart as $product ) { // Parcours du caddie
        $products .= '<tr>' ;
        $products .= "<td>{$product['name']}</td>" ;
        $products .= "<td>{$product['quantity']}</td>" ;
        $products .= '<td>...</td>' ;
        $products .= '</tr>' ;
    }
    $products .= '</table>' ;
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut
    Alors c'est nettement mieux, mais foreach ne parcours que la première ligne, donc je peux faire pareil avec des variables.
    Mais je cherche pourquoi..

  4. #4
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut
    Merci Séb.
    C'est déjà nettement mieux. J'obtiens une liste en faisant une boucle do while, mais mes opérateurs ne sont pas pris en compte, ils sont simplement renvoyés tels quels.
    Pour le calcul de la TVA, c'est assez génant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $products = $products = '<table>' ;
    do {  // Parcours du caddie
            $products .= '<tr>' ;
    	$products .= "<td>{$row_panier['reference']}</td>" ;
            $products .= "<td>{$row_panier['nom']} {$row_panier['pres']}</td>" ;
            $products .= "<td>{$row_panier['quantite']}</td>" ;
    	$products .= "<td>{round(($row_panier['prixArticle']+$row_panier['trp'])/1.055,2)} €</td>" ;
    	$products .= "<td>...</td>" ;
    	$products .= '</tr>' ;
    } while ($row_panier= mysql_fetch_assoc($panier));
    $products .= '</table>' ;

  5. #5
    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
    On n'avait pas déjà pointé qu'il ne fallait pas un do/while ?

    Moi je suis plutot partisan du découpage des chaines :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $products = $products = '<table>' ;
     while ($row_panier= mysql_fetch_assoc($panier)) {  // Parcours du caddie
            $products .= '<tr>' ;
    	$products .= '<td>' . $row_panier['reference'] . '</td>' ;
            $products .='<td>'  .$row_panier['nom'] . ' ' . $row_panier['pres'] .'</td>' ;
            $products .= '<td>' . $row_panier['quantite'] .'</td>' ;
    	$products .= '<td>' . round(($row_panier['prixArticle']+$row_panier['trp'])/1.055,2) . ' €</td>' ;
    	$products .= "<td>...</td>" ;
    	$products .= '</tr>' ;
    }
    $products .= '</table>' ;
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut
    A première vue, il manque la première ligne d'articles, mais les opérateurs fonctionnent...

  7. #7
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut
    Pardon pour ce rythme plutôt lent, je n'avais pas eu l'occasion de répondre.

    J'ai opté pour do while, plus facile puisque la condition est évaluée à la fin, mon tableau est donc complet. Mais c'est surtout car je ne sais pas comment initialiser le compteur avant while pour que la condition soit vraie.
    Pourquoi pas do while Sabotage ?

  8. #8
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par zorbo Voir le message
    J'ai opté pour do while, plus facile puisque la condition est évaluée à la fin, mon tableau est donc complet.
    Je ne vois pas le rapport.

    Mais c'est surtout car je ne sais pas comment initialiser le compteur avant while pour que la condition soit vraie.
    Quel compteur ?

    Pourquoi pas do while Sabotage ?
    Que vaut $row_panier à la 1re exécution de ta boucle ?
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  9. #9
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut
    Je me suis sans doute mal exprimé, php est un langage que j'apprends avec le temps, mais la programmation n'est pas mon métier.

    J'ai cru comprendre qu'avec do while, le bloc d'instructions est exécuté avant de tester la condition, ce qui suppose que la première ligne de mon tableau est affichée aussi.

    Quant au compteur, je voulais dire la valeur initiale.

    $row_panier correspond à la deuxième ligne du tableau à la première exécution de while.

  10. #10
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par zorbo Voir le message
    J'ai cru comprendre qu'avec do while, le bloc d'instructions est exécuté avant de tester la condition
    Tout à fait.

    ce qui suppose que la première ligne de mon tableau est affichée aussi.
    Le pb est que la boucle sera exécutée qque soit la valeur du tableau, qu'il y ait qque chose à afficher ou pas.

    Quant au compteur, je voulais dire la valeur initiale.
    Il n'y a pas de valeur initiale dans le bout de script que tu as fourni ;-)

    $row_panier correspond à la deuxième ligne du tableau à la première exécution de while.
    $row_panier ne vaut rien à la 1re exécution du do/while.
    A la 2nde exécution du do/while $row_panier contiendra le 1er enregistrement, etc.
    Est-ce réellement le comportement voulu ?

    Equivalences strictes entre do/while et while :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ( $tuple = mysql_fetch_assoc($rs) ) {
        // Afficher enregistrement
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    do {
        $tuple = mysql_fetch_assoc($rs) ;
        if ( $tuple !== FALSE ) {
            // Afficher enregistrement
        }
    } while ( $tuple !== FALSE ) ;
    La 2e méthode est bcp plus verbeuse, voilà pourquoi nous ne la rencontrons jamais pour parcourir un jeu d'enregistrements.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Points : 608
    Points
    608
    Par défaut
    Citation Envoyé par zorbo Voir le message
    J'ai opté pour do while, plus facile puisque la condition est évaluée à la fin, mon tableau est donc complet. Mais c'est surtout car je ne sais pas comment initialiser le compteur avant while pour que la condition soit vraie.
    Pourquoi pas do while Sabotage ?

    Si il te manque la première ligne, c'est que avant le code que nous montre tu as déjà fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $row_panier= mysql_fetch_assoc($panier) ;
    or tu peux supprimer cette ligne et utiliser uniquement un while.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut
    Oui, Seb, je comprends déjà mieux.
    Il est temps que je conclue cette affaire, merci à vous, Seb et Sabotage pour votre aide précieuse, et votre patience.
    Mon mail de confirmation de commande est déjà en route, il est parfaitement fonctionnel, mon php s'est enrichi.
    Mais je me contenterai pour l'instant, car le temps me manque, d'une boucle do while exécutée, certes, une fois pour rien, mais cela n'a, en l'occurrence, aucune importance.
    Alors merci encore à vous et bon vent.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Points : 608
    Points
    608
    Par défaut
    Citation Envoyé par zorbo Voir le message
    Mais je me contenterai pour l'instant, car le temps me manque, d'une boucle do while exécutée, certes, une fois pour rien, mais cela n'a, en l'occurrence, aucune importance.
    En fait elle n'est exécutée pour rien que si ta requête ne renvoie aucun enregistrement, là ça fera une erreur PHP, donc ça peut avoir de l'importance ;-)

  14. #14
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut
    Joker-eph
    "Si il te manque la première ligne, c'est que avant le code que nous montre tu as déjà fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $row_panier= mysql_fetch_assoc($panier) ;
    Tu as parfaitement raison, j'ai trouvé cette ligne bien au-dessus. Car initialement, la page affichaitdéjàle tableau (un récapitulatif de commande, identique ou presque à celui que je retourne en mail).
    Ce qui fait que la déclaration de requête contenait cette fameuse ligne.
    Ce qui nous fait deux lignes identiques avant l'exécution du while seul et la boucle ne commence donc qu'au 2ème enregistrement.
    Bien vu, j'aurais pu trouver ça avant mais non.

    Alors merci infiniment à vous trois.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Insérer un Jtable dans le corps d'un mail avec javamail
    Par Alibel dans le forum Général Java
    Réponses: 2
    Dernier message: 27/03/2014, 15h32
  2. Réponses: 3
    Dernier message: 07/04/2009, 18h39
  3. [PHP Link Directory] Insérer du php dans un fichier .tpl
    Par deleter23 dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 10/12/2006, 20h52
  4. [phpBB][2] Comment insérer du PHP dans un fichier .tpl
    Par huynhi dans le forum Bibliothèques et frameworks
    Réponses: 11
    Dernier message: 23/10/2006, 14h29
  5. [HTML] insérer un \n dans le corps d'un mail
    Par lilou77 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 20/10/2006, 13h59

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