LoginSignup
3
2

More than 3 years have passed since last update.

【PHP】mb_send_mailでうまく改行されないときに気をつけること

Posted at

【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);
3
2
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
3
2