2012-12-21 8 views
5

Używam Zend_Mail i chcę dostosować nazwę nadawcy.Nazwa nadawcy UTF-8 w Zend_Mail?

chcę nazwa nadawcy być FooBar 爱 你 Ryan (gdzie „Ryan” zostanie zastąpiony nazwą odbiorcy i 爱 你 zostaje zastąpiony tłumaczenie dla „kocha” w języku odbiorcy, just like CD Baby does).

Próbowałem base64_encode i mb_encode_mimeheader() i inne rzeczy jak:

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

Generuje to jako nadawcy: '=?UTF-8?B?RXh0cmFidXjniLHkvaByY3dhbHNoQGV4dHJhYnV4LmNvbQ==?= <[email protected]>'

I wtedy pojawia się w moim Gmail jako (unknown sender).

Wszelkie pomysły?

+1

Czy możesz opublikować kod, który faktycznie ustawia pole nagłówka "Od:"? – Asaph

+0

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

+0

Ostatnio próbowałem tego: '$ senderName =" =? UTF-8? B? " . base64_encode ($ email-> getFromName()). "? ="; $ mail-> clearFrom(); $ mail-> setFrom ($ email-> getFrom(), $ nazwa_sendera); "to jest to, co zasugerował Arda. – Ryan

Odpowiedz

1

Żałuję, że nie próbowałem tego wcześniej: kiedy ciężko koduję chiński ciąg jako nazwę nadawcy (używając znaków utf8), to działa dobrze. (Testowałem tylko w Gmailu.)

Droga, którą szedłem, była w błędzie.

Muszę dowiedzieć się, dlaczego dynamicznie generowana nazwa nadawcy składająca się z znaków utf8 nie działa, gdy jest napisany na sztywno chiński ciąg znaków. Ale to chyba inne pytanie.

+0

'$ recipientCleaned = str_replace ('@', $ translator-> translate ('at'), $ recipient);' sprawiło, że działa. – Ryan

2

Dla mnie jedynym rozwiązaniem pracował był następujący: Jak można ustawić utf8 obiekt w zwykłym przypadku php sendmaila można dokonać utf8 zauważyć base64 ciąg tak:

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

Dzięki takiemu rozwiązaniu wszystko działało jak czar.

0

To jest świetne pytanie, a odpowiedzi są dobre - ale ZendFramework advanced i wymienione interfejsy stały się niestety przestarzałe.

Więc tutaj jest to samo rozwiązanie, ale przetestowane, aby działać poprawnie z czerwca/2017:

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

Podstawą to wszystko naprawdę jest tutaj - to jest dobre do czytania, więc wiesz, co się dzieje : RFC2047 https://www.ietf.org/rfc/rfc2047.txt