#【PHP】mb_send_mailでうまく改行されないときに気をつけること
###使用環境
- XAMPP 8.0 (PHP 8.0)
- windows 10
##背景
websiteを制作していてお問い合わせページから送られてきたメールで改行コードがそのまま出力される、改行できていないという事態が発生。
##原因
改行コード\r\n
をシングルクォーテーションで囲んでいたため、文字として出力されていた。
文字列を指定する最も簡単な方法は、引用符 (文字 ') で括ることです。
引用符をリテラルとして指定するには、バックスラッシュ () でエスケープする必要があります。 バックスラッシュをリテラルとして指定するには、二重 (\) にします。 それ以外の場面で登場するバックスラッシュは、すべてバックスラッシュそのものとして扱われます。 つまり、\r や \n といったおなじみのエスケープシーケンスを書いても特別な効果は得られず、 書いたままの形式で出力されます。
PHP公式マニュアル
$message = 'お問い合わせを受け付けました。\r\n'
. '名前:' . $_SESSION['name'] . '\r\n'
. 'tel:' . $_SESSION['tel'] . '\r\n'
. 'お問い合わせ内容:' . '\r\n'
. $_SESSION['message'];
mb_send_mail($_SESSION['email'], 'お問い合わせありがとうございます', $message);
##解決方法1:改行コードをダブルクオーテーションで囲む
ダブルクオーテーションで囲むことで二重引用符として扱われ、改行できる。
二重引用符
文字列が二重引用符 (") で括られた場合、 PHP は、以下のエスケープシーケンスを特殊な文字として解釈します。
PHP公式マニュアル
$message = 'お問い合わせを受け付けました。'."\r\n"
. '名前:' . $_SESSION['name'] . "\r\n"
. 'tel:' . $_SESSION['tel'] . "\r\n"
. 'お問い合わせ内容:' . "\r\n"
. $_SESSION['message'];
mb_send_mail($_SESSION['email'], 'お問い合わせありがとうございます', $message);
##解決方法2:実行環境のOSに対応する改行コードを出力する定数PHP_EOLを使用する
PHP_EOLは実行環境のOSに対応する改行コードを出力する定数になります。
例えば、Windows環境の改行コードは 「\r\n(CRLF)」 Linux/Unix系、MacOS等の改行コードは「\n(LF)」になります。
そのため、この定数を文字列と結合することでコンソールに改行された状態で出力することができます。
ただ注意しておきたいのが、ブラウザで見た際にはPHP_EOLでは改行されません。
理由としては、php/HTMLファイルを表示する際はHTMLと認識されるため、改行コードではく「
」で改行されます。
PHPでphp_eolを使う方法【初心者向け】
$message = 'お問い合わせを受け付けました。' . PHP_EOL
. '名前:' . $_SESSION['name'] . PHP_EOL
. 'tel:' . $_SESSION['tel'] . PHP_EOL
. 'お問い合わせ内容:' . PHP_EOL
. $_SESSION['message'];
mb_send_mail($_SESSION['email'], 'お問い合わせありがとうございます', $message);