Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】mail()関数の使い方

mail関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

mail関数は、PHPスクリプトから電子メールを送信する機能を提供する関数です。この関数を使用すると、プログラム上で指定した宛先に、件名と本文を含むシンプルなテキストメールを送ることができます。

メールを送信するために、少なくとも宛先のメールアドレス、メールの件名、そしてメールの本文を引数として指定する必要があります。加えて、送信元(From)、CC(Carbon Copy)、BCC(Blind Carbon Copy)などの追加ヘッダー情報をオプションで設定することも可能です。

mail関数は、PHP自身が直接SMTP(Simple Mail Transfer Protocol)サーバーと通信するのではなく、PHPが動作しているサーバーにインストールされているメール転送エージェント(MTA)を利用してメールの送信を依頼します。このため、メール送信の成否や詳細な挙動は、PHPの設定(php.ini)やサーバーに設定されたMTAの設定に大きく依存します。

関数は、メールの送信処理が正常にキューに追加された場合はtrueを、何らかの理由で失敗した場合はfalseを返します。しかし、trueが返されたとしても、メールが最終的に受信者に届くことを保証するものではありません。添付ファイルやHTML形式のメール、SMTP認証を伴うメールなど、より複雑な要件を持つメール送信には、このmail関数だけでは対応が難しいことが多く、通常はより高機能なメール送信ライブラリの利用が推奨されます。

構文(syntax)

1mail(string $to, string $subject, string $message, array|string $additional_headers = [], string $additional_params = ""): bool

引数(parameters)

string $to, string $subject, string $message, array|string $additional_headers = [], string $additional_params = ""

  • string $to: 送信先のメールアドレスを指定する文字列
  • string $subject: メール件名を指定する文字列
  • string $message: 送信するメール本文を指定する文字列
  • array|string $additional_headers = []: 追加のメールヘッダーを指定する配列または文字列。例: "From: sender@example.com\r\nReply-To: reply@example.com"
  • string $additional_params = "": mail() 関数に渡す追加のコマンドラインパラメータを指定する文字列

戻り値(return)

bool

メール送信の成否を返します。成功した場合はtrue、失敗した場合はfalseを返します。

サンプルコード

PHP mail関数でHTMLメールを送信する

1<?php
2
3/**
4 * PHPの標準mail関数を使用してメールを送信するサンプルコード。
5 * システムエンジニアを目指す初心者向けに、基本的なメール送信方法と
6 * 差出人名、HTMLメール形式での送信方法を示します。
7 *
8 * 注意: mail関数はPHPが動作するサーバーにメール送信機能(例: sendmail, Postfix)が
9 * 正しく設定されている必要があります。
10 * SMTP認証、添付ファイルの送信、より複雑なエラーハンドリングなど、
11 * 高度なメール送信機能にはPHPMailerのような専門のライブラリの使用が推奨されます。
12 */
13
14// 送信先のメールアドレス
15$to = "recipient@example.com";
16
17// メールの件名
18$subject = "PHP mail関数によるテストメール";
19
20// メールの本文(HTML形式)
21$message = '
22<html>
23<head>
24  <title>PHP mail関数 HTMLメール</title>
25</head>
26<body>
27  <h1>PHP mail関数で送信されたHTMLメールです!</h1>
28  <p>このメールは、PHPの標準<code>mail()</code>関数を使用して送信されました。</p>
29  <p>送信時刻: ' . date('Y-m-d H:i:s') . '</p>
30  <p>システムエンジニアを目指す初心者の方へ、基本的なメール送信の例です。</p>
31</body>
32</html>
33';
34
35// 追加ヘッダーの定義
36// 複数のヘッダーはCRLF(\r\n)で連結して文字列として渡します。
37// 差出人名とメールアドレスを設定
38$from_name = "PHP Mailer Example"; // 表示される差出人名
39$from_email = "sender@example.com"; // 実際の差出人メールアドレス
40
41$headers = "From: " . $from_name . " <" . $from_email . ">\r\n";
42// 返信先アドレス(オプション)
43$headers .= "Reply-To: " . $from_email . "\r\n";
44// HTMLメールを送信するためのヘッダー
45$headers .= "MIME-Version: 1.0\r\n";
46$headers .= "Content-type: text/html; charset=UTF-8\r\n";
47// メールクライアントがどのように本文を解釈するかを指定(オプション)
48$headers .= "Content-Transfer-Encoding: 8bit\r\n";
49
50// 追加パラメータ(オプション)。通常は不要ですが、例えばsendmailの-fオプションを設定できます。
51// 例: -fsender@example.com はエンベロープFromを設定し、バウンスメールの送信先となります。
52$additional_params = "-f" . $from_email;
53
54// mail関数を実行
55// 引数: string $to, string $subject, string $message, array|string $additional_headers = [], string $additional_params = ""
56$mail_sent = mail($to, $subject, $message, $headers, $additional_params);
57
58// 送信結果の判定
59if ($mail_sent) {
60    echo "メールが正常に送信されました。\n";
61    echo "宛先: " . $to . "\n";
62    echo "件名: " . $subject . "\n";
63} else {
64    echo "メールの送信に失敗しました。\n";
65    // 失敗の原因はサーバー設定やPHPの設定に依存することが多いため、
66    // ここで具体的なエラーメッセージを直接取得することは困難です。
67    // PHPのエラーログやサーバーのメールログ(例: /var/log/maillog)を確認することをお勧めします。
68}
69
70?>

