Jak wysłać wiadomość e-mail UTF-8?

83

Kiedy wysyłam e-mail, e-mail nie zawiera znaków innych niż angielski. Pokazuje jak poniżej:

ä½ ™ ç ”Ÿä» ä »

Może właściwie wiedzieć, co to powoduje? Nawet ja próbowałem dodać w skrypcie typ zawartości i kodowanie, ale nadal pokazuje to samo.

użyłem Mail::Factory("mail");

deepWebMie
źródło
2
Czego używasz? rodzimy mail()czy Zend_Maillub PHPMailer? Potrzebujesz kodu metody Factory!
Wesley van Opdorp
2
Musisz dodatkowo zadbać o docelowe klienty pocztowe. Nawet jeśli uda ci się poprawnie wyświetlić wiadomość e-mail w kliencie poczty e-mail, nie oznacza to, że klient zobaczy wiadomość poprawnie. W końcu zawsze tworzę e-maile html z nagłówkiem utf-8 charset. W ten sposób większość programów pocztowych poprawnie wyświetla zawartość.
Marco
@FlyBy: tak, to dokładnie to, co chcę zrobić, wyświetlić zawartość za pomocą zestawu znaków utf-8, ale nadal nie widzę poprawnie wiadomości e-mail.
deepWebMie
Typ zawartości i zestaw znaków są dokładnie tym, czego potrzebujesz, aby to działało, ale musisz podać nam więcej informacji. Możesz nam pokazać kod. i / lub źródło wynikowej wiadomości? Czy na pewno Twoje dane są poprawnie zakodowane w utf8?
tripleee
3
oto mój przykładowy kod: $mail = Mail::factory("mail"); $to = "[email protected]"; $body = "好信"; $headers = array("Content-type =>"text/plain: charset=\"UTF-8","From" => "[email protected]","To" => "[email protected]","Subject" => "Test Send Chinese mail-好信"); $mail->send($to, $headers, $body); Czy to jest poprawne? Nie pokazuje, czego się spodziewam. Powinien wyświetlać chińskie słowo w treści, nagłówku lub nawet temacie.
deepWebMie

Odpowiedzi:

116

Możesz dodać nagłówek „Content-Type: text / html; charset = UTF-8” do treści wiadomości.

$headers = "Content-Type: text/html; charset=UTF-8";

Jeśli używasz natywnej mail()funkcji $ headers, tablica będzie czwartym parametrem mail($to, $subject, $message, $headers)

Jeśli korzystasz z PEAR Mail :: factory () kod będzie:

$smtp = Mail::factory('smtp', $params);

$mail = $smtp->send($to, $headers, $body);
s.webbandit
źródło
oto mój kod $ mail = Mail :: factory ("mail"); $ to = "[email protected]"; $ body = "好 信"; $ headers = array ("Content-type =>" text / plain: charset = \ "UTF-8", "From" => "[email protected]", "To" => "[email protected]" , "Temat" => "Wyślij testową chińską pocztę- 好 信"); $ mail-> send ($ to, $ headers, $ body) Czy to prawda? Nie pokazuje, czego się spodziewam. Powinien wyświetlać chińskie słowo w treści, nagłówku lub nawet temacie.
deepWebMie
1
Które narzędzia poczty e-mail nadal używają 7-bitowego kodowania transferu?
Grodriguez
3
Czwarty parametr php mail()to ciąg znaków, a nie tablica !!
Vladimir Panteleev
2
Pamiętaj, aby pisać charset=UTF-8bez cytatów UTF-8!
Mel_T
4
Używaj tylko text/htmlwtedy, gdy wysyłasz wiadomość e-mail w formacie HTML. Dla zwykłych e-maili tekstowych chcesz text/plain.
Stewart
34

Używam raczej określonego zestawu znaków (ISO-8859-2), ponieważ nie każdy system pocztowy (na przykład: http://10minutemail.com ) może czytać wiadomości e-mail UTF-8. Jeśli potrzebujesz tego:

function utf8_to_latin2($str)
{
    return iconv ( 'utf-8', 'ISO-8859-2' , $str );
}
function my_mail($to,$s,$text,$form, $reply)
    {
        mail($to,utf8_to_latin2($s),utf8_to_latin2($text),
        "From: $form\r\n".
        "Reply-To: $reply\r\n".
        "X-Mailer: PHP/" . phpversion());
    }

Zrobiłem kolejną funkcję mailera, ponieważ urządzenie Apple nie mogło dobrze odczytać poprzedniej wersji.

function utf8mail($to,$s,$body,$from_name="x",$from_a = "[email protected]", $reply="[email protected]")
{
    $s= "=?utf-8?b?".base64_encode($s)."?=";
    $headers = "MIME-Version: 1.0\r\n";
    $headers.= "From: =?utf-8?b?".base64_encode($from_name)."?= <".$from_a.">\r\n";
    $headers.= "Content-Type: text/plain;charset=utf-8\r\n";
    $headers.= "Reply-To: $reply\r\n";  
    $headers.= "X-Mailer: PHP/" . phpversion();
    mail($to, $s, $body, $headers);
}

źródło
2
A co, jeśli próbujesz wysłać zawartość, której nie można przedstawić w ISO-8859-2 ?!
deceze
4
$headers.= "From: =?utf-8?b?".base64_encode($from_name)."?= <".$from_a.">\r\n";ta linia rozwiązała mój problem, dzięki!
Julia
2
Rozważ cytowane kodowanie do druku, aby zapewnić czytelność w przesyłkach pocztowych zawierających zwykły tekst, jest tak samo proste:'=?utf-8?Q?' . quoted_printable_encode($string) . '?='
Cytując Eddiego
@Julia Dzięki, moje też.
fdrv
co z DW i UDW?
Toskan
1

Jeśli nie HTML, UTF-8to nie jest zalecane. koi8-ri windows-1251tylko bez problemów. Więc używaj poczty html.

$headers['Content-Type']='text/html; charset=UTF-8';
$body='<html><head><meta charset="UTF-8"><title>ESP Notufy - ESP Сообщения</title></head><body>'.$text.'</body></html>';


$mail_object=& Mail::factory('smtp',
    array ('host' => $host,
        'auth' => true,
        'username' => $username,
        'password' => $password));
$mail_object->send($recipents, $headers, $body);
}
vml vml
źródło