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 :

Formulaire avec multiple pièces jointes


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 67
    Points : 42
    Points
    42
    Par défaut Formulaire avec multiple pièces jointes
    Bonjour à tous

    Je viens vers vous afin que vous puissiez m'aider à résoudre une question très bête

    je veux envoyer un mail avec plusieurs pièces jointes ( 3 documents pdf )

    je veux que la selection des fichiers soit automatique de tel sorte que sur le formulaire d'envoi je mets que l'email du destinataire et son nom.. sur la page de traitement PHP je veux que l'envoi du mail comporte ces trois documents PDF.

    j'ai trouver plusieurss scripts mais pas ce que je cherche

    voici un code que j'ai pas réussi à le modifier

    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
     
    <?php 
    //define the receiver of the email 
    $to = 'youraddress@example.com'; 
    //define the subject of the email 
    $subject = 'Test email with attachment'; 
    //create a boundary string. It must be unique 
    //so we use the MD5 algorithm to generate a random hash 
    $random_hash = md5(date('r', time())); 
    //define the headers we want passed. Note that they are separated with \r\n 
    $headers = "From: webmaster@example.com\r\nReply-To: webmaster@example.com"; 
    //add boundary string and mime type specification 
    $headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\""; 
    //read the atachment file contents into a string,
    //encode it with MIME base64,
    //and split it into smaller chunks
    $attachment = chunk_split(base64_encode(file_get_contents('attachment.zip'))); 
    //define the body of the message. 
    ob_start(); //Turn on output buffering 
     
    //copy current buffer contents into $message variable and delete current output buffer 
    $message = ob_get_clean(); 
    //send the email 
    $mail_sent = @mail( $to, $subject, $message, $headers ); 
    //if the message is sent successfully print "Mail sent". Otherwise print "Mail failed" 
    echo $mail_sent ? "Mail sent" : "Mail failed"; 
     
    ?>
    si vous voyez, ici la pièce jointe est un fichier zip, moi je veux envoyer les 3 PDF mais pas en format compressé

    Merci pour votre aide

  2. #2
    Membre averti Avatar de demenvil
    Homme Profil pro
    Analyste développeur
    Inscrit en
    Avril 2009
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste développeur
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 195
    Points : 389
    Points
    389
    Par défaut
    Salut regarde ce site
    Tu y trouvera ce qu'il te faut je pense
    https://blog-du-grouik.tinad.fr/post...%A8ces-jointes

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 67
    Points : 42
    Points
    42
    Par défaut
    merci pour votre aide

    je trouve que ce lien est très intéressant
    j'ai quelque questions au niveau de la variable utlisée :

    $lefichier: je crois que cette variable se charge par un $_POST mais moi je veux que les pièces jointes qui se trouve dans un dossier "mondossier" se mette en pièce jointe automatique

    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
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    <?php
    function FilePathToArray($leFichier)
    {
          if (!file_exists($leFichier)){
    	return false;
          }
          $AboutTheFile=pathinfo($leFichier);
          return array(
    	'chemin'	=> $leFichier,
    	'nom'	=> $AboutTheFile['filename'],
    	'extension'=>$AboutTheFile['extension'],
    	'mimeType'=> mime_content_type($leFichier),// mime_content_type est une function obsolète (je sais), mais bien pratique.
    	'contenu'	=> chunk_split(base64_encode(file_get_contents($leFichier)))	//ounch les ressources
          );
     
    }
    function SendEmailwidthJoin($message_txt,$message_html,$destinataire,$expediteur,$fichiersAJoindre,$objet,$replyTo="" )
    {
      /*
      * Envoie un e-mail "propre"  avec des pièces jointes
      *
      * Codé par gnieark http://blog-du-grouik.tinad.fr février 2012
      * Distribué sans aucune garantie dans les conditions établies là  http://blog-du-grouik.tinad.fr/pages/Mentions-l%C3%A9gales
      *
      * Vous ne devez pas supprimer ce bloc de commentaires.
      *
        */
     
      /*
      *	*** How to use this function ***
      *	$fichiersAJoindre peut être:
      *		- un  string contenant le chemin vers un seul fichier
      *		- un array sous la forme array('Chemin/Vers/Fichier1.ext','/chemin/vers/fichiers2', etc...);
      *		- un array structuré comme la super variable globale PHP $_FILES:
      *			$array('file1'	=> array('
      *				  'name'     => ,
      *				  'type'     => ,
      *				  'tmp_name' => ,
      *				  'error'    => ,
      *				  'size'     => ),
      *			      'file2' => array(
      *				    (..)etc)
      *			)
      *		/!\ Aucune vérification sur du directory transversal n'est faite au niveau de cette function.
      *		En cas de variables fournies par l'utilisateur, prenez le soin de protéger en amont de cette function.
      *	$message_txt (obligatoire contient le message au format txt)
      *	$message_html facultatif (envoyez une string vide "" si vous ne souhaitez pas envoyer votre message en html) 
      *	$destinataire : 'nom@fai.com' ou '"Nom Prenom<nom@fai.com>"' ou '"Nom1 Prenom1<nom1@fai.com>,Nom2 Prenom2<nom2@fai.com>"'
      *	$expediteur: idem
      *	$replyTo: facultatif, si différent de l'expéditeur.
      */
     
     
       //=== vérifier et préparer les pieces jointes:
      $arrayFiles=array();
      if (is_string($fichiersAJoindre)){
        $lesFichiers[]= FilePathToArray($fichiersAJoindre);
      }
      if (is_array($fichiersAJoindre)){
        //tester si c'est du type $_FILES
        if ((isset($fichiersAJoindre[0])) AND (is_string($fichiersAJoindre[0])) ){
          //un array simple avec des strings 
          foreach($fichiersAJoindre as $stringFile){
    	$lesFichiers[]= FilePathToArray($stringFile);
          }
        }else{
    	//de type $_FILES
    	foreach($fichiersAJoindre as $arrayFiles){
    	  $aboutFile=pathinfo($arrayFiles['name']);
    	  $lesFichiers[]=array(
    	    	'chemin'	=> getenv('TMP')."/".$arrayFiles['tmp_name'],
    		'nom'	=> $aboutFile['filename'],
    		'extension'=>$aboutFile['extension'],
    		'mimeType'=> mime_content_type(getenv('TMP')."/".$arrayFiles['tmp_name']),// mime_content_type est une function obsolète (je sais), mais bien pratique.
    		'contenu'	=> chunk_split(base64_encode(file_get_contents($arrayFiles['tmp_name'])))	//ounch les ressources
    	  );
    	}
        }
      }
     
     
      //===générer les délimiteurs dans l'email ===
      do{
        $leRand=md5(rand());
        $boundary = "-----=".$leRand;
      }while(!strpos($message_txt.$message_html, $leRand) === false); // oui, la vérification là , c'est du zèle.
     
      do{
        $leRand=md5(rand());
        $boundary_alt = "-----=".md5(rand());
        $isOK=true;
        foreach($lesFichiers as $fichier){
          if(!strpos($fichier['contenu'], $leRand) === false){
    	$isOK=false;
          }
        }
      }while($isOK==false);//là  en plus d'etre du zele, ça bouffe les ressources
     
      //=== le type de retour à la ligne ===
      if (!preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $destinataire)){
        $passage_ligne = "\r\n";
      }else{
        $passage_ligne = "\n";
      }
     
      //=== header ===
      $headers ="From: ".$expediteur.$passage_ligne;
      if ($replyTo==""){
        $headers.= "Reply-to: ".$expediteur.$passage_ligne;
      }else{
        $headers.= "Reply-to: ".$replyTo.$passage_ligne;
      }
     
      $headers.= "MIME-Version: 1.0".$passage_ligne;
      $headers.= "Content-Type: multipart/mixed;".$passage_ligne." boundary=\"".$boundary."\"".$passage_ligne;
     
      //=====Création du message.
      $message = $passage_ligne."--".$boundary.$passage_ligne;
      $message.= "Content-Type: multipart/alternative;".$passage_ligne." boundary=\"$boundary_alt\"".$passage_ligne;
     
      //=====Ajout du message au format texte.
      if ($message_txt!=""){
        $message.= $passage_ligne."--".$boundary_alt.$passage_ligne;
        $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;
      }
      //==========
     
      //=====Ajout du message au format HTML.
      if ($message_html!=""){
        $message.= $passage_ligne."--".$boundary_alt.$passage_ligne;
        $message.= "Content-Type: text/html; charset=\"ISO-8859-1\"".$passage_ligne;
        $message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
        $message.= $passage_ligne.$message_html.$passage_ligne;
        //On ferme la boundary alternative.
        $message.= $passage_ligne."--".$boundary_alt."--".$passage_ligne;
      }
      //==========
     
      //pièces jointes
      foreach($lesFichiers as $fileArray)
      {
        $message.= $passage_ligne."--".$boundary.$passage_ligne;
     
        $message.="Content-Type: ".$fileArray['mimeType']."; name=\"".$fileArray['nom'].".".$fileArray['extension']."\"".$passage_ligne;
        $message.="Content-Transfer-Encoding: base64".$passage_ligne;
        $message.="Content-Disposition: attachment; filename=\"".$fileArray['nom'].".".$fileArray['extension']."\"".$passage_ligne;
        $message.= $passage_ligne.$fileArray['contenu'].$passage_ligne.$passage_ligne;
      }
      $message.= $passage_ligne."--".$boundary."--".$passage_ligne; 
      //echo $message;
      //Envoi du mail
      mail($destinataire, $objet, $message, $headers);
    }
    ?>

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    D'après ce que je vois dans les commentaires :

    $fichiersAJoindre peut être:
    * - un string contenant le chemin vers un seul fichier
    * - un array sous la forme array('Chemin/Vers/Fichier1.ext','/chemin/vers/fichiers2', etc...);
    * - un array structuré comme la super variable globale PHP $_FILES:
    * $array('file1' => array('
    * 'name' => ,
    * 'type' => ,
    * 'tmp_name' => ,
    * 'error' => ,
    * 'size' => ),
    * 'file2' => array(
    * (..)etc)
    * )

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 67
    Points : 42
    Points
    42
    Par défaut
    Bonsoir

    en faite en regardant les commentaires dans le code, je me suis bloqué par ce que c'est ecrit je dois suivre ceci array('Chemin/Vers/Fichier1.ext','/chemin/vers/fichiers2', etc...); donc puisque je suis débutant dans les fonctions est ce que je dois remplacer la variable $leFichier par array('Chemin/Vers/Fichier1.ext','/chemin/vers/fichiers2');

    sinon j'ai essayé de tester avec une seul pièce jointe en ajoutant ce bout de code au debut de ma page php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $leFichier='http://jerichobusinesscenter.com/....';
    $destinataire='c.khelifi@jerichobusinesscenter.com';
    $expediteur='email@email.com';
    $message_txt='ceci est un test de message texte';
    $message_html='';
    lorsque je recharge la page ça reste blanche et j'ai aucun email envoyé

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Pour envoyer le mail il faut appeler la fonction "SendEmailwidthJoin" en ayant préalablement correctement défini les variables.
    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
     
     
    //... code des fonctions
     
    /* Affectation des valeurs de ton choix aux variables correspondantes.  
    Tu peux joindre plusieurs fichiers en mettant leur chemin dans un tableau. 
    Si tes fichiers proviennent d'un dossier nommé "pdf" tu peux donc écrire : */
    $fichiersAJoindre = array('http://jerichobusinesscenter.com/pdf/mon_fichier1.pdf','http://jerichobusinesscenter.com/pdf/mon_fichier2.pdf','http://jerichobusinesscenter.com/pdf/mon_fichier3.pdf');
    $destinataire='c.khelifi@jerichobusinesscenter.com';
    $expediteur='email@email.com';
    $message_txt='ceci est un test de message texte';
    $message_html='';
    $objet = 'mon titre';
     
    // Appel de la fonction qui envoi le mail avec les pièces jointes.
    SendEmailwidthJoin($message_txt,$message_html,$destinataire,$expediteur,$fichiersAJoindre,$objet,$replyTo="" );

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 67
    Points : 42
    Points
    42
    Par défaut
    vous êtes un génie

    mais mon code ne fonctionne pas correctement. l'email est bien envoyé mais pas avec les pièces jointes

    Voici ce que j'ai dans le corps du mail

    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
    ceci est un test de message texte
     
    -------=4386c34f16b70b362bdb780d685c9374
    Content-Type: ; name="."
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment; filename="."
     
     
     
     
    -------=4386c34f16b70b362bdb780d685c9374
    Content-Type: ; name="."
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment; filename="."
     
     
     
     
    -------=4386c34f16b70b362bdb780d685c9374
    Content-Type: ; name="."
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment; filename="."
     
     
     
     
    -------=4386c34f16b70b362bdb780d685c9374--

    les variables objet , txtmessage destinataire sont bien interprété mais pas celle des pièces jointes ! est ce un problème d'encodage, de taille de pièces jointes pour infos la taille de chaque pièces joites est de 1 mo

  8. #8
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Vérifiez que l'adresse des fichiers est bonne. Eventuellement essayer avec des adresses relatives (chemin des fichiers par rapport au script en cours, sans passer par http).

    Pour le reste j'ai simplement regardé le principe de fonctionnement global des fonctions, pas leur contenu et je ne peux donc pas dire si le code est fonctionnel.

  9. #9
    Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 67
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par ABCIWEB Voir le message
    Vérifiez que l'adresse des fichiers est bonne. Eventuellement essayer avec des adresses relatives (chemin des fichiers par rapport au script en cours, sans passer par http).

    Pour le reste j'ai simplement regardé le principe de fonctionnement global des fonctions, pas leur contenu et je ne peux donc pas dire si le code est fonctionnel.
    probleme résolu, en faite c'était un problème de racine! les fiches pdf doivent être sur le document root du formulaire.
    merci à tous pour votre aide !

  10. #10
    Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 67
    Points : 42
    Points
    42
    Par défaut
    Autre question si vous permetez:

    concernant l'entête, le code prend que la variable $from_name et pas celle de $from_mail.
    Pour être plus claire j'attends à avoir ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    De: user <user@mail.com>
    et ce qui arrive sur le mail est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    De: user <jerichob@cl-t224-062cl.privatedns.com>
    Pour la variable $from_mail en faisant "echo" elle affiche bel et bien ce que j'ai transmis en $_POST.

  11. #11
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Et c'est quoi ton code ?

  12. #12
    Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 67
    Points : 42
    Points
    42
    Par défaut
    probléme resolu

    en faite pour ne pas avoir une adresse de provenance différente de celle de l'entête from: nom<mail@domaine.com> , il faute que l'adresse mail passé dans l'entête appartient au domaine sur le quel est hebergé votre application

    j'espère que j'étais clair

    merci à tous ceux qui m'ont aidé et longue vie pour ce forum.

    je classe mon sujet comme résolu

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

Discussions similaires

  1. Multiples pièces jointes dans un formulaire pour mail
    Par infovect dans le forum Langage
    Réponses: 1
    Dernier message: 12/07/2014, 16h45
  2. Formulaire liste déroulante + pièce jointe avec mailto ?
    Par Debutant10 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 28
    Dernier message: 19/05/2013, 01h24
  3. Réponses: 1
    Dernier message: 22/01/2007, 09h08
  4. Réponses: 6
    Dernier message: 14/11/2006, 10h35
  5. Envoi d'un mail avec plusieurs pièces jointes
    Par Wilco dans le forum Composants VCL
    Réponses: 3
    Dernier message: 04/04/2006, 10h19

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