PHPのmail関数は、サーバーのメール送信機能を利用してメールを送信するための基本的な関数です。この機能を使うには、PHPが動作するサーバーにsendmailなどのメール送信プログラムが正しく設定されていることが前提となります。

サンプルコードでは、$toに送信先のメールアドレス、$subjectにメールの件名、$messageにHTML形式で記述されたメール本文を指定しています。特に$headers変数では、Fromヘッダーで差出人名とメールアドレスを設定し、MIME-VersionContent-typeヘッダーでHTMLメールであることを指定しています。複数のヘッダーは改行文字(\r\n)で連結して渡します。$additional_paramsは、メール送信プログラムへ渡す追加の引数で、エンベロープFromなどの設定に利用されます。

mail関数はこれらの引数を受け取り、メール送信を試みます。送信が成功すればtrue、失敗すればfalseを戻り値として返しますので、プログラムでその結果を判定できます。ただし、mail関数ではSMTP認証や添付ファイルの扱いが難しく、詳細なエラーハンドリングも困難です。より高度なメール送信機能には、PHPMailerのような専門ライブラリの利用が推奨されます。

PHPの標準mail関数は、利用しているサーバーにメール送信機能が正しく設定されている場合にのみ動作します。SMTP認証や添付ファイルの送信、より詳細なエラーハンドリングには直接対応しておらず、セキュリティ面での考慮も必要です。差出人名やHTMLメール形式を設定する際は、追加ヘッダーをCRLF(\r\n)で連結し、MIMEタイプなどを正確に記述する必要があります。メール送信に失敗した場合、具体的なエラー原因の特定が難しいため、PHPのエラーログやサーバーのメールログを確認してください。実用的なアプリケーションで、安全かつ高度なメール送信機能が必要な場合は、PHPMailerのような専用ライブラリの利用を強く推奨いたします。

PHP mail関数でメールを送信する

1<?php
2
3/**
4 * PHPの組み込みmail関数を使用してメールを送信します。
5 *
6 * この関数は、PHPが動作するサーバーに設定されたMTA (Mail Transfer Agent) に依存します。
7 * PHPのmail関数自体はSMTPプロトコルを直接実装するものではなく、
8 * システムのMTA(例: Postfix, Sendmail)にメール送信を依頼します。
9 * MTAがその設定に基づいてSMTPサーバーと通信を行います。
10 *
11 * @param string $to 送信先のメールアドレス。例: 'recipient@example.com'
12 * @param string $subject メールの件名。
13 * @param string $message メールの本文。
14 * @param array $additionalHeaders 追加のヘッダー。配列の各要素は 'Header-Name: Value' 形式の文字列です。
15 *                                  例: ['From: sender@example.com', 'Reply-To: reply@example.com']
16 * @param string $additionalParams MTAに渡す追加のパラメータ。一般的にエンベロープFromを指定するために使用されます。
17 *                                 例: '-f return_path@example.com' (バウンスメールの送信先を指定)
18 * @return bool メール送信の依頼がMTAに成功した場合はtrue、失敗した場合はfalseを返します。
19 *              これはメールが実際に受信者に届いたことを保証するものではありません。
20 */
21function sendEmailWithPhpMail(
22    string $to,
23    string $subject,
24    string $message,
25    array $additionalHeaders = [],
26    string $additionalParams = ""
27): bool {
28    // デフォルトのヘッダーを設定
29    // Content-Typeと文字エンコーディングを指定することで、文字化けを防ぎます。
30    $defaultHeaders = [
31        'MIME-Version: 1.0',
32        'Content-type: text/plain; charset=UTF-8',
33        'X-Mailer: PHP/' . phpversion()
34    ];
35
36    // ユーザーが指定した追加ヘッダーを、デフォルトヘッダーにマージ(同名ヘッダーは上書き)
37    $finalHeadersMap = [];
38    foreach ($defaultHeaders as $header) {
39        $key = strtolower(explode(':', $header, 2)[0]);
40        $finalHeadersMap[$key] = $header;
41    }
42    foreach ($additionalHeaders as $header) {
43        $key = strtolower(explode(':', $header, 2)[0]);
44        $finalHeadersMap[$key] = $header;
45    }
46
47    // ヘッダーを改行コードで結合して文字列形式にする
48    $headersString = implode("\r\n", array_values($finalHeadersMap));
49
50    // PHPのmail関数を呼び出す
51    // 成功した場合でも、メールが迷惑メールフォルダに入ったり、
52    // 配信に失敗する可能性があることに注意してください。
53    $mailSent = mail($to, $subject, $message, $headersString, $additionalParams);
54
55    // デバッグやログ記録のために、送信結果を記録すると良いでしょう。
56    if (!$mailSent) {
57        error_log("メール送信失敗: To: '$to', Subject: '$subject'. PHP mail() function returned false.");
58    }
59
60    return $mailSent;
61}
62
63// --- サンプル使用例 ---
64// 実際の環境に合わせて以下の値を設定してください。
65$recipientEmail = 'test_recipient@example.com';   // メールを受信するアドレス
66$senderEmail = 'info@yourdomain.com';             // 'From'ヘッダーに表示される送信元アドレス
67$returnPathEmail = 'bounce@yourdomain.com';       // バウンスメールが返送されるアドレス (エンベロープFrom)
68
69$mailSubject = 'PHP mail関数からのテストメッセージ';
70$mailMessage = "こんにちは、\n\n";
71$mailMessage .= "これはPHPのmail関数を使用して送信されたテストメールです。\n";
72$mailMessage .= "システムエンジニアを目指す初心者の方向けのサンプルコードです。\n\n";
73$mailMessage .= "SMTPサーバーの設定は、このスクリプトが動作するサーバーのMTA(例: Postfix, Sendmail)が担当します。\n";
74$mailMessage .= "PHPのmail関数はMTAへの依頼を行うだけで、直接SMTP通信は行いません。\n";
75$mailMessage .= "より高度な機能(SMTP認証、HTMLメール、添付ファイルなど)が必要な場合は、PHPMailerのような専門のライブラリの使用を検討してください。\n\n";
76$mailMessage .= "どうぞよろしくお願いいたします。\n";
77
78// 追加ヘッダーの設定
79// 'From' ヘッダーは、受信者がメールソフトで見る送信元です。
80// 'Reply-To' ヘッダーは、受信者が返信した際の宛先です。
81$headers = [
82    "From: Your Application <{$senderEmail}>",
83    "Reply-To: {$senderEmail}",
84    "X-Priority: 3", // メールの優先度 (通常)
85];
86
87// MTAに渡す追加パラメータ
88// '-f' オプションでエンベロープFromを指定することは、SPF認証などのスパム対策に重要です。
89// バウンスメールはこのアドレスに届きます。
90$params = "-f {$returnPathEmail}";
91
92// メール送信を実行し、結果を表示
93$isSent = sendEmailWithPhpMail($recipientEmail, $mailSubject, $mailMessage, $headers, $params);
94
95if ($isSent) {
96    echo "メール送信依頼がMTAに成功しました。\n";
97    echo "受信者 ('{$recipientEmail}') のメールボックスをご確認ください。\n";
98    echo "(ただし、メールの配信が保証されたわけではありません。)\n";
99} else {
100    echo "メール送信依頼がMTAに失敗しました。\n";
101    echo "サーバーのPHPエラーログやMTAのログ(例: /var/log/mail.log)を確認して、原因を特定してください。\n";
102}
103

