J'ai donc un formulaire avec la possibilité de joindre une image, donc en fichier joint, le script niveau formulaire est :
if ($fonctionmail=="oui")
{
// envoi par mail de l'annonce
require ("mime_mail.class.php"); //je m'envoie tout ça par mail
while (list($key, $value) = each($HTTP_POST_VARS))
{
$corps .= $key . ' = ' . $value . "\r\n";
}
if ($img!="")
{
// ouverture et lecture du fichier
$fd =fopen("$file", "r");
$fichier = fread($fd, filesize($file));
fclose($fd);
// instanciation de la classe
$mail = new mime_mail();
// adresse email de reception
$mail->to = $to;
// sujet
$mail->subject = "Annonce mise en ligne";
// corps du message (on utilise un fichier txt)
$mail->body = $corps;
// adresse email de l'expediteur (optionnel)
$mail->from = $from;
// entetes supplementaires (optionnel)
$entetedate = date("D, j M Y H:i:s -0500");
$entetemail .= "X-Mailer: PHP/" . phpversion() . "\n" ;
$entetemail .= "Date: $entetedate";
$mail->headers = "$entetemail";
if ($img != "")
{
// fichier attache (optionnel)
$mail->attach("$fichier", "$file_name");
}
// envoi du message
$mail->send(); //fin de l'envoi par mail
}
}
}
}
Le fichier mime_mail.class.php est :
<?
class mime_mail
{
var $parts;
var $to;
var $from;
var $headers;
var $subject;
var $body;
// constructeur
function mime_mail()
{
$this->parts = array();
$this->to = "";
$this->from = "";
$this->subject = "";
$this->body = "";
$this->headers = "";
}
// attache un fichier au message
function attach($message,$name,$ctype = '')
{
// type de contenu non defini
if(empty($ctype)){
// on essaie de reconnaitre l'extension
switch(strrchr(basename($name), ".")){
case ".gz": $ctype = "application/x-gzip"; break;
case ".tgz": $ctype = "application/x-gzip"; break;
case ".zip": $ctype = "application/zip"; break;
case ".pdf": $ctype = "application/pdf"; break;
case ".png": $ctype = "image/png"; break;
case ".gif": $ctype = "image/gif"; break;
case ".jpg": $ctype = "image/jpeg"; break;
case ".txt": $ctype = "text/plain"; break;
case ".htm": $ctype = "text/html"; break;
case ".html": $ctype = "text/html"; break;
default: $ctype = "application/octet-stream"; break;
}
}
$this->parts[] =
array (
"ctype" => $ctype,
"message" => $message,
"encode" => $encode,
"name" => $name
);
// fin de fonction
}
// fonction utilisee pour contruire le message MIME
// utilisee depuis build_multipart()
function build_message($part)
{
$message = $part[ "message"];
$message = chunk_split(base64_encode($message));
$encoding = "base64";
return "Content-Type: ".$part[ "ctype"].
($part[ "name"]? "; name = \"".$part[ "name"]. "\"" : "").
"\nContent-Transfer-Encoding: $encoding\n\n$message\n";
}
// compose le message MIME
// utilisee depuis send()
function build_multipart()
{
$boundary = "b".md5(uniqid(time()));
$multipart = "Content-Type: multipart/mixed; boundary = $boundary\n\nThis is a MIME encoded message.\n\n--$boundary";
for($i = sizeof($this->parts) - 1; $i >= 0; $i--)
{
$multipart .= "\n".$this->build_message($this->parts[$i]). "--$boundary";
}
return $multipart.= "--\n";
}
// envoie le message
// derniere fonction a appeler
function send()
{
$mime = "";
// parametres optionnels
if (!empty($this->from)) $mime .= "From: ".$this->from. "\n";
if (!empty($this->headers)) $mime .= $this->headers. "\n";
if (!empty($this->body)) $this->attach($this->body, "", "text/plain");
// entete MIME
$mime .= "MIME-Version: 1.0\n".$this->build_multipart();
// envoi du message
mail($this->to, $this->subject,"", $mime);
}
}; // fin de la classe
?>
Quand dans mon formulaire je n'ai pas d'image, je ne reçois rien par mail et aucun message d'erreur, quand je mets une image cela me donne ce message d'erreur :
Warning: mail(): Erreur d'appel #1.02 in /var/www/free.fr/6/5/extantpc/annonce/mime_mail.class.php on line 145
Qui correspond à cette ligne :
mail($this->to, $this->subject,"", $mime);
Je mets ceci à la place :
echo "mail($this->to, $this->subject,\"\", $mime)";
Et cela vérifie le début, lorsque je ne mets pas d'images, il n'utilise pas la fonction mail, lorsque j'envois une image j'ai ça :
"mail(extantpc@free.fr, Annonce mise en ligne,"", From: extantpc@free.fr X-Mailer: PHP/4.3.9RC2 Date: Tue, 2 Nov 2004 15:39:18 -0500 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary = b240001758180d6295cad4776d2d6c936 This is a MIME encoded message. --b240001758180d6295cad4776d2d6c936 Content-Type: text/plain Content-Transfer-Encoding: base64
(un tas de caractéres )
)
Donc a priori il y a deux probléme : Le script rend obligatoire la piéce jointe pour être envoyé, ce qui ne devrait pas être le cas, et lors de l'envoit avec piéce jointe il y a une erreur, qui sait ou elles sont ? merci !!!