Envoi mails PHP : pièce jointe = texte !

Fermé
new morning Messages postés 127 Date d'inscription lundi 13 août 2007 Statut Membre Dernière intervention 15 mai 2013 - 9 sept. 2008 à 04:01
new morning Messages postés 127 Date d'inscription lundi 13 août 2007 Statut Membre Dernière intervention 15 mai 2013 - 9 sept. 2008 à 14:34
Bonjour,

J'ai tenté différents scripts glanés ici et là pour envoyer un mail avec pièce jointe avec le même résultat : le message arrive, mais la pièce jointe est dans le corps du message !

Exemple : en utilisant le script proposé ici : http://www.commentcamarche.net/faq/sujet 2761 langages envoyer un mail avec piece jointe

Je reçois un mail contenant :

MIME-Version: 1.0

Content-Type: multipart/mixed; boundary="didondinaditondelosdudosdodudundodudindon"



--didondinaditondelosdudosdodudundodudindon

Content-Type: text/plain; charset=UTF-8


Message principal du mail.

--didondinaditondelosdudosdodudundodudindon

Content-Type: application/x-tar; name="backup"

Content-Transfer-Encoding: base64

Content-Disposition: attachment; filename="backup"


ZGl2LnRpdGxlLCBkaXYuaGVhZGVyLCBkaXYuc2lkZWJhciwgZGl2LnRyaWNrLCBkaXYuZm9vdGVy
IGEudXBsaW5rIHsNCiAgICBkaXNwbGF5OiBub25lOw0KfQ0K
--didondinaditondelosdudosdodudundodudindon--


Comment faire pour que la "frontière" (--didondinaditondelosdudosdodudundodudindon) soit prise en compte ? Est-ce parce que MIME ne fonctionne pas correctement ? Pourtant elle est bien présente : voir http://francafrique.shadow-corp.org/phpinfo.php

Est-ce qu'il faut impérativement donner le chemin absolu d'accès au fichier à joindre ? faut-il indiquer l'emplacement de MIME ?

6 réponses

SyGEN Messages postés 62 Date d'inscription lundi 10 mars 2008 Statut Membre Dernière intervention 11 septembre 2008 8
9 sept. 2008 à 07:31
Je te conseille d'utiliser l'excellente libraire Zend (elle a une partie mail) dont la collectivité PHP use et abuse puisqu'elle est de très bonne facture ! Je pense que tu trouveras ton bonheur en lisant la doc dessus.

Un petit lien (anglais) sur quelques tutos pour Zend Mail & Zend Mime : http://www.zftutorials.com/zend-mail-zend-mime/

Amicalement
0
new morning Messages postés 127 Date d'inscription lundi 13 août 2007 Statut Membre Dernière intervention 15 mai 2013 19
9 sept. 2008 à 11:57
Merci SyGEN de cette réponse

Je n'ai pas encore essayé cette bibliothèque, mais je crains de retrouver pour la nième fois le résultat décevant d'un mail contentant bien quelque chose qui doit être ma pièce jointe, mais sous forme de Gl2LnRpdGxlLCBkaXYuaGVhZGVyLCBkaX etc., ce qui n'est guère satisfaisant.