PHPのmail関数は、メールを送信するための組み込み機能です。この関数は、SMTPプロトコルを直接扱うのではなく、PHPが動作するサーバーに設定されているMTA(Mail Transfer Agent、例えばPostfixやSendmailなど)に対してメールの送信を依頼します。これにより、MTAがその設定に基づいて実際のSMTPサーバーと通信を行い、メールを配信します。

引数としては、$toで送信先のメールアドレス、$subjectでメールの件名、$messageで本文を指定します。$additional_headersには、送信元を示すFromや文字エンコーディングを指定するContent-typeなどの追加ヘッダーを設定します。特に文字化けを防ぐため、Content-type: text/plain; charset=UTF-8のような設定が重要です。$additional_paramsは、MTAに渡す追加のパラメータで、一般的には-fオプションでバウンスメールの送信先(エンベロープFrom)を指定します。

戻り値はブール型で、メール送信の依頼がMTAに成功した場合はtrue、失敗した場合はfalseを返します。ただし、trueが返されても、メールが受信者に確実に届いたことまでは保証されません。サーバーのMTAが適切に設定されていることが前提となります。SMTP認証やHTMLメール、添付ファイルなどのより高度なメール送信機能が必要な場合は、PHPMailerのような専門のライブラリの利用を検討してください。

PHPのmail関数は、メールを直接送信するのではなく、サーバーに設定されたMTA(PostfixやSendmailなど)に送信を依頼します。そのため、PHPが動作するサーバー側のMTA設定が正しく行われていることが必須です。mail関数がtrueを返しても、MTAへの依頼が成功しただけであり、メールが受信者のメールボックスに確実に届いたことを保証するものではありません。迷惑メールとして処理されたり、配信に失敗する可能性もあります。FromヘッダーやContent-Type: charset=UTF-8の指定は、送信元表示の正確さや文字化け防止に重要です。また、additional_params引数で-fオプションを使いエンベロープFromを指定することは、SPF認証などスパム対策やバウンスメールの適切な処理に不可欠です。SMTP認証やHTMLメール、添付ファイルなどの高度な機能には対応していないため、必要に応じてPHPMailerのようなライブラリの利用を検討してください。送信に失敗した場合は、PHPのエラーログやサーバーのMTAログ(例: /var/log/mail.log)を確認し、原因を特定することが大切です。

PHP mail関数でメールを送信する

