PHPを使ったメール送信の基本 | サンプルコードと解説

by

カテゴリー:

PHPを使ったウェブアプリケーションやウェブサービスの開発において、メール送信機能は重要な要素の一つです。

ユーザーへの確認メール、パスワードリセットの通知、ニュースレターの送信など、さまざまな用途でメール送信が必要となりますが、PHPはそのシンプルさと柔軟性から、メール送信の実現に適した言語の一つです。

この記事では、「PHPを使ったメール送信の基本」に焦点を当て、サンプルコードと解説を提供します。

初心者から中級者まで、どなたでも理解できるように、ステップバイステップで説明します。

このガイドを通じて、PHPを使用したメール送信の手順を習得し、ご自分のプロジェクトに組み込む準備を整えていきましょう。

PHPでメール送信する最短コード

まずは結論として、PHPでメールを送信する一番シンプルなコードを示します。標準の mail() 関数に「宛先・件名・本文」を渡すだけで送信できます。

<?php
// 宛先・件名・本文を渡すだけの最小構成
$to      = "to@example.com";
$subject = "テストメール";
$message = "PHPから送信した本文です。";

if (mail($to, $subject, $message)) {
    echo "送信に成功しました";
} else {
    echo "送信に失敗しました";
}

日本語の件名や本文が文字化けする場合は、日本語のエンコード処理を自動で行ってくれる mb_send_mail() を使うと簡単です。使い方は mail() とほぼ同じで、あらかじめ mb_language("Japanese")mb_internal_encoding("UTF-8") を指定しておきます。

<?php
mb_language("Japanese");
mb_internal_encoding("UTF-8");

// 日本語のエンコードを自動処理してくれる
mb_send_mail("to@example.com", "日本語の件名", "日本語の本文です。");

mail関数・mb_send_mail・SMTP送信の違い

PHPでメールを送る方法は大きく3つあります。用途に合わせて選びましょう。

送信方式特徴向いているケース
mail()PHP標準関数。サーバーの php.ini に設定されたSMTP(sendmail)経由で送信する。日本語はエンコード処理が必要。同一サーバー内で完結する簡単な通知メール
mb_send_mail()mail() の日本語対応版。件名・本文のエンコードを自動で処理してくれる。日本語メールを手軽に送りたいとき
外部SMTP送信
(PHPMailer / Symfony Mailer など)
Gmail・SendGrid・SESなど外部のSMTPサーバーにSMTP認証で接続して送信する。到達率が高く、添付ファイルやHTMLメールも扱いやすい。本番サービス・大量送信・迷惑メール判定を避けたいとき

mail() / mb_send_mail() はサーバー側のメール設定に依存するため手軽ですが、到達率やなりすまし対策の面では外部SMTP(PHPMailerなど)を使う方法が本番運用では一般的です。まずは mail() で挙動を確認し、必要になったら外部SMTPへ切り替えるとよいでしょう。

PHPでメール送信のサンプルコード

<?php

// 送信先メールアドレス
$to = "to@example.com";

// 件名
$subject = "サンプルメール";

// メッセージ本文
$message = <<<EOM
これはPHPを使用して送信したサンプルメールです。\r\n
改行コードは反映されない。<br />
HTMLタグでの改行が反映されて、<b>強調表示</b>などが指定できる。
EOM;

// 送信元情報
$from = "from@example.com";
$fromName = "PHP_mail";

// メールヘッダ
$headers = <<<EOH
From: {$fromName} <{$from}>
Reply-To: {$from}
MIME-Version: 1.0
Content-Type: text/html; charset=UTF-8
EOH;

// メール送信
if (mail($to, $subject, $message, $headers)) {
    echo "メールが送信されました。\n";
} else {
    echo "メールの送信に失敗しました。\n";
}

実際に届くメールがこちら

解説

このサンプルコードは、PHPで基本的なメール送信を行うための出発点となります。必要に応じて、SMTP認証を追加したり、エラーハンドリングを強化したりすることができます。

サンプルコードでは mail()関数を使用して送信しています。この関数では php.ini のSMTP情報をもとにメールを送信しており、以下の設定を行なっています。

$ php -i | grep -i smtp
SMTP => localhost => localhost
smtp_port => 25 => 25
Protocols => dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, ldaps, pop3, pop3s, rtsp, scp, sftp, smtp, smtps, telnet, tftp

この設定では実行環境内にメール送信用のSMTPサーバーを立ち上げておく事で送信が可能になります。

mail()関数の実行方法は

  • 送信先のメールアドレスを記載
  • 件名とメッセージを指定
  • メールヘッダーに返信先とUTF-8である指定を追加

この指定をするだけでメール送信を行うことができます。

CCやBCCについてもヘッダー情報を編集することで対応可能になります。ぜひ、公式マニュアルを確認して使いこなしてみてください。

https://www.php.net/manual/ja/function.mail.php

メールが送信できない時の確認項目

mail()false を返す、または true でも相手にメールが届かない場合は、次の項目を順番に確認してみてください。

  • SMTPサーバーの設定php.iniSMTPsmtp_port(Windows)や、sendmailのパス(Linux/Mac)が正しく設定されているか。
  • 送信元アドレスFrom ヘッダーが未設定、または実在しないドメインだと拒否されやすい。サーバーのドメインと一致した実在アドレスを指定する。
  • 迷惑メール判定true でも届かない場合は迷惑メールフォルダを確認。送信元ドメインに SPF・DKIM・DMARC レコードを設定すると到達率が上がる。
  • ヘッダーの改行コード:ヘッダーの区切りは \r\n を使う。改行コードが正しくないとヘッダーが無視されたり送信に失敗する。
  • エラーの内容を確認error_get_last() やサーバーのメールログ(/var/log/maillog など)を確認する。原因が分からない場合は外部SMTP(PHPMailer)に切り替えると詳細なエラーが取得しやすい。

終わりに

PHPでメール送信をする方法について解説してきました。

PHPによるメール送信をする方法はSMTPサーバーに投げるだけなので簡単に実装できることがわかると思います。

ですが、メールの送受信にはPHP以外の知識も必要になります。SMTPサーバーを立ち上げたり、迷惑メールと判定されないためにも送信元のドメインにSPFレコードを追加したり、メールサーバーの構築に精通する必要があります。

今回紹介した内容ではレンタルサーバーのエックスサーバーで検証しました。一般的なレンタルサーバーはメールの送受信に対応しているため、メール処理が簡単に実装できる利点があります。最初からメールの送受信機能が必要なのであればレンタルサーバーでサービス構築するのもオススメします。

以上、お疲れ様でした。

ホーム » 記事一覧 » 技術メモ » 開発 » PHP開発 » PHPを使ったメール送信の基本 | サンプルコードと解説

投稿者

ここまで読んでいただき、ありがとうございます。

このサイトでは、私自身が関わっていることや、興味を持って試していることをそのまま置いています。

内容を見ていて、
「少し話を聞いてみたい」
「協業できる部分がありそう」
と感じる点があれば、下記のお問い合わせフォームからご連絡ください。状況を確認したうえで、必要な範囲でお返事します。

特に、以下のWordPressサイトに関する相談にも対応しているのでご興味ありましたらご相談ください。


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です