PHPMailerを6.0.7から6.1.4にバージョンアップしたところ、
件名が文字化けした(というか日本語表示がうまく処理できなくなった)ので調査しました。
検証コード
<?php
require 'vendor/autoload.php';
use PHPMailer\PHPMailer\PHPMailer;
$mail = new PHPMailer();
$mail->SMTPDebug = 2;
$mail->isMail();
$mail->Host = '127.0.0.1';
$mail->Encoding = "7bit";
$mail->CharSet = 'ISO-2022-JP';
$mail->setFrom('test_from@example.com', mb_encode_mimeheader('FULLW-FROM'));
$mail->Subject = mb_encode_mimeheader('FULLW-SUBJECT');
$mail->Body = 'FULLW-BODY';
$mail->addAddress('test_to@example.com');
$mail->isHTML(false);
$mail->send();
少なくともPHPMailer 6.0.7以前では、メールヘッダに日本語を送信するために
件名等をmb_encode_mimeheader
で変換する必要がありました。
参考:日本語メールの仕組み
https://sendgrid.kke.co.jp/blog/?p=10958
検証結果
PHPMailer 6.0.7
Subject: FULLW-SUBJECT
Received: by app.example.com (Postfix, from userid 1000)
id 1A4B42E157A; Wed, 22 Jan 2020 18:21:34 +0900 (JST)
To: test_to@example.com
Subject: =?UTF-8?B?77ym77y177ys77ys77y377yN77yz77y177yi77yq77yl77yj77y0?=
X-PHP-Originating-Script: 0:PHPMailer.php
Date: Wed, 22 Jan 2020 18:21:34 +0900
From: =?UTF-8?B?77ym77y177ys77ys77y377yN77ym77yy77yv77yt?= <test_from@example.com>
Message-ID: <ReFYcsIbmzkYl7kzQVqcJHLhrcbf2KxJ5PHVYKu2k@app>
X-Mailer: PHPMailer 6.0.7 (https://github.com/PHPMailer/PHPMailer)
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
FULLW-BODY
PHPMailer 6.1.4
Subject: =?UTF-8?B?77ym77y177ys77ys77y377yN77yz77y177yi77yq77yl77yj77y0?=
Received: by app.example.com (Postfix, from userid 1000)
id F32282E1579; Wed, 22 Jan 2020 18:18:07 +0900 (JST)
To: test_to@example.com
Subject: =?us-ascii?Q?=3D=3FUTF-8=3FB=3F77ym77y177ys77ys77y377yN77yz7?= =?us-ascii?Q?7y177yi77yq77yl77yj77y0=3F=3D?=
X-PHP-Originating-Script: 0:PHPMailer.php
Date: Wed, 22 Jan 2020 18:18:07 +0900
From: =?UTF-8?B?77ym77y177ys77ys77y377yN77ym77yy77yv77yt?= <test_from@example.com>
Message-ID: <tGMMwDmGQjcmzuOcScE3gGXWoqqwYbZ7SR6ALGYE@app>
X-Mailer: PHPMailer 6.1.4 (https://github.com/PHPMailer/PHPMailer)
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
FULLW-BODY
PHPMailer 6.1.4では件名がうまく日本語表示できなくなっています。
PHPMailerのソースを調べてみましたが、この文字化けは、
$mail->isMail();
を設定したときに発生しました。
($mail->isSMTP();
では発生せず)
GitHub Issueで問い合わせ
非互換になるので、PHPMailerのGithub Issueで問い合わせたところ、
mb_encode_mimeheaderで変換する必要はないとの回答。
https://github.com/PHPMailer/PHPMailer/issues/1945
しかしながら、mb_encode_mimeheaderをしないと、この検証コードでは
PHPMailer 6.0.7でも6.1.4でも件名が文字化けしてしまう。
解決方法
CharSetをISO-2022-JPからUTF-8にすれば文字化けしないです。
<?php
require 'vendor/autoload.php';
use PHPMailer\PHPMailer\PHPMailer;
$mail = new PHPMailer();
$mail->SMTPDebug = 2;
$mail->isMail();
$mail->Host = '127.0.0.1';
$mail->CharSet = 'UTF-8';
$mail->setFrom('test_from@example.com', 'FULLW-FROM');
$mail->Subject = 'FULLW-SUBJECT';
$mail->Body = 'FULLW-BODY';
$mail->addAddress('test_to@example.com');
$mail->isHTML(false);
$mail->send();
旧メーラーに対応させるため、ISO-2022-JPでメールを送信してきたが、そろそろUTF-8に対応させても良いかも。
参考:メールに関するよくある誤解 その2
https://sendgrid.kke.co.jp/blog/?p=8400