1<?php
2
3/**
4 * PHPの組み込みmail関数を使用してメールを送信します。
5 * この関数は、サーバーに設定されているMTA(メール転送エージェント、例: Postfix, Sendmail)に依存します。
6 * 開発環境ではMTAの設定が必要な場合があります。
7 *
8 * @param string $to 送信先のメールアドレス。
9 * @param string $subject メールの件名。
10 * @param string $message メールの本文。
11 * @param string|array $additionalHeaders オプションの追加ヘッダー。'From: sender@example.com\r\nContent-Type: text/plain; charset=UTF-8' などの形式。
12 * @param string $additionalParams オプションの追加パラメータ。通常はsendmailコマンドのオプションなどで使用されます。
13 * @return bool メールがMTAに正常に渡された場合はtrue、失敗した場合はfalseを返します。
14 *              実際にメールが受信者に届いたかどうかは保証しません。
15 */
16function sendEmail(
17    string $to,
18    string $subject,
19    string $message,
20    string|array $additionalHeaders = [],
21    string $additionalParams = ""
22): bool {
23    // PHPの組み込みmail関数を呼び出し、メールを送信キューに入れます。
24    // mail関数がfalseを返す場合、通常はサーバーのメール設定に問題があるか、
25    // 送信に必要な情報が不足していることを示します。
26    $isSent = mail($to, $subject, $message, $additionalHeaders, $additionalParams);
27
28    return $isSent;
29}
30
31// --- 以下は sendEmail 関数の使用例です ---
32
33// 送信先メールアドレス (実際の受信者のアドレスに置き換えてください)
34$recipient = "your_recipient@example.com";
35// メールの件名
36$subject = "PHP mail関数 テストメール";
37// メールの本文
38$body = "こんにちは。\n\nこれはPHPのmail関数で送信されたテストメールです。\n\nよろしくお願いいたします。";
39
40// 追加ヘッダーの設定
41// Fromヘッダーは送信元アドレスを指定するために重要です。
42// Content-Typeヘッダーは文字化けを防ぎ、メールの形式を指定するために推奨されます。
43$headers = "From: your_sender@example.com\r\n";
44$headers .= "Reply-To: your_sender@example.com\r\n";
45$headers .= "MIME-Version: 1.0\r\n";
46$headers .= "Content-type: text/plain; charset=UTF-8\r\n";
47
48// 追加パラメータ (通常は空白で問題ありませんが、例えばエンベロープFromの指定などで使用)
49// 例: $params = '-fyour_sender@example.com';
50$params = "";
51
52// sendEmail関数を呼び出してメールを送信します
53if (sendEmail($recipient, $subject, $body, $headers, $params)) {
54    echo "メールが正常に送信キューに入れられました。\n";
55    echo "送信先: " . $recipient . "\n";
56    echo "件名: " . $subject . "\n";
57} else {
58    echo "メールの送信に失敗しました。\n";
59    echo "サーバーのメール設定(MTA)を確認してください。\n";
60}
61
62?>

PHPのmail関数は、ウェブサーバーからメールを送信するための組み込み機能です。この関数は、サーバーに設定されているMTA(メール転送エージェント、例えばPostfixやSendmailなど)を利用してメールを送信キューに入れます。したがって、メール送信にはサーバー側でMTAが適切に設定されている必要があります。

サンプルコードでは、mail関数をより使いやすくするためのsendEmail関数を定義しています。sendEmail関数は、最初の引数$toに送信先のメールアドレス、$subjectに件名、$messageにメールの本文を指定します。これらはメール送信に必須の情報です。オプションである$additionalHeadersには、送信元(From:)や返信先(Reply-To:)、文字コード(Content-Type: text/plain; charset=UTF-8)などの追加情報を設定できます。特に文字化けを防ぐため、Content-Typeヘッダーの設定は重要です。$additionalParamsは、MTAに渡す追加オプションを指定しますが、通常は空白で問題ありません。

mail関数は、メールがMTAに正常に引き渡された場合にtrueを、何らかの理由で失敗した場合はfalseを返します。この戻り値は、メールがMTAに渡されたことのみを示し、実際に受信者のメールボックスに届いたかどうかは保証しません。サンプルコードでは、sendEmail関数の戻り値を確認し、送信が成功したか失敗したかのメッセージを表示しています。

PHPのmail関数は、サーバーのMTA(メール転送エージェント)設定に依存するため、動作しない場合はMTAの設定を確認してください。関数がtrueを返しても、メールが実際に受信者に届いたことは保証されません。スパム判定を避け、正しく表示されるよう、From:ヘッダーとContent-Type: text/plain; charset=UTF-8ヘッダーを必ず設定しましょう。また、外部からの入力値を直接メールの引数に使用する際は、セキュリティのために適切に検証・サニタイズが必要です。本番環境では、より機能が豊富で信頼性の高いPHPMailerなどの外部ライブラリの利用も検討すると良いでしょう。

