captain_torche Posté 22 Juin 2011 Posté 22 Juin 2011 [Edit]Le code fonctionnel est téléchargeable dans le second message de la discussion Je suis en train de développer une fonction d'envoi d'e-mails qui gère les pièces jointes. Mes tests sur gmail et hotmail sont concluants, mais sur Outlook 2010, je ne reçois pas de pièce jointe. Pourriez-vous tester la fonction et m'aider à trouver ce qui ne va pas ? function envoi_mail($nom_from, $mail_from, $to, $subject, $data = null, $template_html = null, $template_txt = null, $pj = array()) { /* 2011-06-22, Marc Brillault String $nom_from $nom_from est le nom de l'expéditeur String $mail_from $mail_from est l'adresse e-mail de l'expéditeur Mixed $to $to est une chaîne ou un tableau contenant les emails des destinataires Si $to est une chaîne, elle sera convertie en tableau String $subject $subjet est l'objet du mail Mixed $data Si $data est une chaîne de caractères, le mail sera envoyé avec ce contenu, en version texte ou HTML en fonction du contenu de $data. Les fichiers templates seront ignorés. Si $data est un tableau, il doit comprendre les codes de remplacement, sous la forme 'code' => 'valeur de remplacement', utilisés dans les fichiers de template. Les templates comprennent les codes rédigés de la manière suivante : '#CODE#' #CODE# sera donc remplacé par $data['code'] String $template_html $template_html est le chemin vers le fichier de template pour les envois en HTML Le fichier contient des chaînes du type #CODE#, qui seront remplacées par les valeurs correspondantes du tableau $data String $template_txt $template_txt est le chemin vers le fichier de template pour les envois en format texte brut Le fichier contient des chaînes du type #CODE#, qui seront remplacées par les valeurs correspondantes du tableau $data Array $pj $pj est un tableau contenant les informations des pièces jointes, sous la forme suivante : array( 'name' => 'nom_du_fichier', 'path' => 'chemin/vers/le/fichier' ) */ $boundary = '_'.md5(uniqid(rand())); // Protections contre les injections dans les en-têtes $nom_from = protege_mail($nom_from); $mail_from = protege_mail($mail_from); $to = protege_mail($to); $subject = protege_mail($subject); // CRÉATION DES EN-TÊTES $headers = "From: $nom_from <$mail_from>\r\n"; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "Content-Type: multipart/alternative; boundary=\"$boundary\"\r\n"; // CRÉATION DU BODY // $body = "--$boundary\nContent-Type: text/plain; charset=UTF-8\r\n\n"; $body = "This is a multi-part message in MIME format.\r\n"; $body .= "Ceci est un message est au format MIME.\r\n"; // CRÉATION DE LA VERSION TEXTE DU MAIL $texte = null; if(is_string($data) && strlen($data) == strlen(strip_tags($data))) $texte = $data; elseif(is_array($data) && is_file($template_txt)) { $texte = file_get_contents($template_txt); foreach($data as $key => $value) $texte = str_replace('#'.strtoupper($key).'#', $value, $texte); } if($texte) { $body .= "--$boundary\n"; $body .= "Content-Type: text/plain; charset=\"UTF-8\"\r\n"; $body .= "Content-Transfer-Encoding: 8bit\r\n"; $body .= $texte; $body .= "\r\n"; } // CRÉATION DE LA VERSION HTML DU MAIL $html = null; if(is_string($data) && strlen($data) != strlen(strip_tags($data))) $html = $data; elseif(is_array($data) && is_file($template_html)) { $html = file_get_contents($template_html); foreach($data as $key => $value) $html = str_replace('#'.strtoupper($key).'#', $value, $html); } if($html) { $body .= "--$boundary\n"; $body .= "Content-Type: text/html; charset=\"UTF-8\"\r\n"; $body .= "Content-Transfer-Encoding: 8bit\r\n"; $body .= $html; $body .= "\r\n"; } // GESTION DES PIÈCES JOINTES foreach($pj as $file) { if(is_file($file['path'])) { $body .= "--$boundary\r\n"; $body .= "Content-Type: application; name=\"".$file['name']."\"\r\n"; $body .= "Content-Transfer-Encoding: base64\r\n"; $body .= "Content-Disposition: attachment; filename=\"".$file['name']."\"\r\n"; $body .= chunk_split(base64_encode(file_get_contents($file['path']))); } } $body .= "--$boundary--"; if(!is_array($to)) $to = array($to); foreach($to as $dest) mail($dest, $subject, $body, $headers); } function protege_mail($string) { // http://phpsense.com/php/php-mail.html $injections = array( '/(\n+)/i', '/(\r+)/i', '/(\t+)/i', '/(%0A+)/i', '/(%0D+)/i', '/(%08+)/i', '/(%09+)/i' ); return preg_replace($injections,'',$string); }
Solution captain_torche Posté 24 Juin 2011 Auteur Solution Posté 24 Juin 2011 C'est bon, j'ai réussi à trouver ce qui posait un souci : - Lors d'un envoi mixte avec des pièces jointes, il y a deux "boundaries" : une première dans les en-têtes, qui va séparer le message de chaque pièce jointe, la seconde est déclarée dans le corps du message et sépare la version texte de la version HTML - Ces deux versions (texte et HTML) doivent être entourées d'une ligne vide - Chaque pièce jointe doit être séparée de sa déclaration par une ligne vide également. Pour ceux qui seraient intéressés, voici le code de la fonction : envoi_mail.php Je serai ravi d'avoir vos retours.
Patrick Posté 25 Juin 2011 Posté 25 Juin 2011 J'ai téléchargé ta fonction. Je la testerai et je te ferai un retour au besoin. ++ Patrick
captain_torche Posté 27 Juin 2011 Auteur Posté 27 Juin 2011 Je viens de mettre la fonction à jour : les accents étaient mal encodés dans les en-têtes.
Patrick Posté 2 Juillet 2011 Posté 2 Juillet 2011 Allez hop je prends ! Merci ++ Patrick PS: je pense à te faire un retour dès que j'aurai un peu de temps.
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant