picture picture
février 10, 2010 PHP 16 Commentaires

Envoyer une pièce jointe à un email en PHP

PJ

Pas mal de recherches pour envoyer une simple pièce jointe à un envoi mail() PHP… pour finalement tomber sur un petit bout de code efficace que je livre ici avec quelques (petites) retouches.
testé … et approuvé !

function mail_attachement($to , $sujet , $message , $fichier , $typemime , $nom , $reply , $from){ 
   // permet de définir les différentes parties du mail  
   $limite = "_parties_".md5(uniqid (rand())); 
  
  $mail_mime = "Date: ".date("l j F Y, G:i")."n"; 
  $mail_mime .= "MIME-Version: 1.0n"; 
  $mail_mime .= "Content-Type: multipart/mixed;n"; 
  $mail_mime .= " boundary="----=$limite"nn"; 
  
  //Le message en texte simple pour les navigateurs qui n'acceptent pas le HTML 
  $texte = "This is a multi-part message in MIME format.n"; 
  $texte .= "Ceci est un message est au format MIME.n"; 
  $texte .= "------=$limiten"; 
  $texte .= "Content-Type: text/plain; charset="iso-8859-1"n"; 
  $texte .= "Content-Transfer-Encoding: 7bitnn"; 
  $texte .= $message; 
  $texte .= "nn"; 
  
  //le fichier 
  $attachement = "------=$limiten"; 
  $attachement .= "Content-Type: $typemime; name="$nom"n"; 
  $attachement .= "Content-Transfer-Encoding: base64n"; 
  $attachement .= "Content-Disposition: attachment; filename="$nom"nn"; 
  
  $fd = fopen( $fichier, "r" ); 
  $contenu = fread( $fd, filesize( $fichier ) ); 
  fclose( $fd ); 
  $attachement .= chunk_split(base64_encode($contenu)); 
  
  $attachement .= "nnn------=$limiten"; 
  return mail($to, $sujet, $texte.$attachement, "Reply-to: $replynFrom:
$fromn".$mail_mime); 
}
									

Source : CCM

16 Responses to “Envoyer une pièce jointe à un email en PHP”

15 Commentaires

  1. Botéo dit :

    Merci beaucoup !

  2. webtolosa dit :

    $fichier c’est le fichier que tu veux mettre en pièce jointe.
    Il y a le lien de la source avec quelques commentaires qui t’aideront peut-être : http://codes-sources.commentcamarche.net/forum/affich-7026501-envoi-de-mail-avec-piece-jointe

  3. Botéo dit :

    Bonjour bonjour !

    Ca fait plusieurs semaines que je bloque sur la pièce jointe du mail. Je viens de tomber sur ton code et j’ai quelques questions. A quoi correspond le $fichier en argument dans le fopen ? Personnellement, dans mon code, j’essaie de permettre à l’utilisateur d’uploader son fichier pour obtenir un fichier temporaire .tmp et ainsi pouvoir choper l’URL de ce dernier via la variable $_FILES[‘fichier’][‘tmp_name’]. Cependant j’ai toujours la même erreur d’ouverture du fichier. Impossible de trouver la solution. HELP !

  4. lolita dit :

    en faite sa fonctionne pas chez moi voila la forme que prend mon mail :

    ——=_parties_7cc6023623877c9c65ad3ff22245b3d8 Content-type: text/html; charset=iso-8859-1 come on please jo3t ——=_parties_7cc6023623877c9c65ad3ff22245b3d8 Content-Type: application/pdf; name= pdf-test.pdf Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=pdf-test.pdfJVBERi0xLjYNJeLjz9MNCjM3IDAgb2JqIDw8L0xpbmVhcml6ZWQgMS9MIDIwNTk3L08gNDAvRSAx
    NDExNS9OIDEvVCAxOTc5NS9IIFsgMTAwNS […]

    :cry:

  5. Bonjour,

    Je tenais à vous remercier pour cet exemple trés simple et fonctionnel. Je dois chercher depuis au mois 2 heures en vain je vais pouvoir avancer un peu.

    Merci
    Florian

  6. PfProfile dit :

    Je n’ai plus d’erreur mais le pb est que ma pièce jointe (un fichier .doc) est tout simplement vide quand je l’ouvre… Ce qui n’est pas le cas avant l’upload

    Merci d’avance

  7. webtolosa dit :

    regarde peut-être ici : http://php.net/manual/fr/function.file-get-contents.php la contribution de pperegrina : peut-être une ébauche de réponse ?

  8. PfProfile dit :

    Bonjour à tous voici mon problème :

    J’ai le code suivant :

    <?php
    ini_set('sendmail_from', 'contact@recrutement-chasse-commerce-distribution.fr');
    // Testons si le fichier a bien t envoy et s'il n'y a pas d'erreur
    if (isset($_FILES['attach']) AND $_FILES['attach']['error'] == 0)
    {
    // Testons si le fichier n'est pas trop gros
    if ($_FILES['attach']['size']

    <?php

    $msg_erreur = "Erreur. Les champs suivants doivent tre obligatoirement remplis : »;
    $msg_ok =  » « ;
    $message = $msg_erreur;

    //define(‘MAIL_DESTINATAIRE’,’pchabaud@perfectprofile.fr’); // remplacer par votre email
    //define(‘MAIL_SUJET’,’Formulaire Candidats’);

    // vrification des champs

    if (empty($_POST[‘Nom’]))
    $message .= « Votre nom »;

    if (strlen($message) > strlen($msg_erreur))
    {
    echo $message;
    }
    else {

    foreach($_POST as $index => $valeur)
    {
    $$index = stripslashes(trim($valeur));
    }

    function mail_PJ($destinataire, $nomExpediteur, $mailExpediteur, $sujet, $corps, $fichier, $typemime, $nomPJ) {
    // Les headers pour un mail multiparts
    $headers= « MIME-Version: 1.0 « ;
    //$headers.= ‘From: contact@recrutement-chasse-commerce-distribution.fr‘. « \r\n »;
    $headers.= « Content-type: multipart/mixed; « ;
    // Chaine permettant de diffrencier les diffrentes parties du mail
    $limite = ‘_parties_’.md5(uniqid (rand()));
    $headers.=  » boundary=\ »—-=$limite\ » « ;
    // Premire partie, corps du mail en HTML
    $texte =  » –=$limite  » ;
    $texte.= « Content-type: text/html; charset=\ »iso-8859-1\ »\n\n »;
    $texte.=  » « .nl2br($corps).  » « ;
    // Traitement pour attacher une PJ
    // Dabord on lit le fichier
    $contenu = file_get_contents($fichier);
    $attachement =  » –=$limite  » ;
    $attachement .= « Content-Type: $typemime; name=\ »$nomPJ\ »\n\n »;
    $attachement .= « Content-Transfer-Encoding: base64 »;
    $attachement .= « Content-disposition: attachment; filename=\ »$nomPJ\ »\n\n »;
    // On joint le fichier en lencodant en base 64
    $attachement .= chunk_split(base64_encode($contenu));
    // enfin on envoie le mail
    mail($destinataire, $sujet, $texte.$attachement, $headers);

    }

    // Destinataire du mail
    $destinataire = « pchabaud@perfectprofile.fr »;
    // Expditeur
    $nomExpediteur = « Contact »;
    $mailExpediteur = « contact@recrutement-chasse-commerce-distribution.fr »;
    // sujet du mail
    $sujet = « Test de mail PHP avec pice jointe »;
    // texte du corps de mail
    $corps = « Test »;
    $corps .= « et approuv ! »;
    // caractristiques de la pice jointe
    // dans cet exemple, il sagit dun fichier pdf, il faut mettre le bon mime type
    // et le bon chemin relatif (ex Windows : $fichier = « c:\temp\son.wav »;)
    $typemime = « application/msword »;
    $name = $_FILES[‘attach’][‘name’];
    $fichier = « RECRUTEMENT-CHASSE-COMMERCE-DISTRIBUTION.FR/httpdocs/uploads/ » .$name;
    $nomPJ = « CV.doc »;
    mail_PJ($destinataire, $nomExpediteur, $mailExpediteur, $sujet, $corps, $fichier, $typemime, $nomPJ);

    ?>

    Et l’erreur suivante :

    Warning: file_get_contents(RECRUTEMENT-CHASSE-COMMERCE-DISTRIBUTION.FR/httpdocs/uploads/CVJim.doc) [function.file-get-contents]: failed to open stream: No such file or directory in D:\vhosts\RECRUTEMENT-CHASSE-COMMERCE-DISTRIBUTION.FR\httpdocs\TraitementCandidats.php on line 64

    J’ai beau changer l’adresse rien à faire… pourtant mon .php se trouve dans httpdocs/ et mon CV.doc dans httpdocs/uploads/

    Pouvez vous me venir en aide ??

    Merci d’avance

  9. webtolosa dit :

    Merci de ta participation, mais non… ce n’est pas une erreur.

    En fait les guillemets de fermeture de cet attribut sont après filename=\ »$nomPJ\ » »; (qui est à la ligne parce que la largeur de ma page impose un retour chariot :))

  10. Av3nger dit :

    Tu as une erreur au niveau de :

    $attachement .= « Content-Disposition: attachment;

    il faut rajouter un  » entre attachment et ;

  11. webtolosa dit :

    ? en principe, si :) je l’ai testé et cela marche : il doit y avoir un autre pb, type blocage serveur ?

  12. Laskap dit :

    Cela ne fonctionne pas.

  13. Jojo dit :

    ben voila je cherche ce script depuis des heures. Merci webtoolosa :)

  14. pjc dit :

    Votre script marche très bien sur des pièces jointes au format Word (MIME : application/msword) mais ne fonctionne pas sur un fichier de type PDF (MIME : application/pdf).

  15. Jeff dit :

    Ce Script marche parfaitement … merci

Commentaire

Name

Mail (ne sera pas publié)

Website

Laisser ces deux champs tels quels :
:D :-) :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: