Se connecter avec
S'enregistrer | Connectez-vous

[PHP] Mail Texte + HTML + piece jointe

Dernière réponse : dans Programmation

Bonjour à tous,

J'ai un script PHP pour envoyer un mail à des clients à chaque commande.

Jusqu'à présent j'envoyais uniquement un mail au format HTML. Je suis en train d'améliorer le tout et je souhaite inclure une pièce jointe de type PDF ainsi qu'un format texte pour les webmails ou autres n'affichant pas l'HTML.

J'ai recherché sur le net les moyens de faire ça et j'ai trouvé qu'il fallait séparer chaque partie par des frontières. Ca fonctionne... presque.

En faite si je mets dans l'entête 'Content-Type: multipart/alternative;' je reçois sous gmail le mail au format HTML + PJ, sous mon webmail le mail au format texte + PJ mais sous mon client Mail (mac OS) je ne reçois que l'un des 3 (suivant l'ordre dans lequel je les mets dans mon script).

De ce que j'ai pu lire il parait normal que Mail m'affiche qu'un des 3 messages puisque le multipart/alternative dit de choisir un des messages affichables parmi tous (donc il en choisit un). Mais pourquoi mon webmail ou gmail m'affichent correctement le résultat que je recherche ?

J'ai essayé en mettant multipart/mixed mais dans ce cas j'ai systématiquement les 3 formats (texte + HTML + PJ) ce qui n'est pas ce que je veux.

Merci d'avance !
Lassé par la pub ? Créez un compte

Non je la refait, en fait voila le code :

  1. $headers = 'From: "XXX" <'.$email_expediteur.'>'."\n";
  2. $headers .= 'Bcc: monmail@toto.com'."\n";
  3. $headers .= 'Return-Path: <'.$email_reply.'>'."\n";
  4. $headers .= "X-Sender: <<a href="http://www.monsite.com&gt" target="_blank">www.monsite.com&gt</a>;\n";
  5. $headers .= "X-Mailer: PHP\n";
  6. $headers .= "X-auth-smtp-user: ".$email_expediteur." \n";
  7. $headers .= "X-abuse-contact: ".$email_expediteur." \n";
  8. $headers .= "Date: ".date("D, j M Y G:i:s O")."\n";
  9. $headers .= 'MIME-Version: 1.0'."\n";
  10. $headers .= 'Content-Type: multipart/alternative; boundary="'.$frontiere.'"';
  11.  
  12. $message = 'This is a multi-part message in MIME format.'."\n\n";
  13.  
  14. //-----------------------------------------------
  15. //MESSAGE TEXTE
  16. //-----------------------------------------------
  17.  
  18. $message .= '--'.$frontiere."\n";
  19. $message .= 'Content-Type: text/plain; charset="iso-8859-1"'."\n";
  20. $message .= 'Content-Transfer-Encoding: 8bit'."\n\n";
  21. $message .= $message_texte."\n\n";
  22.  
  23. //-----------------------------------------------
  24. //MESSAGE HTML
  25. //-----------------------------------------------
  26. $message .= '--'.$frontiere."\n";
  27.  
  28. $message .= 'Content-Type: text/html; charset="iso-8859-1"'."\n";
  29. $message .= 'Content-Transfer-Encoding: 8bit'."\n\n";
  30. $message .= $message_html."\n\n";
  31.  
  32. $message .= '--'.$frontiere.'--'."\n";
  33.  
  34. //-----------------------------------------------
  35. //PIECE JOINTE
  36. //-----------------------------------------------
  37. $frontiere = '-----=' . md5(uniqid(mt_rand()));
  38. $message .= '--'.$frontiere."\n";
  39.  
  40. $message .= 'Content-Type: application/pdf; name="'.$filename.'"'."\n";
  41. $message .= 'Content-Transfer-Encoding: base64'."\n";
  42. $message .= 'Content-Disposition:attachement; filename="'.$filename.'"'."\n\n";
  43.  
  44. $message .= chunk_split(base64_encode($facture));
  45.  
  46. if(mail($vers_mail,$sujet,$message,$headers)){ echo 'Le mail a été envoyé';}
  47. else{ echo 'Le mail n\'a pu être envoyé'; }


Est-il possible de mettre plusieurs frontières dans un mail ? Dans ce cas je pourrais éventuellement mettre une partie en alternative avec HTML/Texte et une autre partie avec le PDF ?

je te donne mon code quand je suis au boulot qui permet un texte en html et une pièce jointe en excel.... pour l'exemple

  1. function mail_attach($expediteur,$destinataire,$cc,$reponse,$subject,$content,$file,$mime)
  2. {
  3. $boundary = "-----=".md5(uniqid(rand()));
  4. $header = "MIME-Version: 1.0\r\n";
  5. $header .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
  6. $header .= "bcc:$cc\r\n";
  7. $header .= "\r\n";
  8. $msg = "Je vous informe que ceci est un message au format MIME 1.0 multipart/mixed.\r\n";
  9. $msg .= "--$boundary\r\n";
  10. $msg .= "Content-Type: text/html; charset=\"iso-8859-1\"\r\n";
  11. $msg .= "\r\n";
  12. $msg .= "$content\r\n";
  13. $msg .= "\r\n";
  14. $attachment = chunk_split(base64_encode($file));
  15. $msg .= "--$boundary\r\n";
  16. $msg .= "Content-Type: $mime; name=\"fiche.xls\"\r\n";
  17. $msg .= "Content-Transfer-Encoding: base64\r\n";
  18. $msg .= "Content-Disposition: inline; filename=\"fiche.xls\"\r\n";
  19. $msg .= "\r\n";
  20. $msg .= $attachment . "\r\n";
  21. $msg .= "\r\n\r\n";
  22. $msg .= "--$boundary--\r\n";
  23. return mail($destinataire, $subject, $msg,"Reply-to: $reponse\r\nFrom: $expediteur\r\n".$header);
  24. // echo"$content";
  25. }
  26.  
  27. mail_attach($from, $to,$cc, $reponse, $subject, $message,$attachement, "application/vnd.ms-excel")

Je viens de lire qq explication sur le alternative : http://www.arobase.org/newsletters/mime-multipart-alter...

Ensuite en relisant ton code je testerai les choses suivantes :

a la place de :
  1. boundary="'.$frontiere.'"';

devrait etre mis
  1. boundary="'.$frontiere.'\n"';


a la place de :
  1. $message .= '--'.$frontiere."\n";

devrait etre mis
  1. $message .= $frontiere."\n";


a la place de :
  1. $message .= '--'.$frontiere.'--'."\n";

devrait etre mis
  1. $message .= $frontiere."\n";


et
  1. $frontiere = '-----=' . md5(uniqid(mt_rand()));


doit etre mis en premiere ligne de ton code (enfin au moins avant que tu l'utilises dans le boudary)
Lassé par la pub ? Créez un compte