As-tu des raisons technique de penser que cette bibliothèque puisse améliorer le shmil-blick ? Car à force de multiplier les essais, je me dis qu'il serait maintenant plus productif d'essayer de comprendre POURQUOI la frontière entre le texte et la pièce jointe n'est pas prise en compte. Et là, google ne m'aide pas beaucoup :(

EDIT : en fait, tout se passe comme si mon en-tête n'étais pas prise en compte :

$boundary='didondinaditondelosdudosdodudundodudindon';
Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n\n";
0
SyGEN Messages postés 62 Date d'inscription lundi 10 mars 2008 Statut Membre Dernière intervention 11 septembre 2008 8
9 sept. 2008 à 12:51
Fait voir ton code ou poste le moi en mp si c'est trop long.
0
new morning Messages postés 127 Date d'inscription lundi 13 août 2007 Statut Membre Dernière intervention 15 mai 2013 19
9 sept. 2008 à 12:56
J'aurais du préciser que le lien donné en haut était celui du script. le voici ici reproduis (sans les paramétrages persos qui ne sont pas compliqués).

<?php
$boundary='didondinaditondelosdudosdodudundodudindon';
//En-têtes du mail
$headers="From: expediteur@domaine.fr\r\n
MIME-Version: 1.0\r\n
Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n\n";

//Corps du mail en commençant par le message principal
$body="--". $boundary ."\n
Content-Type: text/plain; charset=ISO-8859-1\r\n\n
Message principal du mail.\n\n";

/* Piece jointe, on va dire que notre fichier s'appele bidule.doc et qu'il se situe dans le repertoire courant */

$fichier=file_get_contents('./bidule.doc');
/* On utilise aussi chunk_split() qui organisera comme il faut l'encodage fait en base 64 pour se conformer aux standards */
$fichier=chunk_split( base64_encode($fichier) );

//Ecriture de la pièce jointe
$body = $body . "--" .$boundary. "\n
Content-Type: application/msword; name=\"nom_fichier\"\r\n
Content-Transfer-Encoding: base64\r\n
Content-Disposition: attachment; filename=\"nom_fichier\"\r\n\n
$fichier";

//Fermeture de la frontière
$body = $body . "--" . $boundary ."--";

//Envoi du mail
mail("destinataire@bidule.fr", "sujet", $body, $headers);
?>


Est-ce que le blocage peut venir d'un paramétrage de MIME par l'hébergeur ? (Gandi AI)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
new morning Messages postés 127 Date d'inscription lundi 13 août 2007 Statut Membre Dernière intervention 15 mai 2013 19
9 sept. 2008 à 14:34
EXTRA !

Merci beaucoup SyGEN, enfin ! après 5 jours de lutte ! je vais pouvoir reprendre mon script de backup automatique sur Email (tous ceux que j'ai testé merdaient, à moins de réinstaller PEAR et MIME !)
0
SyGEN Messages postés 62 Date d'inscription lundi 10 mars 2008 Statut Membre Dernière intervention 11 septembre 2008 8
9 sept. 2008 à 14:10
Je t'en ai écrit un petit qui marche comme ca tu vois simplement (sans utiliser Zend) :

<?php

$mime_boundary = "<<<--==+X[".md5(time())."]";

$headers .= "From: Bidule <destinataire@bidule.fr>\r\n";
$headers .= "To: Bidule <destinataire@bidule.fr>\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed;\r\n";
$headers .= " boundary=\"".$mime_boundary."\"";

$message .= "Message principal du mail.\r\n";
$message .= "\r\n";
$message .= "--".$mime_boundary."\r\n";
$message .= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n";
$message .= "Content-Transfer-Encoding: 7bit\r\n";
$message .= "\r\n";
$message .= "Bonjour \r\n";
$message .= "Voici le fichier demandé! \r\n";
$message .= "--".$mime_boundary."\r\n";
$message .= "Content-Type: application/msword;\r\n";
$message .= " name=\"bidule.doc\"\r\n";
$message .= "Content-Transfer-Encoding: base64\r\n";
$message .= "Content-Disposition: attachment;\r\n";
$message .= " filename=\"bidule.doc\"\r\n";
$message .= "\r\n";

$myfile = file_get_contents("bidule.doc");
$fileContent = chunk_split( base64_encode($myfile) );

$message .= $fileContent;
$message .= "\r\n";
$message .= "--".$mime_boundary."\r\n";

$ok = mail("destinataire@bidule.fr", "Fichier word", $message, $headers);

if ($ok) echo "Parfait"; else echo "AIEEEEUH";

?>


Amicalement
-1