2010-02-15 9 views
25

Ich habe Probleme mit fremden Zeichen beim Senden einer E-Mail. Könnte mir jemand raten, was zu tun ist. Ich denke, das Problem könnte eines von drei Dingen sein.PHP-E-Mail-Codierung?

1) Die HTML-Seitencodierung ist falsch. (Würde dies die Post-Daten aus dem Formular beeinflussen?) 2) Die Mail-Funktion hat keine Codierung. Daher weiß das Programm nicht, wie man es liest. (Am wahrscheinlichsten) 3) Die Datei selbst hat nicht die richtige Codierung und macht damit Probleme. (Wahrscheinlich ziemlich unwahrscheinlich)

Gibt es noch andere mögliche Ursachen?

Ich versuche, diese 1 nach 1 zu klopfen, bis ich das Problem finde. Ich denke, dass Option 2 die wahrscheinlichste Ursache ist. Wie füge ich die richtige - universelle Codierung zu einer Mailfunktion hinzu?

Dies ist, was ich im Moment habe.

$mail_sent = mail($client_email, $title, $message, "From: {$visitor_email}"); 

Ich bin derzeit bewusst, dass Form nicht polnische oder schwedische Zeichen sendet.

Ich wäre sehr dankbar, wenn jemand andere mögliche Ursachen aufzeigen und mir mitteilen könnte, welche Kodierung ich verwenden muss, um E-Mails zu versenden.

Vielen Dank.

Antwort

28

Soweit ich weiß, unterstützt PHP UTF-8 nicht als Standardcodierung für seine Strings. Sie müssen die relevanten Codierungs-/Verarbeitungsfunktionen für die gewünschte Codierung verwenden.

Fügen Sie auch einen 'Content-Type: text/html; charset = utf-8' zu Ihren E-Mail-Headern hinzu, damit die E-Mail-Clients die Zeichen korrekt anzeigen (oder durch Ihre bevorzugte Kodierung ersetzen).

+9

für textbasierte E-Mails (nicht in html) verwenden: 'Content-Type: text/plain; charset = utf-8' –

+0

Können Sie bitte den Code posten? –

20

Sie haben den Typ und die Codierung Ihres Inhalts nicht angegeben. Versuchen Sie folgendes:

$headerFields = array(
    "From: {$visitor_email}", 
    "MIME-Version: 1.0", 
    "Content-Type: text/html;charset=utf-8" 
); 
$mail_sent = mail($client_email, $title, $message, implode("\r\n", $headerFields)); 
2

eine PHP-Mail-Wrapper verwenden, wird es retten Ihre geistige Gesundheit (spreche aus Erfahrung hier). Beispiel: PHPMailer ermöglicht das Festlegen der Codierung ausgehender E-Mails und das Erstellen der Nachricht für Sie.

Verwenden Sie auch UTF-8; Es wird heutzutage fast universell unterstützt und deckt alle Charaktere ab, die Sie jemals brauchen würden.

4

Ich verwende den folgenden Code ein:

$text = ""; 
    $text .= "<html>\n"; 
    $text .= "<body style=\"font-family:Arial; \">\n"; 

    $text .= "<b>Add Your text here . . .</b>"; 
    $text .= date("d.m.Y") . " <br><br>\n\n"; 

    $text .= "</body>\n"; 
    $text .= "</html>\n"; 

$headers = 'From: ' . $myEmail . "\r\n"; 
$headers .= 'To: ' . $depEmail . "\r\n";  
$headers .= 'Return-Path: ' . $myEmail . "\r\n"; 
$headers .= 'MIME-Version: 1.0' ."\r\n"; 
$headers .= 'Content-Type: text/HTML; charset=ISO-8859-1' . "\r\n"; 
$headers .= 'Content-Transfer-Encoding: 8bit'. "\n\r\n"; 
$headers .= $text . "\r\n"; 

set_time_limit(30); 
if (!mail('', 'Demande information', '', $headers)) { 
    Alert(...) 
+1

gibt es einen bestimmten Grund, dass Sie \ n \ r \ n anstelle von \ r \ n hinter dem "Content-Transfer-Encoding: 8bit" verwenden? – Lexib0y

+0

wahrscheinlich nur aus einer Beispieldatei kopiert, und es hat funktioniert :) – Atara

6

Zusätzlich zu dem, was bereits gesagt wurde, ist es nicht zwingend notwendig, die E-Mails in HTML senden zu können, verwenden UTF-8, können Sie diese auch formatiert werden als einfacher Text in den Headern:

'Content-Type: text/plain;charset=utf-8' 
6

Verwenden Sie diesen Code

function mail_send($arr) 
{ 
    if (!isset($arr['to_email'], $arr['from_email'], $arr['subject'], $arr['message'])) { 
     throw new HelperException('mail(); not all parameters provided.'); 
    } 

    $to   = empty($arr['to_name']) ? $arr['to_email'] : '"' . mb_encode_mimeheader($arr['to_name']) . '" <' . $arr['to_email'] . '>'; 
    $from  = empty($arr['from_name']) ? $arr['from_email'] : '"' . mb_encode_mimeheader($arr['from_name']) . '" <' . $arr['from_email'] . '>'; 

    $headers = array 
    (
     'MIME-Version: 1.0', 
     'Content-Type: text/html; charset="UTF-8";', 
     'Content-Transfer-Encoding: 7bit', 
     'Date: ' . date('r', $_SERVER['REQUEST_TIME']), 
     'Message-ID: <' . $_SERVER['REQUEST_TIME'] . md5($_SERVER['REQUEST_TIME']) . '@' . $_SERVER['SERVER_NAME'] . '>', 
     'From: ' . $from, 
     'Reply-To: ' . $from, 
     'Return-Path: ' . $from, 
     'X-Mailer: PHP v' . phpversion(), 
     'X-Originating-IP: ' . $_SERVER['SERVER_ADDR'], 
    ); 

    mail($to, '=?UTF-8?B?' . base64_encode($arr['subject']) . '?=', $arr['message'], implode("\n", $headers)); 
} 

aus: http://php.net/manual/en/function.mail.php

+1

Können Sie mir bitte sagen, warum Sie 7-Bit-Transfer-Codierung verwenden, wie ich oft 8bit sehe? – Lexib0y

+0

Von dem, was ich gefunden habe, ist 7bit der Standard für E-Mail, da einige wirklich alte Mail-Clients und Server nicht mit 8bit umgehen können. Mit 7bit quoted-printable wird nur auf Nummer sicher gegangen. Das heißt, Sie können wahrscheinlich 8bit iso-8859-1 oder 8bit utf-8 ohne Probleme senden. – Adrian

+0

+1 zum base64_encode() zum Thema. Daran habe ich noch nie gedacht. Vielen Dank – Alexandre

1

Ich benutze diesen Code, um das Problem mit griechischen Codierung in alten Horde Mail zu lösen.

$headers = 'From: ' . $youremail . "\r\n"; 
$headers .= 'To: ' . $to . "\r\n";  
$headers .= 'Return-Path: ' . $youremail . "\r\n"; 
$headers .= 'MIME-Version: 1.0' ."\r\n"; 
$headers .= 'Content-Type: text/HTML; charset=utf-8' . "\r\n"; 
$headers .= 'Content-Transfer-Encoding: 8bit'. "\n\r\n"; 
$headers .= $message . "\r\n"; 

mail('', 'Request from Site yoursite', '', $headers);