PHP mail関数でテストメールを送信する

1<?php
2
3/**
4 * mail()関数を使用してシンプルなテキストメールを送信します。
5 *
6 * 注意: このスクリプトをWebサーバー上で実行するには、
7 * php.iniファイルでsendmailなどのメール送信設定が正しく構成されている必要があります。
8 * ローカル環境では通常、メールは送信されません。
9 *
10 * @return void
11 */
12function send_test_email(): void
13{
14    // 日本語の文字化けを防ぐための設定
15    mb_language('Japanese');
16    mb_internal_encoding('UTF-8');
17
18    // --- メールの基本情報を設定 ---
19
20    // 宛先メールアドレス
21    $to = 'recipient@example.com';
22
23    // メールの件名
24    $subject = 'PHPからのテストメール';
25
26    // メールの本文
27    $message = "これはPHPのmail()関数を使用して送信されたテストメールです。\n";
28    $message .= "このメールが届けば、設定は正常です。\n";
29
30    // --- 追加ヘッダー情報を設定 ---
31    // From: 送信元を指定します。指定しないと送信できないサーバーもあります。
32    // Content-Type: メールの形式と文字コードを指定します。日本語にはUTF-8が推奨されます。
33    $additional_headers = [
34        'From' => 'sender@example.com',
35        'Reply-To' => 'sender@example.com',
36        'Content-Type' => 'text/plain; charset=UTF-8',
37    ];
38
39    // mail()関数を実行してメールを送信
40    // 成功した場合は true、失敗した場合は false を返します。
41    // mb_send_mail() は mail() を内部で呼び出し、日本語の件名や本文を自動でエンコードしてくれます。
42    if (mb_send_mail($to, $subject, $message, $additional_headers)) {
43        echo "メールは正常に送信キューに追加されました。";
44    } else {
45        echo "メールの送信に失敗しました。サーバーの設定を確認してください。";
46    }
47}
48
49// 関数を呼び出してメール送信処理を実行
50send_test_email();

PHPのmail関数は、指定した宛先にメールを送信するための基本的な機能を提供します。サンプルコードでは、日本語の文字化けを防ぐため、mb_language()mb_internal_encoding()で適切な文字コードを設定し、内部でmail関数を利用するmb_send_mail関数を用いています。

この関数には主に以下の情報が必要です。 第一引数の $to には宛先メールアドレスを文字列で指定します。 第二引数の $subject にはメールの件名を文字列で指定します。 第三引数の $message にはメールの本文を文字列で指定します。

第四引数の $additional_headers はオプションで、送信元アドレスやメールの形式といった追加情報を配列または文字列で設定できます。サンプルではFromで送信元を指定し、Content-Typeで「テキスト形式、UTF-8文字コード」と指定することで、日本語のメールが正しく表示されるようにしています。

関数は、メールの送信処理がサーバーのキューに正常に追加された場合に論理値のtrueを、何らかの理由で失敗した場合にはfalseを戻り値として返します。この戻り値を利用して、プログラム内で送信の成否を判断し、適切な次の処理を行うことができます。

ただし、この機能を利用するには、WebサーバーのPHP設定(php.ini)において、Sendmailなどのメール送信プログラムが適切に構成されている必要があります。設定が不十分な場合、メールは実際に送信されませんのでご注意ください。

PHPのmail関数は、php.iniのメール送信設定が必須であり、ローカル環境では機能しません。サーバー上で動作確認を行う必要があります。日本語メールは文字化けを防ぐため、mb_language()mb_internal_encoding()でエンコーディングを設定し、mb_send_mail()を使うべきです。送信元を示すFromヘッダーや、文字コードを指定するContent-Type: charset=UTF-8などの追加ヘッダーは、メール到達や表示に不可欠です。mb_send_mail()はメールの送信キューへの追加成否を返します。戻り値で必ず結果を確認し、失敗時はサーバー設定を確認してください。

関連コンテンツ

関連プログラミング言語