2010-04-21 3 views
1

Problèmes lors de l'envoi d'un message HTML formaté correctement à partir d'un script PHP. Je cours PHP 5.3.0 et Apache 2.2.11 sur Windows XP Professionnel.Problème avec l'encodage de caractères sur email envoyé via PHP?

La sortie ressemble à ceci:

Résumé de l'agent de soutien le mardi 20 Avril 2010 = 20 ext. Nom Heure Volume
137 Nom de l'agent 01:27:25 1
138 = 09 00:00:00 0
139 = 09 00:00:00 0

Vous voyez le = 20 et = 09 là-bas? Si vous regardez le code HTML, vous voyez aussi = les signes sont transformés en = 3D. Je figure cela est un problème de codage de caractères que je lis ce qui suit à Wikipedia:

ISO-8859-1 et de la confusion Windows 1252

Il est très fréquent de qualifier erronément données texte avec l'étiquette charset ISO- 8859-1, même si les données sont réellement encodées sous Windows-1252. Dans Windows-1252, les codes entre 0x80 et 0x9F sont utilisés pour les lettres et la ponctuation, alors qu'ils sont des codes de contrôle dans ISO-8859-1. De nombreux navigateurs Web et clients de messagerie interpréteront les codes de contrôle ISO-8859-1 comme des caractères Windows-1252 afin de prendre en compte ces erreurs d'étiquetage mais ce comportement n'est pas standard et il faut éviter de générer ces caractères dans ISO-8859-1 contenu étiqueté.

Cela ressemble au problème, mais je ne sais pas comment résoudre ce problème. Mon code ressemble à ceci:

ob_start(); 
report_queue_summary($yesterday,$yesterday,$first_extension,$last_extension,$queue); 
$body_report = ob_get_contents(); 
ob_end_clean(); 
$body_footer = "This is an automatically generated e-mail."; 
$message = new Mail_mime(); 
$html = $body_header.$body_report.$body_footer; 
$message->setHTMLBody($html); 
$body = $message->get(); 
$extraheaders = array("From"=>"***redacted***","To"=>$recipient, "Subject"=>"Agent Summary for $yesterday [$queue]", "Content-type"=>"text/html; charset=iso-8859-1"); 
$headers = $message->headers($extraheaders); 

# setup e-mail; 
$host = "*********"; 
$port = "26"; 
$username = "*****"; 
$password = "*****"; 

# Send e-mail 
$smtp = Mail::factory('smtp', 
    array ('host' => $host, 
    'port' => $port, 
    'auth' => true, 
    'username' => $username, 
    'password' => $password)); 

$mail = $smtp->send($recipient, $extraheaders, $body); 

if (PEAR::isError($mail)) { 
    echo("" . $mail->getMessage() . ""); 
} else { 
    echo("Message successfully sent!"); 
} 

Le problème est que j'utilise la mise en mémoire tampon de sortie?

Répondre

2

Le problème est que vous avez besoin de l'en-tête suivant:

Content-Transfer-Encoding: quoted-printable 
+0

l žÔ®šf «+ 1ªäzا EÜ, ‰ Ó¹ë k) ®) vÓm5ÓöÛFμ|yºuÜzi Pire encore. – cosgroveb

+2

En supposant que vous vouliez utiliser quoted-printable au lieu de base64, cela a fonctionné! – cosgroveb

+0

Attends, hein? Hmm. J'avoue que je les ai peut-être mélangés dans ma tête. Quoi qu'il en soit, j'apprécie la coche. –