BAD HEADER, MIME error

benassis

Membre confirmé
10 Janvier 2006
73
0
Bonjour,

Sous php, j'utilise un serveur smtp avec une class smtp pour envoyer des courriels. Ça fonctionne, sauf qu'à l'arrivée l'entête du courriel affiche toujours l'erreur suivante :
X-Amavis-Alert: BAD HEADER, MIME error: error: part did not end with expected
boundary
X-FID: FLAVOR00-NONE-0000-0000-000000000000
X-NAI-Spam-Score: -2
X-NAI-Spam-Rules: 3 Rules triggered BAYES_00=-4, HAS_X_FID_WO_INCREDIMAIL=1,
MIME_MISSING_BOUNDARY=1
Je poste ici la partie utile du script php (j'ai changé les adresses pour éviter le spam)
include('Classes.smtp.php');

...je recueille et traite les données envoyées par un formulaire en POST

$smtp = new SMTP('smtp.AdresseduFAI.ca', '', '', 25, 'localhost', 0);
$smtp->From = '[email protected]';
$smtp->FromName = 'Service aux membres';
$smtp->Encoding = 'QUOTED-PRINTABLE';
$smpt->ISO = 'iso-8859-1';
$smtp->MIME = '1.0';// La version mime
$premlet= substr($pourabon, 0, 1);//conversion en majuscules
$up = strtoupper($premlet);
$sujet=substr_replace($pourabon ,$up, 0, 1);
$smtp->Sujet=$sujet;
$to=$courriel;//courriel au membre
$message = $mess;
$smtp->Priority = 3;
$smtp->ContentType = 'text/plain,charset=iso-8859-1';
$headers = 'De: [email protected]' . "\r\n" .
'Répondre à: [email protected]' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
$smtp->smtp_mail($to, $sujet, $message, $header='');// Envoie du mail
if($smtp->erreur){
echo $smtp->erreur;
}
//... on envoie les données entières à l'administrateur
$smtp = new SMTP('smtp.AdresseduFAI.ca', '', '', 25, 'localhost', 0);
$smtp->From = '[email protected]';
$to=$admin;//courriel à l'administrateur
...
J'ai cherché dans plusieurs forums d'entraide et n'ai pas encore trouvé de réponse satisfaisante à ce mystérieux problème.
Merci de m'aider

Renseignements utiles :
Mac OS X.3.9
Apache/1.3.33 (Darwin) PHP/4.4.4 mod_ssl/2.8.24 OpenSSL/0.9.7l
La fonction mail() est bloquée sur le serveur utilisé
 

Merci pour ta suggestion gloup gloup ; toutefois, ta routine utilise la fonction mail() du php. Mais comme mentionné dans mon premier message, la fonction mail() est bloquée sur le serveur utilisé; c'est pourquoi je dois utiliser le smtp (auquel je ne connais pas grand chose, il faut dire).

En attendant une autre suggestion, tu peux me dire pourquoi tu utilises la fonction wordwrap ? Pourquoi, faut-il couper les chaînes de caractères dans un envoi courriel ?
 
Ben je ne m'y connais pas trop en php non plus, je suis débutant aussi : ce n'est pas moi qui ait créé ce formulaire. ;)

Certains FAI bloquent tout envoi smtp pour éviter que les ordinateurs des particuliers ne deviennent des mailers à virus comme ce fût le cas avec Win XP.

Pour le wordwarp, je suppose que c'est pour la lisibilité, c'est une juste option.

Quelqu'un d'autre te répondra mieux que moi pour tes questions. ;)
 
Hello,

Comme tu utilises une classe (Classes.smtp.php), tu devrais te tourner vers la doc fournie par le développeur de cette classe...

Ce qui me semble indicatif c'est le MIME_MISSING_BOUNDARY, apparemment l'entête MIME n'est pas correcte, regardes de ce côté-là.. voilà ce que j'ai pu trouver :

