我正在使用Zend_Mail并希望自定义发件人名称。
我希望发件人姓名为 FooBar爱你Ryan (其中'Ryan'被收件人姓名取代,而爱被替换为收件人语言中'loves'的翻译,just like CD Baby does)。
我尝试过base64_encode和mb_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)
。
有什么想法吗?
答案 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