[php] mail() et pièces jointes

mail() et pièces jointes [php] - PHP - Programmation

Marsh Posté le 29-12-2008 à 22:54:39    

bonjour...

 

Ce que je veux faire, c'est créer un formulaire de contact avec pièces jointes.

 

j'ai donc créé un formulaire de contact qui fonctionne très bien à part les pièces jointes.

 

Je sais qu'il existe des codes utilisant la POO, mais j'aimerai garder le mien.

 

j'ai ajouté à mon code de départ la partie $filen_name... concernant les pièces jointes (code trouvé sur internet)

 

Mon script envoi un e-mail mais PAS la pièce jointe.....  Est-ce que quelqu'un pourrait me dire comment résoudre mon problème. MERCI

 

Voici mon code.

 
Code :
  1. <?php
  2. //function permettant la vérification du format de l'adresse e-mail
  3. function valideEmail($email)
  4.     {
  5.         return eregi("^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$", $email);
  6.     }
  7. //
  8. if(isset($_POST) && isset($_POST['nom']) && isset($_POST['email']) && isset($_POST['dest']) && isset($_POST['message'])){
  9. extract ($_POST);
  10. //si aucun des champs du formulaire n'est vide alors on exécute les instructions
  11. if (!empty($nom) && !empty($email) && !empty($dest) && !empty($message)){
  12.  if (!valideEmail($email)){ // verifie si l'adresse e-mail est au bon format
  13.   echo 'le mail n\'est pas au bon format : example@operateur.fr'; // message d'erreur si faux
  14.   }
  15.  //$message=addslashes($message); -> supprimer les antislashes dans le message reçu
  16.  $message=str_replace("\'","'",$message); //remplacer un caractère par un autre
  17.  list($nomdest, $predest) = split('[/.-]', $dest); //selectionner un certain nombre de caractères de la variable
  18.  //$desti=substr($dest,0,8); -> retenir les caratères a partir du premier jusqu'au huitieme
  19.  $link = mysql_connect(); // connection au serveur
  20.  if(!$link) {echo"Impossible de se connecter au serveur".mysql_error();exit;} //verifie la connection au serveur
  21.  mysql_select_db(basename,$link); //connection a la base de données
  22.  $requete = "select email from admin where nom='$nomdest' and prenom='$predest'"; //requête sql
  23.  $req = mysql_query($requete); //exécution de la requête
  24.  while($data = mysql_fetch_assoc($req)) //Lit une ligne de résultat MySQL dans un tableau associatif
  25.  {
  26.      $art = $data['email'];
  27.  }
  28.  // destinataire
  29.  $destinataire=$art;
  30.  //sujet
  31.  $sujet="Formulaire de contact";
  32.  //entete
  33.  $entete= 'From:'.$nom.' <'.$email.'>'."\n";
  34.  $entete .= 'Mime-Version: 1.0'."\r\n";
  35.  $entete .= 'Content-Type: multipart/mixed;'."\r\n";
  36.  $entete .= "\r\n";
  37.  //message
  38.  $msg="Un nouveau message est arrivé \n
  39.  Nom : $nom \n
  40.  E-mail : $email \n
  41.  Message : $message ";
  42.       //PIECE JOINTE
  43.   $file_name = $_POST['pj'];
  44.  if(file_exists($file_name))
  45.  {
  46.  $file_type = filetype($file_name);
  47.  $file_size = filesize($file_name);
  48.       $msg .= 'Content-Type:'.$file_type.'; name="'.$file_name.'"'."\n";
  49.       $msg .= 'Content-Transfer-Encoding: base64'."\n";
  50.       $msg .= 'Content-Disposition:attachement; filename="'.$file_name.'"'."\n\n";
  51.       $msg .= chunk_split(base64_encode(file_get_contents($file_name)))."\n";
  52.  }
  53.  mail($destinataire,$sujet,$msg,$entete); // fonction mail() qui permet l'envoi
  54. ?>
  55.  <!-- formulaire de confirmation de l'envoi avec possibilite de retour vers un formulaire vide -->
  56.  <fieldset><legend>Le Message a bien &eacute;t&eacute; envoy&eacute; ! </legend>
  57.  <form method="POST" action="contact.php" enctype="multipart/form-data">
  58.  <p align="center">
  59.  <input type="submit" name="retour" value="Retour au formulaire de contact">
  60.  </p>
  61.  </form>
  62.  </fieldset>
  63.     <?php
  64. }
  65. else {
  66. ?>
  67.  <!-- formulaire d'erreur si un des champs est vide -->
  68.  <fieldset><legend>Vous n'avez pas rempli tous les champs ! </legend>
  69.  <form method="POST" action="contact.php" enctype="multipart/form-data">
  70.  <p align="center">
  71.  <input type="submit" name="retour" value="Retour au formulaire de contact">
  72.  </p>
  73.  </form>
  74.  </fieldset>
  75.     <?php
  76. }
  77. }
  78. ?>