Content-Type: type/sous-type; {charset = encodage} | {boundary = délimiteur} CRLF
représente le type et le sous-type (text/plain, image/jpeg, audio/basic, application/postscript, etc.) et l'encodage (US-ASCII ou ISO-8859-X) du contenu d'un courrier. Si le couple type/sous-type possède la valeur multipart/mixed ou multipart/alternative, l'attribut boundary permet de délimiter les parties encodées différemment par une chaîne de caractères spéciale. :
source
 
Bloc de code:
$headers = 'De: [email protected]' . "\r\n" .
'Répondre à: [email protected]' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
$smtp->smtp_mail($to, $sujet, $message, $header='');// Envoie du mail
if($smtp->erreur){
echo $smtp->erreur;
}
Oula sékwasa ??


déjà
Bloc de code:
$smtp->smtp_mail($to, $sujet, $message, [B]$header=''[/B]);
ce qui est fait la est con, tant qu'à faire ne pas fournir de header !

puis
Bloc de code:
$headers = 'De: [email protected]' . "\r\n" .
'Répondre à: [email protected]' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
Dans $headers faut pas mettre De: Répondre à !!!! C'est pas pour l'utilisateur ça c'est pour les serveur mail ! From: et Reply-to: sont des "paramètres", faut pas mettre ça en français ! (Ces canadiens alors :D ;))

Sinon tente de remplacer
Bloc de code:
echo 'POUET',$smtp->erreur;
pour voir si l'erreur afficher est celle là ou si c'est des erreurs généré par PHP, auquel cas faudra aller voir le code de cette classe PHP.
 
p4bl0
Bloc de code:
déjà $smtp->smtp_mail($to, $sujet, $message, [B]$header=''[/B]);
ce qui est fait la est con, tant qu'à faire ne pas fournir de header !
Bon bon, faut pas se fâcher pour si peu ;)
J'ai modifié le code pour ceci :
Bloc de code:
$mime_boundary = "<<<--==+X[".md5(time())."]\r\n\r\n";
$headers = 'From: [email protected]' . "\r\n" .
     'Reply to: [email protected]' . "\r\n" .
     'X-Mailer: PHP/' . phpversion()
     ."--".$mime_boundary."\r\n";
     
$smtp->smtp_mail($to, $sujet, $message, $header);
et ça n'a rien changé.:D

(Ces canadiens alors :D ;))
Ici, nous sommes 7 millions de Québécois noyés dans une mer de ~300,000 d'anglos. Alors faut s'efforcer de traduire de l'anglais au français plutôt que l'inverse comme vous faites, vous, les Franglos, si on ne veut pas disparaître :D ]

Sinon tente de remplacer
Bloc de code:
echo 'POUET'.$smtp->erreur;
pour voir si l'erreur afficher est celle là ou si c'est des erreurs généré par PHP, auquel cas faudra aller voir le code de cette classe PHP.
Ok. J'ai essayé ::rateau:
Bloc de code:
echo 'pouet pouet, vroum, vroum'.$smtp->erreur;
mais je n'ai pas eu de message d'erreur dans le code php ; c'est dans le courriel, à l'arrivée, que le message d'erreur s'affiche dans l'entête du message (header). Voir mon premier message.
Le code de la classe php est un peu long pour le présenter ici mais si tu veux le voir aller à:
http://www.phpcs.com/codes/CLASS-ENV...MTP_37399.aspx
comme indiqué dans une réponse précédente.
D'autres idées ?
Merci pour ces tentatives !
 
Bon on comparant ton code et les exemples fournis je comprend pas bien d'où tu as sorti ça... Par exemple chez toi :
Bloc de code:
$smtp->From = '[email protected]'; 
$smtp->FromName = 'Service aux membres';

Alors que dans un des exemples de l'auteur :
Bloc de code:
$smtp->set_from('Service aux membres', '[email protected]');

:mouais: voilà le fameux exemple
 
J'avoue qu'a part les codes j'ai pas lu grand chose :casse: (et je suis pas &#233;nerv&#233; ;))
J'avais pas vu que ce message d'erreur &#233;tait dans le mail d'arriv&#233; ! ^^

