【问题标题】:Encoding problem in From email and name when sending email in PHP?在 PHP 中发送电子邮件时,来自电子邮件和名称的编码问题?
【发布时间】:2011-09-22 06:40:27
【问题描述】:

什么可能导致此编码问题?我是否正确编码了标头信息,或者这可能是其他地方引起的?

我在这里发现了一个类似的问题:Email from PHP has broken Subject header encoding 但从我正在阅读的内容来看,我认为我这样做是正确的。

基本上,我们的客户有时会发送用法语编写的电子邮件。它可以工作,但有时我们会遇到一些编码问题,我想知道我是否编码错误(我无法弄清楚)。

$from = '=?UTF-8?B?'.base64_encode($email['from_name']).'?= <'.$email['from_email'].'>';
        $to = '=?UTF-8?B?'.base64_encode($email['to_name']).'?= <'.$email['to_email'].'>';

        $get_param = array( 
                    'Content-Type' => 'text/plain;charset=utf-8',
                    'Content-Transfer-Encoding' => '8bit');

上面的代码是我如何编码我的标题信息,下面是发送:

$msg = $message_mime->get($get_param);

        $headers = array (
                'From' => $from,
                'To' => $to,
                'Reply-To' => $from,
                'Subject' => utf8_decode($subject));

        $headers = $message_mime->headers($headers);

        $smtp = Mail::factory('smtp',
            array ('host' => $smtp_settings['host'],
                'auth' => true,
                'username' => $smtp_settings['username'],
                'password' => $smtp_settings['password']));

        $mail = $smtp->send($to, $headers, $msg);

问题是他们收到的电子邮件来自:

Clientnamé de l'Ontario[=?UTF-8B?QXNzZW1ib(...)=?=]

感谢您的帮助:)

编辑:客户名称基本上使用与上述相同的字符。我的意思是该电子邮件应该来自“Clientname de l'Ontario”

【问题讨论】:

  • 我没有使用 PEAR Mail,但据我所知,您的编码是正确的。也许是一个有问题的电子邮件客户端?您是否有机会获得整个电子邮件源用于调试目的?
  • 顺便说一句,base64 编码部分 (QXNzZW1ib...) 翻译成什么?与发件人名称相同?
  • 是的,编码似乎是正确的。我通过 base64_decode 运行字符串,我得到客户端的名称没有问题。然而,一位同事刚刚注意到我们正在以文本/纯文本形式发送电子邮件。会不会是某些电子邮件客户端会识别 HTML 而其他人不会...现在测试。
  • 如果电子邮件以text/plain 发送,而实际上是text/htmlmultipart,则内容类型可能是个问题。在任何体面的邮件程序库中,这应该是(半)自动设置的。不管怎样,看看this examplethis forum post。设置额外的 MIME 参数 head_charsettext_charsethtml_charset 可能会成功。您有可用于测试的开发服务器吗?
  • Content-type 不应该对 From/To 标头编码产生任何影响。但是,这可能是收件人的邮件客户端的问题。您是否碰巧知道他们使用哪个客户端来查看消息?看起来它正在解码它,但由于某种原因显示编码值。电子邮件地址不包含任何非 ASCII,是吗?

标签: php email character-encoding


【解决方案1】:

您是否尝试将base64_encode 替换为utf8_encode

我会尝试替换:

$from = '=?UTF-8?B?'.base64_encode($email['from_name']).'?= <'.$email['from_email'].'>';
$to = '=?UTF-8?B?'.base64_encode($email['to_name']).'?= <'.$email['to_email'].'>';

与:

$email['from_name'] = utf8_encode($email['from_name']);
$email['to_name'] = utf8_encode($email['to_name']);

$from = $email['from_name'].' <' . $email['from_email'] . '>';
$to = $email['to_name']) . ' <' . $email['to_email'] . '>';

可能值得一试...

detect_encoding 也有帮助 (http://php.net/mb_detect_encoding/)?

【讨论】:

  • 嘿,我无法再访问此代码,因此无法验证这是否有帮助。感谢您的回复,希望它可以帮助将来的人!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 2013-12-02
  • 2012-12-27
  • 1970-01-01
  • 2019-09-06
  • 2012-01-02
  • 1970-01-01
相关资源
最近更新 更多