Message édité par yuxi le 30-12-2008 à 17:23:06
Reply

Marsh Posté le 29-12-2008 à 22:54:39   

Reply

Marsh Posté le 29-12-2008 à 23:03:30    

C'est le format de ton message qui n'est pas bon, tu te contentes de rajouter des headers et la pièce basesoixantequatrisée, sans rajouter de boundary. Regarde à droite à gauche comment en générer un, et spliter le mail en plusieurs parties.
 
Aussi y'a une faille de sécurité, on peut injecter des headers supplémentaires via $nom ou $email (suffit d'un retour chariot au début du nom, et hop on peut rajouter genre un entête Bcc pour spammer qui on veut).
 
Et ta regexp de vérification du format de l'adresse e-mail est invalide, elle interdit plein de caractères (genre + ou _), alors qu'ils sont parfaitement valides. Utilises plutôt un truc du style "^.+@.+$", de toute manière si quelqu'un veut pas mettre de mail il peut mettre un truc bidon.

Reply

Marsh Posté le 30-12-2008 à 12:41:09    

merci,  
 
j'ai ajouté des boundary, mais voilà ce que m'affiche mon mail :
 
Un nouveau message est arrivé  
Nom : SCORDIA Candy  
E-mail : scordia-candy@live.fr  
Message : blabla -------=15db258f1219823b9e5f5c9c64a5a81d
 
pourquoi n'ai - je pas l'image ? à la place de ce code ?

Reply

Marsh Posté le 30-12-2008 à 12:50:00    

T'as précisé aussi dans l'entête de base le boundary ? C'est assez le bordel à gérer. Donc y'a pas que multipart/mixed à mettre, faut aussi préciser le boundary :

Code :
  1. $entete .= 'Content-Type: multipart/mixed; boundary="'. $tonBoundary . '"' . "\r\n";

Reply

Marsh Posté le 30-12-2008 à 13:03:31    

 // destinataire
  $destinataire=$art;
  //sujet
  $sujet="Formulaire de contact";
  // on génère une chaîne de caractères aléatoire qui sera utilisée comme frontière
    $boundary = "-----=" . md5( uniqid ( rand() ) );
   
   
  //entete
  $entete= 'From:'.$nom.' <'.$email.'>'."\n";
  //$entete .= "Bcc: candy.sc@wanadoo.fr\n";
  $entete .= "MIME-Version: 1.0\n";
  $entete .='Content-Type: multipart/mixed; boundary="'. $boundary . '"' . "\r\n";
  //message
  $msg= "Ceci est un message au format MIME 1.0 multipart/mixed.\n\n";
  $msg .= "--" . $boundary . "\n";
  $msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
    $msg .= "Content-Transfer-Encoding: 8bit\n\n";
  $msg .= "Un nouveau message est arrivé \n";
  $msg .= "Nom : $nom \n";
  $msg .= "E-mail : $email \n";
  $msg .= "Message : $message ";
  $msg .= "--" . $boundary . "\n";
  //PIECE JOINTE
  $file_name = $_POST['pj'];
  if(file_exists($file_name))
  {
   $file_type = filetype($file_name);
   $file_size = filesize($file_name);
     $content_encode = chunk_split(base64_encode(file_get_contents($file_name)));
  $msg .= 'Content-Type:'.$file_type.'; name="'.$file_name.'"'."\n";
      $msg .= 'Content-Transfer-Encoding: base64'."\n";
      $msg .= "Content-Disposition: attachment; filename=\"".$file_name."\"\n\n";
   $msg .= $content_encode . "\n";
  }
  $msg .= "\n\n";
    $msg .= "--" . $boundary . "--\n";
   
   
  mail($destinataire,$sujet,$msg,$entete); // fonction mail() qui permet l'envoi
   
 ?>
 
si tu trouves l'erreur, ce serait sympa de me la dire, car la je suis perdue, je m'aide d'exemple et j'arrive pas.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed