Envoyer un email au format txt et html

WRInaute occasionnel
Salut,

J'ai ce sript php ci-dessous qui envoie un email au format text et html mais lorsque je reçois l'email au format html les liens ne sont pas surlignés (cliquables) dans l'email, c'est comme si les balises html <a href...> n'étaient pas prises en compte, voyez-vous une erreur dans mon code ?

$boundary = "-----=" . md5( uniqid ( rand() ) );

$destinataire = "email@destinataire.com";
$email_expediteur = "contact@mon-site.com";
$email_reply = "contact@mon-site.com";
$mon_site = "http://www.mon-site.com";

$headers = "From: \"Mon site\"<$email_webmaster>\n";
$headers .= "Reply-To: ".$email_reply."\n";
$headers .= "Return-Path: ".$email_webmaster."\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/alternative; boundary=\"$boundary\"";

$sujet='Essai email';

$message_texte='Bonjour,'."\n\n".'Voici un message au format texte un e-mail $email_expediteur est envoyé par un script PHP et mon site est $mon_site';

$message_html="<html><body>'Voici un message au format html un e-mail <a href=\"mailto:$email_expediteur\">$email_expediteur</a> est envoyé par un <i>script PHP</i> et mon site est <a href=\"$mon_site\">$mon_site</a>.</body></html>";

$message_email = "This is a multi-part message in MIME format.\n\n";
$message_email .= "--" . $boundary . "\n";
$message_email .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
$message_email .= "Content-Transfer-Encoding: quoted-printable\n\n";
$message_email .= $message_texte;
$message_email .= "\n\n";
$message_email .= "--" . $boundary . "\n";
$message_email .= "Content-Type: text/html; charset=\"iso-8859-1\"\n";
$message_email .= "Content-Transfer-Encoding: quoted-printable\n\n";
$message_email .= $message_html;
$message_email .= "\n\n";
$message_email .= "--" . $boundary . "--\n";

if(mail($destinataire,$sujet,$message_email,$headers))
{
echo 'Le mail a été envoyé';
}
else
{
echo 'Le mail n\'a pu être envoyé';
}

Merci pour votre aide.
 
WRInaute occasionnel
Ca m'a l'air d'être top ce PhpMailer mais faut-il encore bien le paramétrer au départ, c'est pas trop technique ? J'ai pas de grandes connaissances dans tout ce qui touche aux techniques d'envoi d'emails ?
 
WRInaute occasionnel
C'est quand même dingue parce qu'on ne trouve jamais un code entier phpmailer pour envoyer un email au format html et text (multipart/alternative) il faut faire 36 forums pour bidouiller le code... alors qu'envoyer en email sous cette forme devrait (doit) être la règle ! C'est à croire que personne n'utilise le multipart/alternative :(

J'essaie ce code ci-dessous mais ça marche pas :

$mail = new PHPmailer();

$mail->$htmlBody='<html><body><head><style>.entete{background-color:#0000FF;color:#FFFFFF;border:solid 3px;font-size:25px}';
$mail->$htmlBody.='.ligne{color:#0000FF;border:solid 1px;text-align:center;font-size:23px}</style></head>';
$mail->$htmlBody.='<center><table><tr><td class="entete">Voici un exemple d\'e-mail au format HTML. <a href=\'mailto:mon@email.com\'>mon@email.com</a> envoyé par un <i>script PHP</i> <a href=\'http://www.mon-site.com\'>www.mon-site.com</a>.</td></tr>';
$mail->$htmlBody.='<tr><td class="ligne">Ceci est un tableau HTML</td></tr></table></center></body></html>';

$mail->$textBody='Voici un exemple d\'e-mail au format text. mon@email.com envoyé par un script PHP http://www.mon-site.com.';
$mail->$textBody.='Ceci est un essai.';

$mail->Body($htmlBody);
$mail->isHTML(true);
$mail->AltBody($textBody);

