PHPMailerの文字エンコードの問題


188

PHPMailerを使用して登録、アクティベーションを送信しようとします。etcユーザーへのメール:

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

$messageはラテン文字が含まれています。残念ながら、すべてのウェブメール(gmail、webmail.mydomain.org、emailaddress.domain.xx)は異なるコーディングを使用しています。

すべてのメールボックスでまったく同じメールを表示するために、UTF-8コーディングを強制的に使用するにはどうすればよいですか?

メールヘッダーの幅を変換しようとしましたmb_convert_encoding()が、うまくいきませんでした。


上記のCharSetの大文字化はbovenderによって変更されました。
Gogowitsch 2016年

回答:


472

100%確信している$ messageにISO-8859-1が含まれている場合は、Davidが言うようにutf8_encodeを使用できます。それ以外の場合は、$ messageでmb_detect_encodingおよびmb_convert_encodingを使用し ます。

また注意してください

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

置き換える必要があります:

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

そして、配置(後のクラスのインスタンス化new)。プロパティは大文字と小文字を区別します!リストと正確なスペルについては、PHPMailerのドキュメントをご覧ください。

また、PHPMailerのデフォルトのエンコーディングは8bit、UTF-8データで問題になる可能性があります。これを修正するには、次のようにします。

$mail->Encoding = 'base64';

'quoted-printable'おそらくこれらのケースでも動作することに注意してください(そしておそらく'binary')。詳細については、RFC1341-Content-Transfer-Encodingヘッダーフィールドをご覧ください。


35
これはすごく古いので誰かが気にしているかどうかわかりませんが、これを機能させるには$ mail-> Encoding = "base64"を追加する必要がありました
Andrew Revak

5
@AndrewRevakあなたは一日を救った!:)
carla

3
@AndrewRevak素晴らしいもの!それはそれを解決したものです。
BernardA

mb_detect_encodingとmb_convert_encodingの使用は良かったでしょう。
BluE

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

$mail -> CharSet = "UTF-8";$mail = new PHPMailer();スペースなしで後でなければなりません!

これを試して

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

5
私はこの記事を読みやすくするために更新しましたが、opの質問は2年前にすでに回答されています!そして、その受け入れられた回答者はすでにこれを含んでいた。
Dwza 2015

5

パーティーに遅れてすみません。サーバー構成によっては、文字小文字 utf-8で厳密に指定する必要がある場合があります。指定しない場合は無視されます。ここで解決策を探していて、上記の回答のどれも役に立たない場合は、これを試してください:

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

置き換えられるべきです:

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



3

óになりました。$ mail-> Subject / w PHPMailer。

だから私にとって完全な解決策は:

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

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

それが役に立てば幸い。


1

上記のいずれでも機能せず、メールが次のようになる場合ª הודפסה ×•× ×©×œ

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

0

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

---この行は

$mail = new PHPMailer(); line.

pff ..


はい、それは正しいです。オブジェクトのインスタンス化の後に配置する必要があります。


これは質問に対する答えを提供しません。批評したり、著者に説明を要求したりするには、投稿の下にコメントを残します。自分の投稿にはいつでもコメントできます。十分な評判得られれ、どの投稿にもコメントできます。
piet.t 2015年

この問題に対する批判や説明のリクエストではありません。正解は次のとおりです。$ mail = new PHPMailer(); $ mail-> CharSet = 'UTF-8';
Nikos Kapetanakos 2015年

何も追加されていないので、ホリアンの回答に対するコメントのように見えます。
piet.t 2015年

charSetプロパティを使用すると、機能しません。正しいのはCharSetです。ケースが違います。
Nikos Kapetanakos 2015年

では、なぜ正しい答えを出すのではなく、間違った答えを引用するのでしょうか。しかし、それもすでにあるので、何を追加する必要がありますか?
piet.t 2015年

0

最も簡単な方法は、CharSetをUTF-8に設定することです。

$mail->CharSet = "UTF-8"

@NickZuber編集のために正確な行があります。元の質問ではそれほど正確ではありませんでした...
Mr Tsjolder

0

PHPMailerクラスを使用してメールを送信する際の文字エンコーディングの問題を回避するために、次のPhpコードでわかるように、 "CharSet"パラメータを使用してUTF-8文字エンコーディングで送信するように設定できます。

$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"; ---この行は$ mail = new PHPMailer();の下にあるはずです。ライン。

pff ..

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.