もう済んだことですが、昨今セキュリティ対策が騒がれるようになったので記事にします。
これはある日のこと、自分のWordPressサイトで、PHPを8にした途端に起きました。
お問い合わせフォームから届くメールを、一部のメーラーで開くと、本文の前に Date や From といったヘッダーがそのまま並びます。
Gmailで開くと、普通のメールです。
PHP7に戻すと、そちらのメーラーでも直ります。
なんだこれは、と画面を二度見しました(;´Д`)
結局、いろいろ試した末に送信方法を変更することで解決できたので、同じ症状で困っている方のために残しておきます。
Outlookでメールヘッダーが本文に出てしまう
実際にどんな状態だったかというと、Outlookで受信したメールの本文が、こんな感じになっていました。
Date: Wed, 21 Oct 2026 14:19:14 +0000
From: =?UTF-8?B?44KI44Gj44GX...?= <ii@yws.tokyo>
Reply-To: ii@yws.tokyo
Message-ID: <...@yws.tokyo>
X-Mailer: PHPMailer 6.9.3
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
このメールは自動送信でお送りしています。
本来ならメールの裏側で処理されるはずの情報が、そのまま本文に出てきています。
しかも、日本語の件名が長いと、こんな文字列まで混ざることがありました。
=?UTF-8?B?ICLjgrXjg7zjg5Djg7zlvJXjgaPotorjgZflvozjga7jg4bjgrnjg4jpgIE=?=
=?UTF-8?B?5L+h44Gn44GZ44CCIg==?=
この =?UTF-8?B?...?= という文字列は、日本語などをメールのヘッダーで扱えるように変換したものです。
普通なら受信側で元の日本語に戻して表示してくれます。
ところが、今回の環境ではヘッダーの途中に余計な空行が入り、一部のメーラーが「ここから本文だ」と判断してしまったようです。
その結果、まだヘッダーの続きなのに、Date や From などが本文として表示されていました。
ちなみに、Gmailでは問題なく表示されていました。
Gmailで読めるからメールは正常、とは限らないんですね。
また、メールには X-Mailer: PHPMailer とありました。
WordPressのメール送信にはPHPMailerが使われているため、Contact Form 7だけの問題ではなく、wp_mail() を利用するほかのメールにも関係する可能性があります。
原因はPHP 8とメール送信時の改行処理?
最初はOutlook側の問題かと思いましたが、PHPを7に戻すと直るので、どうもそれだけではなさそうです。
調べていくうちに気になったのが、メールヘッダーの改行コードでした。
メールでは、改行に主に次の2種類が使われます。
\n:LF\r\n:CRLF
通常、メールのヘッダーと本文は空行で区切られています。
ところが、この区切りが意図しない場所に入ってしまうと、受信側がヘッダーの続きを本文だと解釈することがあります。
今回の環境では、PHP 8への変更に伴うPHPMailerの送信処理と、コアサーバー側のメール配送処理の組み合わせが影響していたと考えています。
コアサーバーではqmail系のメール配送環境が使われており、改行の扱いが問題になった可能性があります。
特に、日本語の長い件名が折り返される部分や、件名と次のヘッダーの境目で余計な空行が発生していました。
つまり、PHP 8そのものが悪いというより、メールを送る側と配送する側で、改行の扱いがうまくかみ合っていなかったということのようです。
ただし、サーバー内部の配送処理まで直接調査したわけではないので、これは今回の症状と検証結果から考えられる原因です。
最初に試した方法では直らなかった
原因が改行や文字コードにありそうだったので、まずはPHPMailerの初期化時に文字コード関連の設定を追加してみました。
add_action( 'phpmailer_init', function () {
mb_language( 'uni' );
mb_internal_encoding( 'UTF-8' );
} );
しかし、結果は変わらず。
考えてみれば、今回の問題は日本語そのものの文字コードというより、ヘッダーの区切り方にありそうなので、これだけでは解決しませんでした。
次に試したのが、ヘッダー内の \r\n を \n に置き換える方法です。
こちらは少し変化がありました。
件名の途中に入っていた余計な空行は消えたものの、今度は件名の直後でヘッダーが切れてしまいます。
結局、Date から下が本文に表示される症状はそのまま。
どうやらヘッダーを整えるだけでは足りず、PHPの mail() を通して送信する段階でも改行の扱いが変わっている可能性がありました。
なかなか一筋縄ではいきませんね……。
解決した方法:sendmailで直接送信する
最終的にうまくいったのが、PHPMailerの送信方法を mail() から sendmail に変更する方法です。
WordPressで使っているテーマの functions.php に、次のコードを追加しました。
子テーマを使っている場合は、子テーマ側に追加します。
add_action( 'phpmailer_init', function ( $phpmailer ) {
$phpmailer->Mailer = 'sendmail';
$phpmailer->Sendmail = '/usr/sbin/sendmail';
} );
やっていることは、PHPMailerに対してsendmail方式で送信するよう指定しているだけです。
この変更によって、今回の環境では問題のあったメールヘッダーが正常に処理されるようになりました。
PHPを8のままにしても、Outlookでメールが普通に読めます。
長い日本語の件名も、変な文字列が本文に出てくることはなくなりました。
ようやく解決です\(^o^)/
変更するときの注意点
この方法は、私が使っていたコアサーバーの環境で解決したものです。
/usr/sbin/sendmail はサーバーによって場所が異なる場合がありますし、sendmail方式が利用できない環境もあります。
そのため、別のサーバーでそのまま動くとは限りません。
また、functions.php の編集を間違えるとWordPressにエラーが出ることもあるので、変更前にはバックアップを取っておくのが安心です。
SMTP送信プラグインなどで別の送信方法を設定している場合も、既存の設定との兼ね合いに注意してください。
修正後は実際にメールを送って確認
コードを追加したら、お問い合わせフォームからテストメールを送信します。
私が確認したのは次の点です。
- Outlookなど、問題が出ていたメーラーで正常に表示されるか
DateやFromが本文に出てこないか- 長い日本語の件名が正しく表示されるか
- Gmailでもこれまでどおり受信できるか
設定を変更しただけでは直ったかどうか分からないので、実際にフォームから送り直して確認するのが確実です。
メールが届かなくなった場合は、sendmailのパスやサーバー側の設定も確認する必要があります。
まとめ:Gmailで正常でも安心できない
今回のトラブルは、コアサーバーでWordPressのPHPを8に変更したところ、一部のメーラーでメールヘッダーが本文に表示されるというものでした。
Gmailでは普通に読めるのに、Outlookではおかしくなるという、なんとも分かりにくい症状です。
いろいろ試した結果、私の環境ではPHPMailerの送信方法をsendmailに変更することで解決しました。
もちろん、同じような症状でも原因が違う場合はあります。
ただ、PHPのバージョンを変更した直後にメールの表示がおかしくなったなら、送信時の改行コードやメール配送方式を確認してみる価値はありそうです。
それにしても、Gmailで正常に見えていると、なかなか気づけない問題ですね。
同じような現象で困っている方の参考になれば幸いです。