$mail->AddAddress([email='mon@email.com]'mon@email.com[/email]');
$mail->AddReplyTo($email_webmaster);
$mail->Subject='Essai email';

if(!$mail->Send()){ //Teste si le return code est ok.
echo $mail->ErrorInfo; //Affiche le message d'erreur (ATTENTION:voir section 7)
}
else{
echo 'L\'email a été envoyé avec succès';
}
unset($mail);
 
WRInaute accro
Et tu as quoi comme message d'erreur ? Pour info, avoir du CSS dans un mail, ce n'est pas conseillé car très mal supporté en fonction des clients de messagerie et webmail.
 
WRInaute occasionnel
J'ai ce message d'erreur :
Code:
Fatal error: Cannot access empty property in

J'ai viré le css dans mon email mais j'ai toujours cette erreur :(
 
WRInaute accro
Tu t'es mélangé les pinceaux entre les méthodes et les variables de la classe.

Entre autre :

Code:
$mail->Body($htmlBody);
$mail->isHTML(true);
$mail->AltBody($textBody);

qui devrait être :

Code:
$mail->Body = $htmlBody;
$mail->isHTML(true);
$mail->AltBody = $textBody;

Mais j'imagine que tu as un numéro de ligne concernant ton erreur ?
 
WRInaute occasionnel
Lorsque j'essaie ce code ci-dessous j'ai une erreur Fatal error: Cannot access empty property in sur la ligne 20, la ligne qui correspond à $mail->$htmlBody.='<html><body><center>....

Code:
$mail = new PHPmailer();

$mail->AddAddress('mon@email.com');
$mail->AddReplyTo($email_webmaster);
$mail->Subject='Essai email';

$mail->$htmlBody.='<html><body><center><table><tr><td class="entete">Voici un exemple d\'e-mail au format HTML. <a href=\'mailto:mon@email.com\'>mon@email.com</a> envoyé par un <i>script PHP</i> <a href=\'http://www.mon-site.com\'>www.mon-site.com</a>.</td></tr>';
$mail->$htmlBody.='<tr><td class="ligne">Ceci est un tableau HTML</td></tr></table></center></body></html>';

$mail->$textBody='Voici un exemple d\'e-mail au format text. mon@email.com envoyé par un script PHP http://www.mon-site.com.';
$mail->$textBody.='Ceci est un essai.';

$mail->Body = $htmlBody;
$mail->isHTML(true);
$mail->AltBody = $textBody;

if(!$mail->Send()){ //Teste si le return code est ok.
echo $mail->ErrorInfo; //Affiche le message d'erreur (ATTENTION:voir section 7)
}
else{
echo 'L\'email a été envoyé avec succès';
}
unset($mail);
 
WRInaute occasionnel
UsagiYojimbo a dit:
Ca existe pas $mail->$htmlBody.
Code:
$mail->Body($htmlBody);
par contre, oui.

C'était presque ça UsagiYojimbo :D

En fait, il fallait juste enlever le $mail->$htmlBody et le $mail->$textBody ce qui donne le code mise à jour :

Code:
$mail = new PHPmailer();

$mail->AddAddress('mon@email.com');
$mail->AddReplyTo($email_webmaster);
$mail->Subject='Essai email';

$htmlBody='<html><body><center><table><tr><td class="entete">Voici un exemple d\'e-mail au format HTML. <a href=\'mailto:mon@email.com\'>mon@email.com</a> envoyé par un <i>script PHP</i> <a href=\'http://www.mon-site.com\'>www.mon-site.com</a>.</td></tr>';
$htmlBody.='<tr><td class="ligne">Ceci est un tableau HTML</td></tr></table></center></body></html>';

$textBody='Voici un exemple d\'e-mail au format text. mon@email.com envoyé par un script PHP http://www.mon-site.com.';
$textBody.='Ceci est un essai.';

$mail->Body = $htmlBody;
$mail->isHTML(true);
$mail->AltBody = $textBody;

if(!$mail->Send()){ //Teste si le return code est ok.
echo $mail->ErrorInfo; //Affiche le message d'erreur (ATTENTION:voir section 7)
}
else{
echo 'L\'email a été envoyé avec succès';
}
unset($mail);

Et là ça marche parfaitement !

Une question : quels sont les avantages-inconvénients d'utiliser le smpt ou pas pour envoyer les emails ?
 
WRInaute occasionnel
Je suis entrain de voir comment il faut faire pour paramétrer correctement la langue des éventuels messages d'erreurs lors de l'envoi d'un email mais je trouve pas grand chose comme aide :?

Dans le code php ci-dessous on trouve ErrorInfo qui renvoi normalement le texte des éventuelles erreurs d'envoie, c'est en langue anglaise par défaut mais on a une version française qui est dans un répertoire language/ comment indiquer à phpmailer d'utiliser le fichier français des erreurs (qui est dans language/phpmailer.lang-fr.php) ?

Code:
if(!$mail->Send()){
echo $mail->ErrorInfo;
}
else{
echo 'L\'email a été envoyé avec succès';
}
 
WRInaute passionné
Toto,

envoies moi un MP stp. J'ai un code php qui permet de faire ça... (mais pas sous la main maintenant) Je te l'envoies quand je serais rentré.

:wink:
 
WRInaute occasionnel
UsagiYojimbo a dit:
Code:
$mail->SetLanguage('fr','phpmail/language/');

Le path (phpmail/language/) du fichier d'erreur français doit être sous quel forme :
Code:
phpmail/language/
../phpmail/language/
$_SERVER['DOCUMENT_ROOT']/phpmail/language/

Je place donc le code ci-dessous dans mes scripts php et ça devrait marcher :
Code:
$mail = new PHPmailer();

$mail->AddAddress('mon@email.com');
$mail->AddReplyTo($email_webmaster);
$mail->SetLanguage('fr','phpmail/language/'); 
$mail->Subject='Essai email';

$htmlBody='<html><body><center><table><tr><td class="entete">Voici un exemple d\'e-mail au format HTML. <a href=\'mailto:mon@email.com\'>mon@email.com</a> envoyé par un <i>script PHP</i> <a href=\'http://www.mon-site.com\'>www.mon-site.com</a>.</td></tr>';
$htmlBody.='<tr><td class="ligne">Ceci est un tableau HTML</td></tr></table></center></body></html>';

$textBody='Voici un exemple d\'e-mail au format text. mon@email.com envoyé par un script PHP http://www.mon-site.com.';
$textBody.='Ceci est un essai.';

$mail->Body = $htmlBody;
$mail->isHTML(true);
$mail->AltBody = $textBody;

if(!$mail->Send()){ //Teste si le return code est ok.
echo $mail->ErrorInfo; //Affiche le message d'erreur (ATTENTION:voir section 7)
}
else{
echo 'L\'email a été envoyé avec succès';
}
unset($mail);

Mais comment tester en réel que cela fonctionne bien ?

Il y a dans le fichier class.phpmailer.php la fonction SetLanguage avec par défaut la langue anglaise, faut-il modifier quelque chose dans ce fichier ?
 
Discussions similaires
Haut