在Zend_Mail中如何设置UTF-8发件人名称?

5
我正在使用Zend_Mail并希望自定义发件人名称。
我想让发件人名称为FooBar爱你Ryan(其中“Ryan”将被替换为收件人姓名,“爱你”将被替换为收件人语言中的“loves”,就像CD Baby一样)。
我尝试了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)。你有什么想法吗?

1
您能发布实际设置“发件人:”电子邮件头字段的代码吗? - Asaph
$sendername='=?UTF-8?B?'.base64_encode($sendername).'?='; - Mert Emir
最近我一直在尝试这个:$senderName = "=?UTF-8?B?" . base64_encode($email->getFromName()) . "?="; $mail->clearFrom(); $mail->setFrom($email->getFrom(), $senderName);,这也是 Arda 建议的。 - Ryan
3个回答

2

对我来说,唯一有效的解决方案是以下内容: 在通常的PHP发送邮件情况下,您可以设置utf8主题,然后创建一个像这样的utf8注释base64字符串:

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

使用这个解决方案,一切都运行得非常流畅。


1
我希望早点尝试这个方法:当我将中文字符串硬编码为发件人名称(使用utf8字符),它可以正常工作。(我只在Gmail中进行了测试。)
所以,我一直走的路是错误的。
我需要弄清楚为什么由utf8字符组成的动态生成的发件人名称无法正常工作,而硬编码的中文字符串可以。但这似乎是一个不同的问题。

$recipientCleaned = str_replace('@', $translator->translate(' at '), $recipient); 已经生效。 - Ryan

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


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