PHP でメールを送信する方法

はじめに

実務にて、お問い合わせ画面のメール送信機能を実装する作業があり、それを解決した情報になります。Web 開発の初心者、初学者の方にもわかりやすいように、ソースコードを編集してサンプルを公開しています、ご参考になれば幸いです。

検証環境

サンプル

解説

サンプルのソースコードを基に、メールを送信する基本的な方法を説明します。

また、サンプルのプログラムでは本題を理解しやすくする為に、バリデーションを実装していません。必要な場合は、下記の記事にて情報を纏めています。

  1. PHP でフォームデータをメールアドレス入力チェックする方法

PHP でメールを送信するには、mail のラッパー関数である mb_send_mail を実行します。

ラッパー(wrapper)とは、包むという意味です。つまり、mb_send_mail の内部では、mail を呼び出していて、さらにエンコードする処理を加えているということです。ロシアの民芸品「マトリョーシカ人形」みたいなイメージです。

mb_send_mail は、mb_language の設定に基づいてヘッダーと本文を変換、エンコードします。

mb_language の設定は、下記のように、引数の language に言語を指定します。今回は、日本語のメールを前提としているので、文字コードの ISO-2022-JP を設定しています。設定していない場合は、PHP の設定ファイル php.ini の mbstring.language を参照します。

mb_language('ja');

php.ini の設定情報を確認するには、下記のように phpinfo を実行します。

phpinfo();

また、スクリプトの文字コードと php.ini の mbstring.internal_encoding が違うと、mb_send_mail で送信したメールの 文字化け が発生します。

これを防ぐには、下記のように、mb_internal_encodingmbstring.internal_encoding をスクリプトの文字コードと同じにします。

mb_internal_encoding('UTF-8');

mb_send_mail を実行する前に、メールヘッダーの設定が必要です。

メールヘッダーとは、メール本文以外の送信元、送信先、メールソフト、IP アドレス、送信時刻などの附帯情報のことです。仕様の詳細は RFC 5322(Internet Message Format)にあります。

mb_send_mail では、From(送信元)ヘッダーが必須です。初期値は、php.ini の sendmail_from です。Windows では、From ヘッダーを設定すると Return-Path(バウンスメール の戻り先)ヘッダーも設定されます。

前述の仕様より、下記のように mb_send_mail を実行します。第 4 引数の additional_headers は PHP 7.2.0 以降より配列を受け付けるようになっています。

function sendEmail(string $from, string $to, string $subject, string $message): void {
  $headers = [
    'From' => $from,
    'Reply-To' => $from,
  ];

  mb_language('ja');
  mb_internal_encoding('UTF-8');
  mb_send_mail($to, $subject, $message, $headers);
}

前述のプログラムで文字化けが発生する場合は、文字化けしているメールのソースを表示して、Content-Type ヘッダーの charset が ISO-2022-JP になっているか確認しましょう。

メールを受信できない場合は、メーラーの迷惑メールフィルターの仕様を確認しましょう。IP アドレス、ドメイン名、メールヘッダーの制限に引っ掛かっている可能性があります。

以上です。

おわりに

サンプルのソースコードを再利用する際は、要件定義やコーディング規約にお気を付けください。