Envoyer une pièce jointe à un email en PHP

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
Merci beaucoup !
$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
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 !
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 […]
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
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
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 ?
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
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 :))
Tu as une erreur au niveau de :
$attachement .= « Content-Disposition: attachment;
il faut rajouter un » entre attachment et ;
? en principe, si
je l’ai testé et cela marche : il doit y avoir un autre pb, type blocage serveur ?
Cela ne fonctionne pas.
ben voila je cherche ce script depuis des heures. Merci webtoolosa
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).
Ce Script marche parfaitement … merci