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.