Page 1 sur 1

envoi de mails avec fichier joint

Posté : 12 sept. 2011, 21:54
par alains
Bonjour,

j'ai essayé laborieusement les différents exemples présents dans les forum, aucun ne marche !

voici mon test : on reçoit bien un mail prétendant avoir une pièce jointe mais quand on essaye de lire le mail il la perd, elle disparaît !!!.

Code : Tout sélectionner

<?php function attachtype($file) { $ext = explode(".", $file); switch($ext[1]) { default: $type = "application/octet-stream"; break; case "gz": $type = "application/x-gzip"; break; case "tgz": $type = "application/x-gzip"; break; case "zip": $type = "application/zip"; break; case "pdf": $type = "application/pdf"; break; case "png": $type = "image/png"; break; case "gif": $type = "image/gif"; break; case "jpg": case"jpeg": $type = "image/jpeg"; break; case "txt": $type = "text/plain"; break; case "htm": $type = "text/html"; break; case "html": $type = "text/html"; break; } return $type; } //============================================================ $expediteur = $_POST['expediteur']; $destinataire = $_POST['destinataire']; $copie = $_POST['copie']; $message = stripslashes($_POST['message']); $sujet = $_POST['sujet']; $fichier = basename( $_FILES['fichier']['name']); if(!($expediteur && $destinataire)) { echo "<script> javascript:history.back() </script>"; exit; } $boundary = "----=".md5(uniqid(microtime(), TRUE)); if($fichier) { $upload_file = $_FILES['fichier']['tmp_name']; // fichier temporaire chargé par le formulaire $fichier = basename( $_FILES['fichier']['name']); $sujet = $_POST["sujet"]; $message = htmlspecialchars($_POST["message"], ENT_QUOTES); $attach_name = $_FILES["fichier"]["name"]; $attach_type = attachtype($fichier); $mailheaders = "From: \"$expediteur\"\r\n"; $mailheaders .= "BCc: $copie\r\n"; $mailheaders .= "MIME-Version: 1.0\r\n"; $mailheaders .= "Content-Type: multipart/mixed; boundary=--\"".$boundary."\""; $mailheaders .= "--$boundary\r\n\r\n"; $mailheaders .= "Content-Transfer-Encoding: 8bit\r\n\r\n"; //$mailheaders .= "X-attachments: $attach_name\r\n"; $body_top = "--$boundary\r\n"; $body_top .= "Content-type: text/html; charset=ISO-8859-1\r\n"; $body_top .= "Content-transfer-encoding: 8bit\r\n"; $msg_body = $body_top . $message; $msg_body .= "\r\n\r\n--$boundary--\n"; $msg_body .= "Content-type: $attach_type; name=\"$attach_name\"\r\n"; $longueur = filesize($upload_file); $msg_body .= "Content-Length: $longueur\r\n"; $msg_body .= "Content-transfer-Encoding: BASE64\r\n"; $msg_body .= "Content-disposition: attachment; filename=\"$attach_name\"\r\n\r\n"; $msg_body .= chunk_split(base64_encode(file_get_contents($upload_file)))."\r\n"; $msg_body .= "--$boundary--\r\n"; if(mail($destinataire, $sujet, $msg_body, $mailheaders)) echo "<br><br> SUCCES <br>"; } else if(mail( $destinataire , $sujet, $message, "Content-Type: text/html; charset=ISO-8859-1\r\nFrom: $expediteur\r\nBCc: $copie\r\n")) { echo "<br><br> SUCCES <br>"; } //header("location: $HTTP_REFERER"); // retour arrière vers la page d'appel vierge ?>

Le premier (ou la première) qui aura une bonne idée sera bien récompensé.

merci d''avance

A

Re: envoi de mails avec fichier joint

Posté : 12 sept. 2011, 22:12
par brother
Bonjour,

Peux-tu suivre ce lien http://www.phpcs.com/code.aspx?ID=26501 et corriger éventuellement en fonction des messages des différents posts.

Re: envoi de mails avec fichier joint

Posté : 13 sept. 2011, 09:59
par Mazarini
Essayes de travailler avec un petit fichier texte.

Tu fais l'envoi avec PHP et avec ta messagerie et tu compares le source des 2 mails pour voir les différences.

Re: envoi de mails avec fichier joint

Posté : 13 sept. 2011, 14:56
par alains
Bonjour,

Peux-tu suivre ce lien http://www.phpcs.com/code.aspx?ID=26501 et corriger éventuellement en fonction des messages des différents posts.

