Come faccio a inviare messaggi di posta elettronica con contenuti in arabo tramite la funzione elettronica di PHP?
Domanda
Sto avendo una sfida con l'invio di messaggi di posta elettronica con contenuti in arabo usando la funzione elettronica di PHP. Diciamo che ho questo semplice stringa arabica:
بريد
Ho provato diversi modi per utilizzare le intestazioni, ma il contenuto email tutti ancora finire con qualcosa di simile: X*X1X(X1Y X/
. Tuttavia, l'oggetto del messaggio è codificato correttamente se uso i caratteri arabi (grazie al base64_encode, vedi funzione qui sotto)
Ecco una delle funzioni e-mail che ho provato
function sendSimpleMail($to,$from,$subject,$message) {
$headers = 'MIME-Version: 1.0' ."\r\n";
$headers .= 'To: '.$to ."\r\n";
$headers .= 'From: '.$from . "\r\n";
$headers .= 'Content-type: text/plain; charset=UTF-8; format=flowed' . "\r\n";
$headers .= 'Content-Transfer-Encoding: 8bit'."\r\n";
mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=',$message, $headers);
}
Tutti i suggerimenti su modi alternativi per raggiungere questo obiettivo?
Soluzione
Purtroppo, la codifica 8bit
non è affidabile in e-mail. Molti agenti di trasporto di posta saranno rimuovere la punta superiore di ogni byte nel corpo del messaggio. بريد
è "\xD8\xA8\xD8\xB1\xD9\x8A\xD8\xAF"
in UTF-8 byte; rimuovere la punta in alto da quelle byte e si ottiene "X(X1Y\nX/"
ASCII.
Il modo per ottenere caratteri non ASCII in un corpo di posta è quello di impostare Content-Transfer-Encoding
a uno o base64
quoted-printable
, e la codifica il corpo con base64_encode
o quoted_printable_encode
, rispettivamente.
(quoted-printable
è meglio se la posta è in gran parte ASCII, poiché conserva la leggibilità in forma codificata ed è più efficiente per ASCII. Se tutta la posta è l'arabo, base64
sarebbe probabilmente la scelta migliore.)
Altri suggerimenti
$boundary = uniqid(rand(), true);
$headers = "From: $from\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/alternative; boundary = $boundary\n";
$headers .= "This is a MIME encoded message.\n\n";
$headers .= "--$boundary\n" .
"Content-Type: text/plain; charset=UTF-8 \n" .
"Content-Transfer-Encoding: base64\n\n";
$headers .= chunk_split(base64_encode($plaintext));
$headers .= "--$boundary\n" .
"Content-Type: text/html; charset=ISO-8859-1\n" .
"Content-Transfer-Encoding: base64\n\n";
$headers .= chunk_split(base64_encode($msg));
$headers .= "--$boundary--\n" .
mail($address, $subject, '', $headers);
Questo funziona per me.
Prova questo
$headers .= 'From: =?UTF-8?B?'.base64_encode($from). "\r\n";
Il tuo codice funziona per me così come sono.
Sei sicuro che $message
contiene una stringa UTF-8 valida?