Wie sende ich UTF-8 E-Mails?


82

Wenn ich die E-Mail versende, werden in der E-Mail keine anderen Zeichen als Englisch angezeigt. Es zeigt sich wie folgt:

ä½ ™ ç ”Ÿä» ä »

Kann eigentlich wissen, was das verursacht? Selbst wenn ich versucht habe, dem Skript Inhaltstyp und Zeichensatz hinzuzufügen, wird dieser immer noch angezeigt.

ich benutzte Mail::Factory("mail");


2
Was benutzt du? einheimisch mail()oder Zend_Mailoder PHPMailer? Benötigen Sie einen Code der Factory-Methode!
Wesley van Opdorp

2
Sie müssen sich zusätzlich um die Ziel-E-Mail-Clients kümmern. Selbst wenn es Ihnen gelingt, die E-Mail in Ihrem E-Mail-Client korrekt anzuzeigen, bedeutet dies nicht, dass Ihr Kunde die E-Mail korrekt sieht. Am Ende erstelle ich immer HTML-E-Mails mit dem Zeichensatz-Header utf-8. Auf diese Weise zeigen die meisten E-Mail-Clients den Inhalt korrekt an.
Marco

@FlyBy: Ja, genau das, was ich tun möchte, zeigt den Inhalt mit dem Zeichensatz utf-8 an, aber ich kann die E-Mail immer noch nicht richtig sehen.
deepWebMie

Inhaltstyp und Zeichensatz sind genau das, was Sie benötigen, damit dies funktioniert, aber Sie müssen uns weitere Informationen geben. Können Sie uns den Code zeigen? und / oder die Quelle der resultierenden Nachricht? Sind Sie sicher, dass Ihre Daten korrekt utf8-codiert sind?
Tripleee

3
Hier ist mein Beispielcode: $mail = Mail::factory("mail"); $to = "me@abc.com"; $body = "好信"; $headers = array("Content-type =>"text/plain: charset=\"UTF-8","From" => "abc@abc.com","To" => "me@abc.com","Subject" => "Test Send Chinese mail-好信"); $mail->send($to, $headers, $body); Ist das richtig? Es zeigt nicht, was ich erwarte. Es sollte chinesische Wörter in Text, Kopfzeile oder sogar Betreff anzeigen.
deepWebMie

Antworten:


116

Sie können Ihrem Nachrichtentext den Header "Content-Type: text / html; charset = UTF-8" hinzufügen.

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

Wenn Sie die native mail()Funktion verwenden, ist das $ headers-Array der 4. Parameter mail($to, $subject, $message, $headers)

Wenn Sie PEAR Mail :: factory () verwenden, lautet der Code:

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

$mail = $smtp->send($to, $headers, $body);

hier ist mein Code $ mail = Mail :: factory ("mail"); $ to = "me@abc.com"; $ body = "好 信"; $ headers = array ("Content-type =>" text / plain: charset = "UTF-8", "From" => "abc@abc.com", "To" => "me@abc.com" , "Betreff" => "Test Send Chinese Mail- 好 信"); $ mail-> send ($ to, $ headers, $ body) Ist das richtig? Es zeigt nicht, was ich erwarte. Es sollte chinesische Wörter in Text, Kopfzeile oder sogar Betreff anzeigen.
deepWebMie

1
Welche E-Mail-Tools verwenden immer noch die 7-Bit-Übertragungscodierung?
Grodriguez

3
Der 4. Parameter für PHP mail()ist ein String, kein Array !!
Vladimir Panteleev

2
Stellen Sie sicher, dass Sie charset=UTF-8ohne Anführungszeichen schreiben UTF-8!
Mel_T

4
Nur verwenden, text/htmlwenn Sie eine E-Mail im HTML-Format senden. Für Klartext-E-Mails möchten Sie text/plain.
Stewart

34

Ich verwende einen eher angegebenen Zeichensatz (ISO-8859-2), da nicht jedes Mailsystem (zum Beispiel: http://10minutemail.com ) UTF-8-Mails lesen kann. Wenn Sie dies brauchen:

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

Ich habe eine andere Mailer-Funktion erstellt, da das Apple-Gerät die vorherige Version nicht gut lesen konnte.

function utf8mail($to,$s,$body,$from_name="x",$from_a = "info@x.com", $reply="info@x.com")
{
    $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);
}

2
Und was ist, wenn Sie versuchen, Inhalte zu senden, die in ISO-8859-2 nicht dargestellt werden können?!
Täuschung

4
$headers.= "From: =?utf-8?b?".base64_encode($from_name)."?= <".$from_a.">\r\n";Diese Zeile hat mein Problem gelöst, danke!
Julia

1
Betrachten Sie zitierte druckbare Codierung für die Lesbarkeit in Nur-Text-Mailern, es ist genauso einfach:'=?utf-8?Q?' . quoted_printable_encode($string) . '?='
Zitieren von Eddie

@ Julia Danke, meine auch.
fdrv

was ist mit cc und bcc?
Toskan

1

Wenn nicht HTML, UTF-8wird dies nicht empfohlen. koi8-rund windows-1251nur ohne probleme. Verwenden Sie also HTML-Mail.

$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);
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.