merci
pour pondre ce programme j'ai déjà fait ce que tu proposes.

ce qui m'intéresse c'est un exemple qui marche. Celui que tu proposes ne marche pas. L'auteur n'est pas sérieux.

l'envoi de mails sans pièce attachée ne posant aucun problème évidemment.

merci

Re: envoi de mails avec fichier joint

Posté : 13 sept. 2011, 14:58
par alains
Essayes de travailler avec un petit fichier texte.

Tu fais l'envoi avec PHP et avec ta messagerie et tu compares le source des 2 mails pour voir les différences.

oui oui
si tu regardes juste un peu le texte , il n'y a que le nécessaire
merci pour les conseils

Re: envoi de mails avec fichier joint

Posté : 13 sept. 2011, 16:46
par Mazarini
Mais est ce que tu as regardé le source des 2 mails pour détecter les différences via ton client mail ?
Différence dans les entêtes et différences dans le corps.

A mon avis il y a quelques erreurs :

$mailheaders .= "Content-Type: multipart/mixed; boundary=--\"".$boundary."\""; => $mailheaders .= "Content-Type: multipart/mixed; boundary=\"".$boundary."\"";

$mailheaders .= "--$boundary\r\n\r\n"; => $mailheaders .= "$boundary\r\n\r\n";

En plus, j'ai des doutes sur le nombre de \r\n par ci par la. Il n'y a que la comparaison des sources qui permet de vérifier facilement (notament absencesur la premiere modification proposée.

Re: envoi de mails avec fichier joint

Posté : 13 sept. 2011, 20:38
par alains
Mais est ce que tu as regardé le source des 2 mails pour détecter les différences via ton client mail ?
Différence dans les entêtes et différences dans le corps.

A mon avis il y a quelques erreurs :

$mailheaders .= "Content-Type: multipart/mixed; boundary=--\"".$boundary."\""; => $mailheaders .= "Content-Type: multipart/mixed; boundary=\"".$boundary."\"";

$mailheaders .= "--$boundary\r\n\r\n"; => $mailheaders .= "$boundary\r\n\r\n";

En plus, j'ai des doutes sur le nombre de \r\n par ci par la. Il n'y a que la comparaison des sources qui permet de vérifier facilement (notament absencesur la premiere modification proposée.
tu racontes n'importe quoi au hasard
merci quand même

Re: envoi de mails avec fichier joint

Posté : 14 sept. 2011, 12:16
par Mazarini
tu racontes n'importe quoi au hasard
merci quand même
J'ai marqué ce qui me semble bizarre.
Par contre, tant que tu ne vérifies pas le source du mail envoyé par PHP et que tu ne le compares pas avec le source d'un mail envoyé par ton client mail, tu ne risques pas de trouvé.

J'ai regardé le source d'un de mes mails avec pièces jointes via outlook dans ma messagerie et j'ai vu des trucs qui me semblait bizarre par rapport à ce que tu semblais générer. Par contre, je n'ai pas l'intention de tester ton script et de voir ce qui est faux dans ce que tu génères.

Une démarche lorsque le résultat ne correspond pas à ce que l'on attend est :
1) vérifier que ce que l'on a généré est conforme à ce que l'on veut générer (source du mail, pas le source PHP ni mail)
2) correction du PHP s'il y a un écart
3) rechercher ce que l'on doit générer pour avoir le résultat en comparant avec quelque chose qui ressemble.

Si tu ne veux pas t'envoyer un mail, ni regarder le source d'un mail, c'est sur que tu ne risques pas de résoudre ton problème à moins de trouver un pigeon.

Re: envoi de mails avec fichier joint

Posté : 26 oct. 2011, 10:08
par claude77
Bonjour

j'ai galéré longtemps, ça fonctionne
tu mets

Code : Tout sélectionner

<tr> <td>Fichier &agrave; Joindre :</td><td> <INPUT TYPE=FILE NAME="email_pj" size= 55 value="<?php if (isset($_POST['email_pj'])) echo htmlentities($_POST['email_pj']) ?>" /></td></tr>
dans ta page formulaire, que tu récupères dans ta page envoi_émail.php
je te mets brut la partie du script de récupération

Code : Tout sélectionner

