【PHP8.x】mb_send_mail関数の使い方

作成日: 更新日:

mb_send_mail関数は、マルチバイト文字に対応したメール送信を行う関数です。通常のmail()関数とは異なり、日本語などのマルチバイト文字を含むメールを正しく送信するために使用されます。具体的には、メールのヘッダと本文を適切にエンコードし、文字化けを防ぎます。

この関数は、送信先メールアドレス、メールの件名、メールの本文、追加のヘッダを引数として受け取ります。追加のヘッダには、From、Cc、Bccなどの情報を指定できます。これらのヘッダも適切にエンコードされるため、送信者の名前やアドレスにマルチバイト文字が含まれていても、正しく表示されます。

mb_send_mail関数は、メール送信が成功した場合はTRUE、失敗した場合はFALSEを返します。メール送信が失敗した場合、PHPのエラーログにエラーメッセージが出力されることがあります。そのため、デバッグ時にはエラーログを確認することが重要です。

また、mb_send_mail関数を使用する前に、mb_language()関数やmb_internal_encoding()関数を使用して、適切な言語設定と内部文字エンコーディングを設定することを推奨します。これにより、メールのエンコーディングに関する問題をより確実に回避できます。例えば、mb_language("Japanese")mb_internal_encoding("UTF-8")を設定することで、日本語のメールをUTF-8エンコーディングで送信できます。

さらに、セキュリティ上の注意点として、メールヘッダインジェクション攻撃を防ぐために、引数として渡すデータは適切にエスケープする必要があります。特に、ユーザーからの入力を元にメールを送信する場合は、細心の注意を払う必要があります。

基本的な使い方

構文(syntax)

mb_send_mail(
    string $to,
    string $subject,
    string $message,
    string|array $additional_headers = [],
    string $additional_parameter = ""
): bool

引数(parameters)

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

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

戻り値(return)

bool

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

サンプルコード

PHP mb_send_mailでSMTPメールを送信する

<?php

/**
 * mb_send_mail を使用してメールを送信するサンプル
 *
 * SMTP 経由で日本語メールを送信します。
 * mb_send_mail は内部で適切なエンコード処理を行うため、文字化けを防ぐことができます。
 *
 * @param string $to      送信先メールアドレス
 * @param string $subject 件名
 * @param string $message 本文
 * @return bool          送信成功時に true, 失敗時に false
 */
function sendMailWithMbSendMail(string $to, string $subject, string $message): bool
{
    // 日本語設定 (必須)
    mb_language("ja");
    mb_internal_encoding("UTF-8");

    // 追加ヘッダー (From, Content-Type)
    $additional_headers = [
        "From: sender@example.com",
        "Content-Type: text/plain; charset=UTF-8"
    ];

    // 追加パラメータ (SMTP サーバーの設定)
    // php.ini で SMTP 設定が済んでいる場合は不要
    // 例: -f sender@example.com (Return-Path を設定する場合)
    $additional_params = null;

    // メール送信
    $result = mb_send_mail($to, $subject, $message, $additional_headers, $additional_params);

    return $result;
}

// 使用例
$to = "recipient@example.com";
$subject = "テストメール";
$message = "これは日本語のテストメールです。\nmb_send_mail で送信しています。";

if (sendMailWithMbSendMail($to, $subject, $message)) {
    echo "メールを送信しました。\n";
} else {
    echo "メールの送信に失敗しました。\n";
}

?>

このサンプルコードは、PHPのmb_send_mail関数を使用して、SMTP経由で日本語メールを送信する方法を示しています。mb_send_mail関数は、文字エンコーディングを自動的に処理するため、文字化けを防ぐのに役立ちます。

mb_send_mail関数は、以下の引数を受け取ります。$toは送信先のメールアドレス、$subjectはメールの件名、$messageはメールの本文です。$additional_headersは追加のヘッダー情報(FromやContent-Typeなど)を配列または文字列で指定します。$additional_paramsは追加のパラメータ(SMTPサーバーの設定など)を指定します。php.iniでSMTP設定が済んでいる場合は、nullを指定できます。

サンプルコードでは、まずmb_language関数とmb_internal_encoding関数を使用して、日本語の設定を行います。これは日本語メールを正しく送信するために必須です。次に、$additional_headersでFromアドレスとContent-Type(文字コードを含む)を設定します。最後に、mb_send_mail関数を呼び出してメールを送信し、送信結果(成功または失敗)を返します。

mb_send_mail関数は、メール送信に成功した場合にtrue、失敗した場合にfalseを返します。サンプルコードでは、この戻り値に基づいて、送信結果を画面に表示します。このコードを実行するには、PHPがSMTPサーバーにアクセスできるように設定されている必要があります。

