通过PHP发送的电子邮件中的字符编码有问题吗?

通过PHP发送的电子邮件中的字符编码有问题吗?,php,email,encoding,Php,Email,Encoding,从PHP脚本发送格式正确的HTML电子邮件时遇到问题。我在WindowsXP Professional上运行PHP5.3.0和Apache2.2.11 输出如下所示: ob_start(); report_queue_summary($yesterday,$yesterday,$first_extension,$last_extension,$queue); $body_report = ob_get_contents(); ob_end_clean(); $body_footer = &quo

从PHP脚本发送格式正确的HTML电子邮件时遇到问题。我在WindowsXP Professional上运行PHP5.3.0和Apache2.2.11

输出如下所示:

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!");
 } 
2010年4月20日星期二的代理支持摘要=20 外部名称时间卷
137代理人姓名01:27:25 1
138=09 00:00:00 0
139=09 00:00:00 0

你看到里面的=20和=09了吗?如果您查看HTML,您还会看到=符号被转换为=3D。当我在维基百科上读到以下内容时,我认为这是一个字符编码问题:

ISO-8859-1和Windows-1252混淆

使用字符集标签ISO-8859-1错误标记文本数据是很常见的,即使数据实际上是Windows-1252编码的。在Windows-1252中,0x80和0x9F之间的代码用于字母和标点符号,而在ISO-8859-1中它们是控制代码。许多web浏览器和电子邮件客户端将ISO-8859-1控制代码解释为Windows-1252字符,以适应此类错误标记,但这不是标准行为,应注意避免在ISO-8859-1标记的内容中生成这些字符

这看起来是个问题,但我不知道如何解决。我的代码如下所示:

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!");
 } 

问题是我正在使用输出缓冲吗?

问题是您需要以下标题:

Content-Transfer-Encoding: quoted-printable

lžžžf«ž+1žzاžk)vÓm5ÓfµyºuÜzi甚至更糟。假设您打算使用引用的可打印文件而不是base64,那就行了!等等,嗯?嗯,我承认我脑子里可能把它们弄混了。不管怎样,我很感激你的选择。