10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PHPMailer 6.1で件名の日本語表示が失敗した件

Last updated at Posted at 2020-02-01

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

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?