Problemi di codifica dei caratteri di PHPMailer


190

Provo a usare PHPMailer per inviare la registrazione, l'attivazione. ecc. posta agli utenti:

require("class.phpmailer.php");
$mail -> charSet = "UTF-8";
$mail = new PHPMailer();
$mail->IsSMTP();  
$mail->Host     = "smtp.mydomain.org";  
$mail->From     = "name@mydomain.org";
$mail->SMTPAuth = true; 
$mail->Username ="username"; 
$mail->Password="passw"; 
//$mail->FromName = $header;
$mail->FromName = mb_convert_encoding($header, "UTF-8", "auto");
$mail->AddAddress($emladd);
$mail->AddAddress("mytest@gmail.com");
$mail->AddBCC('mytest2@mydomain.org', 'firstadd');
$mail->Subject  = $sub;
$mail->Body = $message;
$mail->WordWrap = 50;  
if(!$mail->Send()) {  
   echo 'Message was not sent.';  
   echo 'Mailer error: ' . $mail->ErrorInfo;  
}

Il $messagecontiene caratteri latini. Sfortunatamente tutta la webmail (gmail, webmail.mydomain.org, emailaddress.domain.xx) utilizza una codifica diversa.

Come posso forzare l'uso della codifica UTF-8 per mostrare esattamente la mia posta su tutte le caselle di posta?

Ho provato a convertire la larghezza dell'intestazione della posta mb_convert_encoding(), ma senza fortuna.


La capitalizzazione di CharSet sopra è stata modificata da bovender.
Gogowitsch,

Risposte:


476

Se sei sicuro al 100% $ message contenga ISO-8859-1 puoi usare utf8_encode come dice David. Altrimenti usa mb_detect_encoding e mb_convert_encoding su $ message.

Prendi anche nota

$mail -> charSet = "UTF-8"; 

Dovrebbe essere sostituito da:

$mail->CharSet = 'UTF-8';

E posto dopo l'istanza della classe (dopo il new). Le proprietà fanno distinzione tra maiuscole e minuscole! Consulta il documento PHPMailer per l'elenco e l'ortografia esatta.

Anche la codifica predefinita di PHPMailer è 8bitche può essere problematica con i dati UTF-8. Per risolvere questo problema puoi fare:

$mail->Encoding = 'base64';

Prendi nota che 'quoted-printable'probabilmente funzionerebbe anche in questi casi (e forse anche 'binary'). Per maggiori dettagli puoi leggere RFC1341 - Campo di intestazione Codifica trasferimento-contenuto .


35
Beh, non so se qualcuno se ne frega perché è vecchio ma pazzo, ma ho dovuto aggiungere $ mail-> Encoding = "base64" per farlo funzionare per me
Andrew Revak,

5
@AndrewRevak Hai salvato la giornata! :)
carla,

3
@AndrewRevak Great stuff! Questa è la cosa che l'ha risolto.
Bernard:

L'uso di mb_detect_encoding e mb_convert_encoding sarebbe stato bello.
BluE

26
$mail -> CharSet = "UTF-8";
$mail = new PHPMailer();

la linea $mail -> CharSet = "UTF-8";deve essere dopo $mail = new PHPMailer();e senza spazi!

prova questo

$mail = new PHPMailer();
$mail->CharSet = "UTF-8";

5
Ho aggiornato questo post per una migliore lettura, ma alla domanda dell'op era già stata data risposta 2 anni prima! E quello accettato era già incluso questo.
Dwza,

5

Ci scusiamo per il ritardo alla festa. A seconda della configurazione del server, potrebbe essere necessario specificare il carattere rigorosamente con lettere minuscole utf-8, altrimenti verrà ignorato. Prova questo se finisci qui alla ricerca di soluzioni e nessuna delle risposte sopra aiuta:

$mail->CharSet = "UTF-8";

dovrebbe essere sostituito con:

$mail->CharSet = "utf-8";


3
$mail = new PHPMailer();
$mail->CharSet = "UTF-8";
$mail->Encoding = "16bit";

3

Stavo diventando & oacute; in $ mail-> Oggetto / w PHPMailer.

Quindi per me la soluzione completa è:

// Your Subject with tildes. Example.
$someSubjectWithTildes = 'Subscripción España';

$mailer->CharSet = 'UTF-8';
$mailer->Encoding = 'quoted-printable';
$mailer->Subject = html_entity_decode($someSubjectWithTildes);

Spero che sia d'aiuto.


1

Quando non funziona quanto sopra, e ancora le mail sembrano ª הודפסה ×•× ×©×œ:

$mail->addCustomHeader('Content-Type', 'text/plain;charset=utf-8');
$mail->Subject = '=?UTF-8?B?' . base64_encode($subject) . '?=';;

0

@ $mail -> charSet = "UTF-8";

--- questa riga dovrebbe essere sotto

$mail = new PHPMailer(); line.

PFF ..


Si è corretto. Devi posizionarlo dopo l'istanza dell'oggetto.


Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti a un autore, lascia un commento sotto il suo post: puoi sempre commentare i tuoi post e una volta che avrai una reputazione sufficiente sarai in grado di commentare qualsiasi post .
piet.t,

Non è una richiesta di critica o chiarimento per questo problema. La risposta corretta è: $ mail = new PHPMailer (); $ mail-> CharSet = 'UTF-8';
Nikos Kapetanakos l'

Zo mi sembra un commento sulla risposta di Holian poiché non aggiunge nulla.
piet.t,

se usi la proprietà charSet non funzionerà. Quello corretto è CharSet. Il caso fa la differenza.
Nikos Kapetanakos l'

Bene, allora perché citi la risposta sbagliata invece di dare quella corretta? Ma anche quello è già lì, quindi cosa devi aggiungere?
piet.t,

0

Il modo più semplice per aiutarti è impostare CharSet su UTF-8

$mail->CharSet = "UTF-8"

@NickZuber La linea esatta è lì a causa di modifiche. Non era esattamente esatto nella domanda originale ...
Tsjolder,

0

Per evitare problemi di codifica dei caratteri nell'invio di e-mail utilizzando la classe PHPMailer possiamo configurarlo per inviarlo con la codifica dei caratteri UTF-8 usando il parametro "CharSet", come possiamo vedere nel seguente codice Php:

$mail = new PHPMailer();
$mail->From = 'midireccion@email.com';
$mail->FromName = 'Mi nombre';
$mail->AddAddress('emaildestino@email.com');
$mail->Subject = 'Prueba';
$mail->Body = '';
$mail->IsHTML(true);


// Active condition utf-8
$mail->CharSet = 'UTF-8';


// Send mail
$mail->Send();

-5

$ mail -> charSet = "UTF-8"; --- questa riga dovrebbe essere sotto $ mail = new PHPMailer (); linea.

PFF ..

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.