2010-02-15 15 views
25

Ho problemi con i caratteri stranieri quando invio un messaggio di posta elettronica. Qualcuno potrebbe consigliarmi su cosa fare. Penso che il problema potrebbe essere una delle tre cose.Codifica e-mail PHP?

1) La codifica della pagina HTML non è corretta. (Ciò influenzerebbe i dati POST dal modulo?) 2) La funzione di posta non ha alcuna codifica. Quindi il programma non sa come leggerlo. (Molto probabilmente) 3) Il file stesso non ha la codifica giusta e quindi sta creando problemi. (Probabilmente abbastanza improbabile)

Esistono altre possibili cause?

Sto cercando di eliminarli 1 per 1 finché non trovo il problema. Penso che l'opzione 2 sia la causa più probabile. Come aggiungo la corretta codifica universale a una funzione di posta?

Questo è quello che ho al momento.

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

Sono attualmente a conoscenza che la forma non invia i caratteri polacchi o svedesi.

sarei molto grato se qualcuno potesse segnalare eventuali altre possibili cause e dimmi cosa codifica ho bisogno di usare per inviare e-mail.

Grazie mille.

risposta

28

Per quanto ne so, PHP non supporta UTF-8 come codifica predefinita per le sue stringhe. È necessario utilizzare le funzioni di codifica/gestione rilevanti per la codifica che si preferisce.

Aggiungete anche un 'Content-Type: text/html; charset = utf-8' alle vostre intestazioni di e-mail in modo che i client di e-mail mostrino correttamente i caratteri (o sostituiscano con la vostra codifica di scelta).

+9

per le email testuali (non in html) utilizzare: 'Content-Type: text/plain; charset = utf-8' –

+0

Potete per favore inserire il codice? –

20

Non è stato specificato il tipo e la codifica del contenuto. Prova questo:

$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

Utilizzare un wrapper di posta PHP, salverà la sanità mentale (parlando dall'esperienza qui). Ad esempio, PHPMailer consente di impostare la codifica e-mail in uscita e crea il messaggio per te.

Inoltre, utilizzare UTF-8; al giorno d'oggi è quasi universalmente supportato e copre tutti i personaggi di cui avresti mai avuto bisogno.

4

Io uso il seguente codice:

$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

c'è un motivo specifico per cui usi \ n \ r \ n invece di \ r \ n dietro "Content-Transfer-Encoding: 8bit"? – Lexib0y

+0

probabilmente appena copiato da un file di esempio, e ha funzionato :) – Atara

6

In aggiunta a quanto detto in precedenza, non è obbligatorio per inviare la posta in HTML per essere in grado di utilizzare UTF-8, si può anche formattarla come semplice testo in intestazioni:

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

Usa questo codice

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

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

+1

Potresti dirmi per favore perché usi la codifica di trasferimento 7 bit, come spesso vedo 8 bit? – Lexib0y

+0

Da quello che ho trovato, 7bit è l'impostazione predefinita per la posta elettronica, in quanto alcuni client e server di posta molto vecchi non possono gestire 8bit. L'invio di un preventivo quotato a 7 bit sta semplicemente giocando sul sicuro. Detto questo, è possibile inviare 8bit iso-8859-1 o 8bit utf-8 senza problemi. – Adrian

+0

+1 alla base64_encode() sull'oggetto. Non ci avevo mai pensato prima. Grazie – Alexandre

1

Uso questo codice per risolvere il problema con la codifica greca nella vecchia posta Horde.

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