PHP中发送邮件时,发件人电子邮件和姓名的编码问题?

3
这个编码问题可能是由什么引起的?我是否正确地对头信息进行了编码,还是可能在其他地方引起的?
我在这里找到了一个类似的问题:PHP电子邮件主题编码问题,但从我所读到的内容来看,我认为我的做法是正确的。
基本上,有时我们的客户会发送用法语写的电子邮件。它可以工作,但偶尔会出现一些编码问题,我想知道我是否编码错误(我无法解决)。
$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(...)=?=]

感谢您的任何帮助 :)
编辑:客户的名称基本上使用与上述相同的字符。我的意思是,该电子邮件应该来自“安大略省的Clientnamé”。

1
我没有使用过 PEAR Mail,但就我所见,您的编码是正确的。也许是邮件客户端有问题?您能否获得整个电子邮件源代码以进行调试? - Viktor
1
顺便问一下,Base64编码部分(QXNzZW1ib...)的翻译是什么?和发件人姓名相同吗? - Viktor
是的,编码似乎是正确的。我通过base64_decode运行了字符串,没有问题地获取了客户端的名称。然而,我的一个同事刚刚注意到我们正在以text/plain格式发送电子邮件。可能有些电子邮件客户端会识别HTML,而其他人则不会……现在正在测试。 - Gazillion
是的,那不是问题所在。当他们的一些客户收到电子邮件时,所有的电子邮件头都会出现在邮件正文中。我不知道这究竟意味着什么(只有有时会发生...)。 - Gazillion
1
如果电子邮件实际上是text/htmlmultipart,但以text/plain的形式发送,则内容类型可能会成为问题。在任何体面的邮件库中,这应该被设置为(半)自动。无论如何,请查看此示例以及此论坛帖子。设置其他MIME参数head_charsettext_charsethtml_charset可能会奏效。您有可以用于测试的开发服务器吗? - Viktor
1
Content-type 对 From/To 头编码不应该有任何影响。但这可能是收件人的邮件客户端出了问题。你知道他们用什么客户端查看邮件吗?看起来它已经正确解码,但由于某种原因显示了编码值。这个电子邮件地址没有包含任何非 ASCII 字符,对吧? - angrychimp
1个回答

0
你尝试用utf8_encode替换base64_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/)可能会有所帮助?


嘿,我不再能够访问这段代码,因此无法验证它是否有帮助。不过还是谢谢你的回复,希望它能在未来帮到某个人! - Gazillion

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