2012-12-21 13 views
5

Sto utilizzando Zend_Mail e voglio personalizzare il nome del mittente.Nome del mittente UTF-8 in Zend_Mail?

Voglio il nome del mittente di essere FooBar 爱 你 Ryan (dove 'Ryan' viene sostituito con il nome del destinatario e 爱 你 viene sostituito con la traduzione di 'ama' nella lingua del destinatario, just like CD Baby does).

Ho provato base64_encode e mb_encode_mimeheader() e altre cose come:

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

Esso genera questo come il mittente: '=?UTF-8?B?RXh0cmFidXjniLHkvaByY3dhbHNoQGV4dHJhYnV4LmNvbQ==?= <[email protected]>'

E poi che appare nel mio Gmail come (unknown sender).

Qualche idea?

+1

Puoi pubblicare il codice che imposta effettivamente il campo di intestazione dell'e-mail 'From:'? – Asaph

+0

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

+0

Più recentemente ho provato questo: '$ senderName =" =? UTF-8? B? " . base64_encode ($ email-> getFromName()). "? ="; $ mail-> clearFrom(); $ mail-> setFrom ($ email-> getFrom(), $ senderName) ;, che è anche quello che suggeriva Arda. – Ryan

risposta

1

Vorrei averlo provato prima: quando codifico la stringa cinese come il nome del mittente (usando i caratteri utf8), funziona perfettamente. (Ho provato solo in Gmail.)

Quindi il percorso che stavo andando giù era sbagliato.

Ho bisogno di capire perché un nome di mittente generato dinamicamente composto da utf8 caratteri non funziona quando fa una stringa cinese hard-coded. Ma questa sembra essere una domanda diversa.

+0

'$ recipientCleaned = str_replace ('@', $ traduttore-> translate ('at'), $ destinatario);' ha funzionato. – Ryan

2

Per me l'unica soluzione ha funzionato è stato il seguente: Come ci si imposta utf8 soggetto in un normale caso php sendmail, è possibile effettuare un'utf8 notato stringa Base64 come questo:

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

Con questa soluzione ogni cosa ha funzionato come un fascino.

0

Questa è una grande domanda e le risposte sono buone, ma ZendFramework è avanzato e le interfacce di riferimento sono diventate purtroppo obsolete.

Così qui è la stessa soluzione, ma testati per funzionare bene a partire da giugno/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); 
} 

Alla base di tutto questo è davvero qui - è bene leggere in modo da sapere cosa sta succedendo : RFC2047 https://www.ietf.org/rfc/rfc2047.txt

Problemi correlati