Come faccio a inviare messaggi di posta elettronica con contenuti in arabo tramite la funzione elettronica di PHP?

StackOverflow https://stackoverflow.com/questions/2334935

  •  22-09-2019
  •  | 
  •  

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?

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top