Essaye avec &#231;a comme header :
Bloc de code:
$headers = 'From: [email protected]' . "\r\n" .
    'Reply-To: [email protected]' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();
Parce qu'apparement c'est dans les header du mail qu'il y a un probl&#232;me, alors autant utiliser la bonne syntaxe :p ("Reply-To:")
Je suis peut-&#234;tre &#224; c&#244;t&#233; de la plaque, mais sait-on jamais !


@iMatthieu : appeler cette m&#233;thode ou modifier directement ces attributs revient peut-&#234;tre au m&#234;me ;) Par contre faut faire gaffe que les attributs ne soient pas priv&#233;s :)
 
Oui c'est juste, j'ai pas beaucoup réfléchi et suis habitué de mettre les attributs en private et de créer des "getteur" et "setteur".. mais là c'est en publique :rateau:

Je m'étais arrêté sur le BOUNDARY, même pas fais attention à ce $headers complètement faux qui n'est même pas passer en paramètre :)
:)

&#224; mon avis si on enl&#232;ve ce truc de boundary du header, qu'on corrige le header et qu'on le passe bien en param&#232;tre &#231;a devrait le faire, je vois pas &#224; priori (je ne connais aps le code de la classe php utilis&#233;) d'autre source possible au probl&#232;me.

Donc utiliser le header que j'ai &#233;cris dans mon pr&#233;c&#233;dent post et corriger le $header='' pass&#233; en param&#232;tre pour voir si &#231;a marche, sinon all&#233; voir le code de la classe pour voir ce qui se passe... :-/
 
Rebonjour,

J'ai modifié mon code comme p4bl0 a conseillé :
Bloc de code:
$smtp = new SMTP('adresse_du_FAI.ca', '', '', 25, 'localhost', 0);
$smtp->From = 'info@adresse_du_FAI.ca';
$smtp->FromName = 'Service aux membres';
$smtp->Encoding = 'QUOTED-PRINTABLE'; // Ancienne valeur quoted-printable
$smpt->ISO = 'iso-8859-1';
$premlet= substr($pourabon, 0, 1);
$up = strtoupper($premlet);
$sujet=substr_replace($pourabon ,$up, 0, 1);
$smtp->Sujet=$sujet;
$to=$courriel;//courriel au membre
$message = $mess;
$smtp->Priority = 3;
//$mime_boundary = "<<<--==+X[".md5(time())."]\r\n\r\n";
$headers.='Reply-to: info@adresse_du_FAI.ca' . "\r\n"."Mime-Version: 1.0\r\n".'X-Mailer: PHP/' . phpversion().'\r\n';
$smtp->smtp_mail($to, $sujet, $message, $header='');// Envoie du mail     
if($smtp->erreur){

echo 'pouet pouet vroum vroum'. $smtp->erreur;
}
Et ça ne corrige rien:confused:
Mais j'ai remarqué deux choses :
1. quand je mets
Bloc de code:
$smtp->smtp_mail($to, $sujet, $message, $header='');// Envoie du mail
, j'ai mon message et son sujet mais quand je mets :
Bloc de code:
$smtp->smtp_mail($to, $sujet, $message, $headers);// Envoie du mail
je reçois mon courriel mais sans le message ni le sujet.
2. Remarquez le '.' après $headers :
Bloc de code:
$headers.='Reply-to: info@adresse_du_FAI.ca' . "\r\n"."Mime-Version: 1.0\r\n".'X-Mailer: PHP/' . phpversion().'\r\n';
Avec ce dernier code je reçois mon courriel mais avec celui-ci :
Bloc de code:
$headers='Reply-to: info@adresse_du_FAI.ca' . "\r\n"."Mime-Version: 1.0\r\n".'X-Mailer: PHP/' . phpversion().'\r\n';
mon courriel ne me parvient pas !

Je sais que ça ne m'empêche pas de recevoir mes courriels mais cette erreur m'énaaaarrve !
Aussi je songe à changer le script d'envoi et la classe que j'utilise.
À moins que vous n'ayez une solution géniale à me soumettre !:D