はじめに
実務にて、お問い合わせ画面のメール送信機能を実装する作業があり、それを解決した情報になります。Web 開発の初心者、初学者の方にもわかりやすいように、ソースコードを編集してサンプルを公開しています、ご参考になれば幸いです。
検証環境
サンプル
解説
サンプルのソースコードを基に、メールを送信する基本的な方法を説明します。
また、サンプルのプログラムでは本題を理解しやすくする為に、バリデーションを実装していません。必要な場合は、下記の記事にて情報を纏めています。
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_encoding で mbstring.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 アドレス、ドメイン名、メールヘッダーの制限に引っ掛かっている可能性があります。
以上です。
おわりに
サンプルのソースコードを再利用する際は、要件定義やコーディング規約にお気を付けください。