PHP邮件编码主题行

13

当我尝试从 PHP 发送一个经过 HTML 编码的电子邮件时,如果主题行包含特殊字符像"Here's the information you requested",PHP 会对其进行编码使其读取为"Here's the information you requested."

我该如何解决这个问题?


这是使用 PHP mail() 函数的代码:

$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

$headers .= 'To: ' . $mod_params['name'] . '<' . $mod_params['email'] . '>' . "\r\n";

$headers .= 'From: <do_not_reply@a4isp.com>' . "\r\n";  

$email_to = $mod_params['email'];

$email_sub = "Here's the Information You Requested";

$body = html_entity_decode("<html><body>" . $email_html_body . "</body></html>");

mail($email_to,$email_sub,$body,$headers);

它产生的错误与通过SugarPHPMailer类运行它时产生的错误相同。

6个回答

41

试试这个:

 $newsubject='=?UTF-8?B?'.base64_encode($subject).'?=';

这样你就不会依赖于PHP或MTA的编码,而是自己完成工作,邮件客户端应该能够理解。在您的新主题中不会出现任何特殊字符,因此在传递电子邮件时不应出现任何问题。


我正在使用这个Peter。看起来不错,除非主题有点长。你知道如何分块吗?我的意思是,主题应该被分成什么大小的分区?怎么做? - Sebastian Sastre
2
绝对完美的解决方案。无尽感激之情送给 @Peter ,结束了为期三小时的令人抓狂的煎熬!!! - David Perlman
你可以使用chunk_split(每60个字符)并将其应用于每个块,然后添加一个新行和几个空格来连接这些块。我说60个字符以适应其余的编码头部分。 - dresende
它对我有用,谢谢。我在电子邮件主题中使用®符号,并且我正在使用Symfony和Swifmailer。 - a4bike

8
我曾在一个WordPress插件上遇到类似的问题,我反复思考并尝试了这里和其他谷歌搜索结果中的不同建议。最终我找到了适合我的解决方案,现在我分享给大家。我要说的是,一开始我尝试了保罗的解决方案,但它没有起作用,原因是我试图“简写”解决方案。在我的情况下,只调用html_entity_decode()是不起作用的。为什么?如果我更仔细地阅读PHP文档,这将是显而易见的。我的问题出在单引号编码上,而html_entity_decode()的默认值是'ENT_COMPAT',它会保留单引号。解决方案是设置所有参数,这样就可以解决问题了。实际上,由于我正在编码UTF-8,我可能可以省去charset,但我想做得彻底一些。
$decoded_str = html_entity_decode (  $value_to_decode, ENT_QUOTES, 'UTF-8' );

这里的教训很好,“看文档”。我不是说你没看(你可能已经看了),但我们中的许多人会匆忙行事,对解决方案视而不见,即使它就在那里盯着我们。

6

尝试了两种方法都没有成功。我以前从未见过这种情况。感谢您的回复。 - ericwindham

3
你应该使用mb_encode_mimeheader函数,记得设置好"Content-Type"。
mb_internal_encoding("UTF-8"); //has to be set (of course your internal encoding may not be UTF-8).
$subject = mb_encode_mimeheader($subject,'UTF-8','Q');

当需要时,它将负责对内容进行编码(人类可读的Quoted-printable),并根据长度自动将主题分成适当数量的行。


-1

-2
提交有问题的代码段通常会更快地获得更好的回应。在此操作之前,您可能已经对文本进行了编码。如先前建议的那样,您可以寻找该操作并进行更正,或者在发送电子邮件之前仅对主题行进行解码。

我在发送之前尝试解码它。我还尝试使用php mail()函数而不是SugarPHPMailer类发送相同的电子邮件。这不是特定于SugarCrm的问题。使用mail()也会出现同样的情况。 - ericwindham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接