Aller au contenu

Pas de pièces jointes dans Outlook


Aller à la solution Solutionné par captain_torche,

Sujets conseillés

Posté

[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
Posté

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.

Posté

J'ai téléchargé ta fonction.

Je la testerai et je te ferai un retour au besoin.

++

Patrick

Posté

Allez hop je prends !

Merci

++

Patrick

PS: je pense à te faire un retour dès que j'aurai un peu de temps.

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...