[php] envoyer un mail avec une pièce jointe

WRInaute accro
Hello,

Je cherche à réaliser un formulaire qui me permette d'envoyer un mail, via php, avec une pièce jointe (avec limitation de taille).

Jusqu'ici, tout ce que je trouve m'envoie le mail, mais pas la pj...

Est-ce que quelqu'un aurait une solution simple à proposer ?

Merci :oops:
 
WRInaute discret
Allé un petit bout de code, c'est toujours sympa le week-end et au moins on ne fait appel qu'a du pur PHP bien de chez nous... Enfin j'espère ne pas avoir fait d'erreur !

Code:
// Destinataire du mail
$destination = 'destinataire@example.com';
// Expediteur du mail
$expediteur = 'expediteur@example.com';
// sujet du mail
$sujet = 'Mail avec PJ';
// Les headers pour un mail multiparts
$headers= "MIME-Version: 1.0\n";
$headers.= "From: $expediteur\n";
$headers.= "Content-type: multipart/mixed;\n";
// Chaine permettant de différencier les différentes parties du mail
$limite = '_parties_'.md5(uniqid (rand()));
$headers.= " boundary=\"----=$limite\"\n\n";

// Première partie, corps du mail en HTML
$texte = "------=$limite\n";
$texte.= "Content-type: text/html; charset=\"iso-8859-1\"\n\n";
$texte.="<HTML><HEAD></HEAD><BODY>Oh un mail !</BODY></HTML>";

// Traitement pour attacher une PJ
// D'abord on lit le fichier
$fichier = 'c:\temp\son.wav';
$contenu = file_get_contents($fichier);
$attachement = "------=$limite\n"; 
// Dans mon exemple, il s'agit d'un fichier wav, il faut mettre le bon mime type
$attachement .= "Content-Type: audio/x-wav; name=\"fichier.wav\"\n";
$attachement .= "Content-Transfer-Encoding: base64\n";
$attachement .= "Content-Disposition: attachment; filename=\"fichier.wav\"\n\n";
// Ca y est on joint le fichier en l'encodant en base 64
$attachement .= chunk_split(base64_encode($contenu));

// enfin on envoi le mail
mail($destination, $sujet, $texte.$attachement, $headers);
 
Nouveau WRInaute
Bonjour,

J'intérviens rapidement (et brièvement aussi) dans votre discussion car j'ai eu des problèmes:

J'ai fait des testes en mettant comme suivant:

// enfin on envoi le mail
mail($destination, $sujet, $texte.$attachement, $headers);

Je reçois une grande liste de caractères (collés au message Oh un mail !------=_parties_0b4....db Content-Type) dans le corps du message et sans le fichier en pièce jointe.

et aussi un autre teste:
// enfin on envoi le mail
mail($destination, $sujet, $texte, $headers.$attachement);
Je reçois le fichier en pièce jointe mais sans le texte dans le corps du message.

Y a-t-il une solution/explication?

Merci d'avance de votre aide.
Merci encore.
 
Nouveau WRInaute
Bonjour à tous,

Dsl de réveiller un topic de quelque temps mais en cherchant sur Google c'est ici qu'on arrive ^^"

Donc voila ça fait un moment que je cherchais un scripte pour envoyer une pièce joint avec la fonction mail(), j'ai tenté plusieurs scripte, aucun ne marchait... Le meilleur que j'ai trouvé est celui donner ci dessus par ptit_mousse (merci en même temps :mrgreen: ) car il fonctionnait déjà mieux que d'autres. Je ne sais pas si ça vient de moi m'enfin bon... xD

Je voulais envoyer un e-mail avec une pièce jointe en html et malgré les modifications à faire (Content-Type: text/html ...) ça ne marchai toujours pas.
Mais aujourd'hui j'ai trouvé la solution : il manquait un "\n" ici :

$attachement = "\n------=$limite\n";
Ou sinon on peut le mettre à la fin du texte (dans l'exemple après la balise </html>)

J'ai eut le même bug que belaadel (juste au dessus) et en mettant un retour a la ligne tout s'arrange chez moi ^^

Bref voila le code complet fonctionnel chez moi à 100% pour envoyer un fichier html : (ce qui est entre [crochet] est à changer chez vous)

Code:
<?php
     //Auteur : ptit_mousse

    // Destinataire du mail
$destination = "[e-mail du destinataire]";
// sujet du mail
$sujet = "[sujet du message]";
// Les headers pour un mail multiparts
$headers= "MIME-Version: 1.0\n";
$headers.= "From: \"[Nom de l'expediteur]\" <[adresse e-mail de l'expéditeur]>\n";
$headers.= "Content-type: multipart/mixed;\n";
// Chaine permettant de différencier les différentes parties du mail
$limite = '_parties_'.md5(uniqid (rand()));
$headers.= " boundary=\"----=$limite\"\n\n";

// Première partie, corps du mail en HTML
$texte = "------=$limite\n";
$texte.= "Content-type: text/html; charset=\"iso-8859-1\"\n\n";
$texte.="<HTML><HEAD></HEAD><BODY>Oh un mail !</BODY></HTML>";

// Traitement pour attacher une PJ
// D'abord on lit le fichier
$fichier = '[nom du fichier]';
$contenu = file_get_contents($fichier);
$attachement = "\n------=$limite\n";
// Dans mon exemple, il s'agit d'un fichier html, il faut mettre le bon mime type
$attachement .= "Content-Type: text/html; name=\"[nom du fichier]\"\n";
$attachement .= "Content-Transfer-Encoding: base64\n";
$attachement .= "Content-Disposition: attachment; filename=\"[nom du fichier]\"\n\n";
// Ca y est on joint le fichier en l'encodant en base 64
$attachement .= chunk_split(base64_encode($contenu));

// enfin on envoi le mail
mail($destination, $sujet, $texte.$attachement, $headers);

?>
 
Nouveau WRInaute
MERCI a vous deux Gattux et P'tit mousse : un bout de temps que je me cassais le nez sur ces envois en PJ et là c'est nickel ! :D
 
WRInaute discret
J'avais quelque peu oublié ce charmant bout de code mis sur WRI et il faut absolument y apporter une modification sans quoi les mails envoyés risquent de vous revenir en erreur (par Free notamment). Donc il faut ABSOLUMENT remplacer tous les \n par des \r\n
 
Nouveau WRInaute
merci ptit_mousse, j'adapte illico

merci aussi pour PHPmailer, je connaissais mais pas encore testé ... va falloir que je fasse ça. Il y a qquechoise a installer sur le serveur ?

:D
 
Discussions similaires
Haut