Problème avec la fonction MAIL

nordine
Invité n'ayant pas de compte PHPfrance

09 sept. 2011, 16:17

Bonjour,
Lorsque j'envoie un mail avec PHP, j'ai trois erreurs à la réception :
- les boundary permetant de délimiter le texte sont visibles dans le mail reçu.
- les balises html ne sont pas interprétées
- les mails sont reçus en tant que spam

Voici le code :
// fonction message (format html)
function message_mail_html($message_html)
{
   // initialisation
   $message = "";		
   // retour à la ligne
   $passage_ligne = "\r\n";
   // boundary utile pour le content type
   $boundary = "-----=".md5(rand());
   // MESSAGE DU MAIL
   $message = $passage_ligne."--".$boundary.$passage_ligne;
   $message .= "Content-Type: text/html; charset=\"ISO-8859-1\"".$passage_ligne;
   $message .= "Content-Transfer-Encoding: 8bit".$passage_ligne;
   $message.= $passage_ligne.$message_html.$passage_ligne;
   $message.= $passage_ligne."--".$boundary."--".$passage_ligne;
   return $message;
}
//fonction header 
function header_mail($mail, $nom)
{
  // initialisation
  $passage_ligne = "";
  $exp = "";
  $ret = "";
  $mime = "";
  $content = "";
  $header = "";
  // retour à la ligne
  $passage_ligne = "\r\n";
  // boundary utile pour le content type
  $boundary = "-----=".md5(rand());		
  // adresse expediteur
  $exp = "From: \"".$nom."\"".$mail.$passage_ligne;
  // adresse de retour
  $ret = "Reply-to: \"".$nom."\"".$mail.$passage_ligne; 
  // version mime
  $mime = "MIME-Version: 1.0".$passage_ligne; 
  // content-type
  $content = "Content-Type: multipart/alternative;".$passage_ligne." boundary=\"$boundary\"".$passage_ligne;	
  // HEADER DU MAIL
  $header = $exp.$ret.$mime.$content;		
  return $header;
}	
// function MAIL PHP (format html)
function send_mail_html($mail_dest, $mail_exp, $sujet, $nom_exp, $msg_html)
{
  // initialisation
  $header = "";
  $contenu = "";	
  // création du header
  $header = header_mail($mail_dest, $mail_exp, $nom_exp);
  // Création du message.
  $contenu = message_mail_html($msg_html, $mail_dest);
  // Envoi du mail
  mail($mail_dest,$sujet,$contenu,$header);	
}

ViPHP
ViPHP | 3607 Messages

09 sept. 2011, 20:20

Bonsoir,

Je n'ai pas regardé en détail, mais il y a quelque chose qui pourrait améliorer le tout...
Tu génères deux « boundary » différents (un dans la fonction qui crée les entêtes, et un dans celle qui crée le corps du message).
Or il me semble (à vérifier) que ces derniers doivent être strictement identiques dans le mail entier...

Essaye de changer ça, et dis nous si ça s'améliore :)
Modifié en dernier par jojolapine le 19 sept. 2011, 14:45, modifié 1 fois.

nordine
Invité n'ayant pas de compte PHPfrance

19 sept. 2011, 10:27

A priori, il y a bien une erreur avec les boundary. En faisant comme tu as fait, je ne reçoit plus le mail en tant que spam mais je le reçois nrormalement, et les balises html sont bien interprétées. Par contre, je vois encore les caractéristiques du corps du message. Voici le mail reçu :

-------=a0443c8c8c3372d662e9173c18faaa2c Content-Type: text/html; charset="ISO-8859-1" Content-Transfer-Encoding: 8bit
Pour activer votre compte, cliquez sur le lien suivant : Activation
-------=a0443c8c8c3372d662e9173c18faaa2c--

ViPHP
ViPHP | 2577 Messages

19 sept. 2011, 10:54

A priori, il y a bien une erreur avec les boundary. En faisant comme tu as fait, je ne reçoit plus le mail en tant que spam mais je le reçois nrormalement, et les balises html sont bien interprétées. Par contre, je vois encore les caractéristiques du corps du message. Voici le mail reçu :

-------=a0443c8c8c3372d662e9173c18faaa2c Content-Type: text/html; charset="ISO-8859-1" Content-Transfer-Encoding: 8bit
Pour activer votre compte, cliquez sur le lien suivant : Activation
-------=a0443c8c8c3372d662e9173c18faaa2c--
Il me semble qu'il manque -- à la fin du premier "boundary"

Je me demande si dans
$content = "Content-Type: multipart/alternative;".$passage_ligne." boundary=\"$boundary\"".$passage_ligne;

il ne faut pas les "--" en fin.