mb_send_mail は日本語メール送信に便利な関数ですが、いくつか注意点があります。まず、文字化けを防ぐために mb_languagemb_internal_encoding で日本語設定を必ず行ってください。次に、additional_headers で From アドレスと Content-Type を指定することを推奨します。Content-Type は text/plain または text/html を指定し、charset は UTF-8 に設定してください。SMTP サーバーの設定は、通常 php.ini で行いますが、additional_params で指定することも可能です。ただし、この方法はセキュリティ上のリスクがあるため、php.ini での設定を推奨します。メール送信に失敗した場合、エラーログを確認し、設定に誤りがないか確認してください。

PHPで添付ファイル付きメールを送信する

<?php

/**
 * メールを送信する(添付ファイル付き).
 *
 * @param string $to      送信先メールアドレス
 * @param string $subject 件名
 * @param string $message 本文
 * @param string $attachment_path 添付ファイルのパス
 *
 * @return bool 送信成功時にtrue、失敗時にfalse
 */
function send_mail_with_attachment(string $to, string $subject, string $message, string $attachment_path): bool
{
    $boundary = "--" . md5(uniqid(rand(), true)); // バウンダリ文字列を生成

    // ヘッダー情報を設定
    $headers = [
        "MIME-Version: 1.0",
        "Content-Type: multipart/mixed; boundary=\"{$boundary}\"",
        "Content-Transfer-Encoding: 7bit",
        "X-Mailer: PHP/" . phpversion()
    ];

    // 本文の作成
    $body = "--{$boundary}\n";
    $body .= "Content-Type: text/plain; charset=UTF-8\n";
    $body .= "Content-Transfer-Encoding: 8bit\n\n";
    $body .= $message . "\n\n";

    // 添付ファイルの処理
    if (file_exists($attachment_path)) {
        $file_name = basename($attachment_path);
        $file_size = filesize($attachment_path);
        $file_data = file_get_contents($attachment_path);
        $file_data = base64_encode($file_data);

        $body .= "--{$boundary}\n";
        $body .= "Content-Type: application/octet-stream; name=\"{$file_name}\"\n";
        $body .= "Content-Disposition: attachment; filename=\"{$file_name}\"\n";
        $body .= "Content-Transfer-Encoding: base64\n\n";
        $body .= chunk_split($file_data) . "\n\n";
    }

    $body .= "--{$boundary}--\n";

    // mb_send_mail でメールを送信
    return mb_send_mail($to, $subject, $body, implode("\r\n", $headers));
}

// 使用例
$to = "recipient@example.com";
$subject = "添付ファイル付きのメール";
$message = "これは添付ファイル付きのメールのサンプルです。";
$attachment_path = "path/to/your/attachment.txt"; // 添付ファイルのパスを指定

// 添付ファイルを送信
$result = send_mail_with_attachment($to, $subject, $message, $attachment_path);

if ($result) {
    echo "メールを送信しました。\n";
} else {
    echo "メールの送信に失敗しました。\n";
}

?>

PHP 8.4 の mb_send_mail 関数を使って、添付ファイル付きのメールを送信するサンプルコードです。mb_send_mail は、マルチバイト文字列を扱う場合に便利なメール送信関数です。

このサンプルでは、send_mail_with_attachment という関数を定義しています。この関数は、宛先 ($to)、件名 ($subject)、本文 ($message)、そして添付ファイルのパス ($attachment_path) を引数として受け取ります。

まず、メールのContent-Typeを multipart/mixed に設定し、バウンダリ文字列を生成します。次に、ヘッダー情報を作成し、メール本文を作成します。添付ファイルが存在する場合は、ファイルの内容を読み込み、Base64エンコードしてメール本文に追加します。

mb_send_mail 関数には、宛先、件名、メール本文、追加ヘッダーを文字列として渡します。追加ヘッダーは、改行文字 (\r\n) で連結した文字列として渡す必要があります。

mb_send_mail 関数は、メールの送信に成功した場合に true、失敗した場合に false を返します。サンプルコードでは、返り値を確認して、メール送信の成否をメッセージとして表示します。

このサンプルコードを使用する際は、$attachment_path を実際の添付ファイルのパスに置き換えてください。また、送信先のメールサーバの設定によっては、追加の認証が必要になる場合があります。

mb_send_mail関数で添付ファイルを送信する際の注意点です。

まず、日本語を扱うため、文字コードはUTF-8で統一してください。Content-Typeで文字コードを明示することも重要です。

次に、添付ファイル処理では、ファイルパスの指定ミスやファイルが存在しない場合に備えて、file_existsで確認しましょう。また、base64_encodeしたデータはchunk_splitで適切な長さに分割しないと、メールサーバによっては正しく処理されないことがあります。

さらに、additional_headersは、改行コードを\r\nで連結する必要があります。ヘッダーインジェクション攻撃を防ぐため、$to$subjectに危険な文字列が含まれていないかチェックすることも推奨されます。

最後に、mb_send_mailの戻り値は送信の成否を示すbool値ですが、メールサーバの設定によっては正常に送信できない場合もあります。送信ログなどを確認し、問題発生時にはサーバー側の設定を見直してください。

【PHP8.x】mb_send_mail関数の使い方 | いっしー@Webエンジニア