メール送信 · 1 min read · Oct 25, 2025

PHPからのメール送信

PHPからのメール送信

このチュートリアルでは、PHP対応のウェブサーバーから簡単にメールメッセージを送信する方法を示します。これは、フォームデータの処理、アラートの送信などに利用できます。また、メールヘッダーのフォーマットについても少し説明します。

システム構成

明らかに、PHPと一緒にウェブサーバーをインストールする必要があります。また、オペレーティングシステムにメールエージェントがインストールされていることを確認する必要があります(例えば、LinuxのSendmailやIISのSMTPサービス)。ポート25がブロックされていないことも確認してください。これは、メッセージを別のサーバー経由で中継する場合でも必要です。

PHPにはデフォルトでmail関数が有効になっています。ただし、’php.ini’ファイルの[mail function]セクション(行番号約700)で追加のオプションを指定できます。

構文

mail()コマンドの完全な構文は以下の通りです:

bool mail ( string $email_address_to, string $subject, string $message_contents [, string $additional_headers [, string $additional_parameters]] );

最初の3つのパラメータは説明を必要としません: 受信者のメールアドレス、メッセージの件名、メッセージの内容。$additional_headersパラメータには、後でリストするメールヘッダーが含まれます。$additional_parametersは、メール送信に使用されるプログラム(例えばsendmail)に特有のオプションを渡すために使用され、ほとんど使用されません。sendmailのマニュアルページでオプションのリストを確認する必要があります。

絶対的な最小限では、以下を指定する必要があります:

mail ( $email_address_to , $subject, $message_contents );

ただし、コンプライアンスの理由から追加のヘッダーを定義することをお勧めします。メールメッセージはRFC #822に準拠している必要があります。

以下の例は、使用できるいくつかのメールヘッダーを示しています:

  • From: 送信者のメールアドレス。
  • Reply-To: 返信が送信されるべきメールアドレス。
  • Return-Path: メッセージが配信されない場合に返送されるために使用されます。
  • Subject: メールの件名。
  • CC: カーボンコピー。すべての他の受信者が見ることができる追加の受信者のカンマ区切りリスト。
  • BCC: ブラインドカーボンコピー。どの他の受信者にも見えない追加の受信者のカンマ区切りリスト。
  • Content-type: メッセージのMIMEタイプを定義します。
  • X-Mailer: メッセージを送信するために使用されるメールクライアントを指定します。

重要なことは、ヘッダー名が大文字と小文字を区別し、各ヘッダーはreturnおよびnewline文字で終了する必要があることを覚えておくことです。

各メッセージは、最低2つのメールサーバー(送信者と受信者)を経由します。ただし、リレーサーバー、アンチSPAMサーバーなど、ルート上にさらに多くのメールサーバーが存在する可能性があります。それぞれがメッセージに独自のヘッダーを追加します。また、ウェブサーバーの設定によっては、Return-Pathなどのいくつかのヘッダーフィールドが入れ替わる可能性があることも考慮する必要があります。このフィールドは、返信先アドレスには影響しません。

以下は、メールメッセージを送信するシンプルな例です:


完全な例

この例は、より多くのオプションとヘッダーを持つより整理された構造を示しています:

";
   $email_return_to = "[email protected]";
   $email_content_type = "text/html; charset=us-ascii";
   $email_client = "PHP/" . phpversion();
// ------------------------- //

// --- DEFINE HEADERS --- //
   $email_header = "From: " . $email_sender . "\r\n";
   $email_header .= "Reply-To: " . $email_return_to . "\r\n";
   $email_header .= "Return-Path: " . $email_return_to . "\r\n";
   $email_header .= "Content-type: " . $email_content_type . "\r\n";
   $email_header .= "X-Mailer: " . $email_client . "\r\n";
// ---------------------- //

// --- SUBJECT AND CONTENTS --- //
   $email_subject = "テストメールの件名";
   $email_contents = "";
   $email_contents .= "

テストメール

"; $email_contents .= "
送信者: " . $email_sender; $email_contents .= "
受信者: " . $email_recipient; $email_contents .= ""; // ---------------------------- // $email_result = mail($email_recipient, $email_subject, $email_contents, $email_header); if ($email_result) echo "メールが送信されました!"; else echo "メールの送信に失敗しました!"; ?>
  • 注意: mail()のWindows実装は、Unix実装とは多くの点で異なります。まず、メッセージを作成するためのローカルバイナリを使用せず、直接ソケットでのみ操作するため、ネットワークソケットでリッスンしているMTAが必要です(これはローカルホストまたはリモートマシンのいずれかにあります)。第二に、From:、Cc:、Bcc:、Date:などのカスタムヘッダーは、最初にMTAによって解釈されるのではなく、PHPによって解析されます。そのため、toパラメータは「Something < [email protected] >」の形式のアドレスであってはなりません。mailコマンドは、MTAとの通信中にこれを正しく解析できない可能性があります。
  • 注意: mail()関数は、ループ内での大量のメールには適していないことを言及する価値があります。この関数は、各メールのためにSMTPソケットを開閉するため、非常に効率的ではありません。
Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。