Zend_Mail中的UTF-8发件人名称?

时间:2012-12-21 20:48:31

标签: php zend-framework utf-8 zend-mail

我正在使用Zend_Mail并希望自定义发件人名称。

我希望发件人姓名为 FooBar爱你Ryan (其中'Ryan'被收件人姓名取代,而爱被替换为收件人语言中'loves'的翻译,just like CD Baby does)。

我尝试过base64_encodemb_encode_mimeheader()以及其他类似的事情:

mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
iconv_set_encoding("input_encoding", 'UTF-8');
iconv_set_encoding("output_encoding", 'UTF-8');
iconv_set_encoding("internal_encoding", 'UTF-8'); 
header('Content-Type:text/html; charset=' . 'UTF-8');

它会将其生成为发件人:'=?UTF-8?B?RXh0cmFidXjniLHkvaByY3dhbHNoQGV4dHJhYnV4LmNvbQ==?= <email@example.com>'

然后它在我的Gmail中显示为(unknown sender)

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

对我来说,唯一有效的解决方案如下: 当您在通常的php sendmail案例中设置utf8主题时,您可以像这样制作一个utf8注释的base64字符串:

$mail->addFrom($fromEmail, '=?utf-8?B?'.base64_encode($fromName).'?=');

通过这个解决方案,每件事都像魅力一样。

答案 1 :(得分:1)

我希望我之前尝试过这个:当我将中文字符串硬编码为发件人名称(使用utf8字符)时,它可以正常工作。 (我只在Gmail中测试过。)

所以我走的路是错的。

我需要弄清楚为什么动态生成的由utf8字符组成的发件人名称在硬编码的中文字符串时不起作用。但这似乎是一个不同的问题。

答案 2 :(得分:0)

这是一个很好的问题,答案很好 - 但ZendFramework先进,引用的接口变得不幸过时了。

所以这里是相同的解决方案,但截至2017年6月测试工作正常:

private static function ecvt($string)
{
    return mb_convert_encoding($string, 'ISO-2022-JP', 'UTF-8');
}
private static function hcvt($string)
{
    return "=?iso-2022-jp?B?" . base64_encode( self::ecvt($string) ) . "?=";
}
private function sendMail( )
{
    $mail = new Message();

    $content = 'Message body 日本語も';

    $mail->getHeaders()->addHeaderLine('Content-Type', 'text/plain; charset=ISO-2022-JP');

    $mail->setFrom('sender@acme.com', self::hcvt('Sender 日本語も') );
    $mail->addTo('receiver@acme.com', self::hcvt('Receiver 日本語も') );
    $mail->setSubject(self::hcvt('Some subject 日本語も'));

    $mail->setBody( self::ecvt($content) );
    $mail->setEncoding('ISO-2022-JP');

    // this is critical - it works around a bug in zendframework3 where
    // MIME encoding is botched in headers. By switching headers to ASCII,
    // I basically do the encoding myself.
    $mail->getHeaders()->setEncoding('ASCII');

    $this->mailTransport->send( $mail );
}

所有这一切的基础确实在这里 - 阅读很好,所以你知道发生了什么:RFC2047 https://www.ietf.org/rfc/rfc2047.txt