//////////////////////////////////////////////////////////////////////////////// //*************** recupération de la Piéce Jointe "email_pj" //////////////////////////////////////////////////////////////////////////////// $name_file = $_FILES['email_pj']['name']; $source=$_FILES['email_pj']['tmp_name']; move_uploaded_file($source, "./".$name_file); $extension=get_extension($name_file); //-------------------------------------------------------------------------------- //----TYPE = Détermination si document text/plain en fonction de l'extention fichier------- //------------------------------------------------------------------------------ $type="text/plain"; //Type = Texte //if ($email_type=0) if($type=="doc") { $type="text/vnd.ms-word"; } else if($type=="xls") { $type="text/vnd.ms-excel"; } //------------------------------------------------------------------------------ //---TYPE 2 Détermination si document IMAGE en fonction de l'extention fichier //------------------------------------------------------------------------------ $type2="image/png"; // Type2 = Images if($extension=="gif") { $type2="image/gif"; } else if($extension=="bmp") { $type2="image/bmp"; } function get_extension($filename) { $parts = explode('.',$filename); $last = count($parts) - 1; $ext = $parts[$last]; return $ext; } //------------------------------------------------------------------------------ //************************ Construction de l'entête***************************** //------------------------------------------------------------------------------ if($_POST['email_dest']!="") // si email_dest existe { $boundary = "---------------------------------------=".md5(uniqid(rand())); $headers .= "From: Cercle Généalogique de l'Aisne ----> " . $email_exp . "\n"; $headers .= "Reply-to: " . $email_exp . "\n"; $headers .= "X-Priority:". $priorite . "\n"; $headers .= "Cc: " . $email_cc . "\n"; $headers .= "Bcc: " . $email_bcc . "\n"; $headers .= 'MIME-Version: 1.0'. "\n"; $headers .= 'Content-Type: multipart/mixed; boundary="'.$boundary.'"'; $msg = 'This is a multi-part message in MIME format.'."\n\n"; // $msg = 'Je vous informe que ceci est un message au format MIME 1.0 multipart/mixed\'."\n\n"; // pour dire qu'il y a plusieurs type d'envoi *boundary est la frontiére //-----------------------------Début-------------------------------------------- // Cette partie sert uniquement si vous n'utilisez pas TINY MCE // Sans quoi,c'est inutile TINY ne renvoie que du HTLM /*--------------------------Envoi Message TYPE .doc, .xsl, Texte---------------- echo $email_type; //Décocher pour verifier si $email_type arrive bien if ($email_type= "2") { $msg .= "--$boundary\r\n"; //ouverture de la frontiére $msg .= "Content-Type:$type; charset=\"iso-8859-1\"\r\n"; //type 1 = text $msg .= "Content-Transfer-Encoding:8bit\r\n"; // 8 bit pour les message accentués $msg .= "Content-description: Mail message body\n\n"; //$msg .= "\r\n"; //$msg .= $_POST['email_message']; $msg .= "\r\n"; } */ //---------------------------Envoi Message HTML-------------------------------- //else if ($email_type=1) { $msg .= "--$boundary\r\n"; //ouverture de la frontiére $msg .= 'Content-Type: text/html; charset="iso-8859-1"'."\n"; $msg .= 'Content-Transfer-Encoding:8bit'."\n\n"; // 8 bit pour les message accentués //$msg .= "Content-Transfer-Encoding: quoted-printable\n"; //$msg .= "Content-description: Mail message body\n"; $msg .= $_POST['email_message']; $msg .= "\r\n"; // } //------------------------Préparation Piéce jointe---------------------------- if($name_file!="") { $file = $name_file; $fp = fopen($file, "rb"); $attachment = fread($fp, filesize($file)); fclose($fp); $attachment = chunk_split(base64_encode($attachment)); //----------------Codage et Envoi de la Piece Jointe--------------------------- $msg .= "--$boundary\r\n";//ouverture de la frontiére $msg .= "Content-Type: $type2; name=\"$file\"\r\n"; $msg .= "Content-Transfer-Encoding: base64\r\n"; $msg .= "Content-Disposition: inline; filename=\"$file\"\r\n"; $msg .= "\r\n"; $msg .= $attachment . "\r\n"; $msg .= "\r\n\r\n"; $msg .= "--$boundary--\r\n"; //fermeture de la frontiére } //--------------------Fin traitement de la Piéce Jointe ------------------------ //////////////////////////////////////////////////////////////////////////////// //-------------------------Envoi de l'Email------------------------------------- //////////////////////////////////////////////////////////////////////////////// if (mail($email_dest, $email_objet, $msg, $headers)) { //on affiche un message indiquant l'envoi du message echo'<div class= "vert">'; echo"Votre message a bien été envoyé"; echo"</div>";