2012-12-21 22 views
5

Tôi đang sử dụng Zend_Mail và muốn tùy chỉnh tên người gửi.Tên người gửi UTF-8 trong Zend_Mail?

Tôi muốn tên người gửi là Foobar 爱 你 Ryan (nơi 'Ryan' được thay thế bằng tên người nhận và 爱 你 được thay thế bằng bản dịch cho 'yêu' trong ngôn ngữ của người nhận, just like CD Baby does).

Tôi đã thử base64_encodemb_encode_mimeheader() và những thứ khác như:

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

Nó tạo này là người gửi: '=?UTF-8?B?RXh0cmFidXjniLHkvaByY3dhbHNoQGV4dHJhYnV4LmNvbQ==?= <[email protected]>'

Và sau đó xuất hiện trong Gmail của tôi như (unknown sender).

Bất kỳ ý tưởng nào?

+1

Bạn có thể đăng mã thực sự đặt trường tiêu đề email từ:? – Asaph

+0

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

+0

Gần đây nhất tôi đã thử điều này: '$ senderName =" =? UTF-8? B? " . base64_encode ($ email-> getFromName()). "? ="; $ mail-> clearFrom(); $ mail-> setFrom ($ email-> getFrom(), $ senderName); 'đó cũng là điều mà Arda cũng đề xuất. – Ryan

Trả lời

1

Tôi ước gì tôi đã thử điều này trước đây: khi tôi mã cứng chuỗi Trung Quốc làm tên người gửi (sử dụng ký tự utf8), nó hoạt động tốt. (Tôi đã thử nghiệm trong Gmail chỉ.)

Vì vậy, con đường tôi đã đi xuống đã bị nhầm lẫn.

Tôi cần tìm hiểu lý do tại sao tên người gửi được tạo động bao gồm các ký tự utf8 không hoạt động khi chuỗi tiếng Trung được mã hóa cứng hoạt động. Nhưng đó có vẻ là một câu hỏi khác.

+0

'$ recipientCleaned = str_replace ('@', $ translator-> translate ('at'), $ recipient);' làm cho nó hoạt động. – Ryan

2

Đối với tôi, giải pháp duy nhất làm việc là như sau: Như bạn muốn thiết lập đối tượng utf8 trong một vụ án php sendmail thông thường, bạn có thể làm cho một utf8 ghi nhận chuỗi base64 như thế này:

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

Với giải pháp này mọi thứ đều hoạt động như một sự quyến rũ.

0

Đây là một câu hỏi hay và câu trả lời là tốt - nhưng ZendFramework nâng cao và các giao diện được tham chiếu trở nên không may lỗi thời.

Vì vậy, đây là giải pháp tương tự, nhưng thử nghiệm để làm việc tốt như tháng/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); 
} 

Cơ sở cho tất cả điều này thực sự là ở đây - nó là tốt để đọc, do đó bạn biết những gì đang xảy ra : RFC2047 https://www.ietf.org/rfc/rfc2047.txt

Các vấn đề liên quan