envoi de mails avec fichier joint

Petit nouveau ! | 6 Messages

12 sept. 2011, 21:54

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
Modifié en dernier par alains le 13 sept. 2011, 14:53, modifié 1 fois.

Eléphanteau du PHP | 49 Messages

12 sept. 2011, 22:12

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.

ViPHP
ViPHP | 2577 Messages

13 sept. 2011, 09:59

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.

Petit nouveau ! | 6 Messages

13 sept. 2011, 14:56

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
Modifié en dernier par alains le 13 sept. 2011, 15:00, modifié 1 fois.

Petit nouveau ! | 6 Messages

13 sept. 2011, 14:58

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

ViPHP
ViPHP | 2577 Messages

13 sept. 2011, 16:46

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.

Petit nouveau ! | 6 Messages

13 sept. 2011, 20:38

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

ViPHP
ViPHP | 2577 Messages

14 sept. 2011, 12:16

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.

claude77
Invité n'ayant pas de compte PHPfrance

26 oct. 2011, 10:08

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>";