2012-12-21 6 views
5

Ich verwende Zend_Mail und möchte den Absendernamen anpassen.UTF-8 Absender Name in Zend_Mail?

Ich möchte der Absendername FooBar 爱 你 Ryan (für ‚liebt‘ wo ‚Ryan‘ wird ersetzt mit dem Empfängernamen und 爱 你 wird in der Sprache des Empfängers, just like CD Baby does mit der Übersetzung ersetzt) ​​werden.

habe ich base64_encode und mb_encode_mimeheader() und andere Dinge ausprobiert wie:

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'); 

Es erzeugt diese als Absender: '=?UTF-8?B?RXh0cmFidXjniLHkvaByY3dhbHNoQGV4dHJhYnV4LmNvbQ==?= <[email protected]>'

Und dann, die als (unknown sender) in meiner Google Mail angezeigt wird.

Irgendwelche Ideen?

+1

Können Sie den Code posten, der das 'From:' E-Mail-Header-Feld tatsächlich festlegt? – Asaph

+0

$ sendername = '=? UTF-8? B?'. Base64_encode ($ sendername). '? ='; –

+0

Zuletzt habe ich das versucht: '$ senderName =" =? UTF-8? B? " . base64_encode ($ email-> getFromName()). "? ="; $ mail-> clearFrom(); $ mail-> setFrom ($ email-> getFrom(), $ senderName); 'was genau das ist, was Arda vorgeschlagen hat. – Ryan

Antwort

1

Ich wünschte, ich hätte dies früher versucht: Wenn ich die chinesische Zeichenfolge als Absender-Name (mit utf8 Zeichen) hart Code, funktioniert es gut. (Ich habe nur in Google Mail getestet.)

Also der Weg, den ich gegangen war, war falsch.

Ich muss herausfinden, warum ein dynamisch generierter Absendername, bestehend aus utf8 Zeichen, nicht funktioniert, wenn eine hart codierte chinesische Zeichenfolge tut. Aber das scheint eine andere Frage zu sein.

+0

'$ recipientCleaned = str_replace ('@', $ übersetzer-> translate ('at'), $ recipient);' hat es geschafft. – Ryan

2

Für mich ist die einzige Lösung arbeitete, war die folgende: Wie Sie UTF-8-Thema in einer gewöhnlichen PHP send Fall gesetzt würde, Sie eine UTF-8-base64 String bemerkt wie diese machen kann:

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

Mit dieser Lösung Alles funktionierte wie ein Zauber.

0

Das ist eine gute Frage und die Antworten sind gut - aber ZendFramework Advanced und die referenzierten Interfaces wurden leider veraltet.

So, hier ist die gleiche Lösung, aber fein ab Juni/2017 arbeiten getestet:

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('[email protected]', self::hcvt('Sender 日本語も')); 
    $mail->addTo('[email protected]', 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); 
} 

Die Grundlage für das alles wirklich hier ist - es ist gut zu lesen, damit Sie wissen, was los ist, : RFC2047 https://www.ietf.org/rfc/rfc2047.txt