1. PHP

PHPでメールを送る方法!mb_send_mail()の使い方と注意点

Share

お問い合わせフォームや自動返信メールなど、Web開発で欠かせない「メール送信」。

PHPでは標準で mail() 関数が用意されていますが、日本語メールを扱うなら mb_send_mail() を使うのがおすすめです。

この記事では、mb_send_mail() の基本的な使い方と、利用時の注意点をわかりやすく解説します。

mb_send_mail() とは?

mb_send_mail() は、PHPのマルチバイト文字(日本語など)に対応したメール送信関数です。日本語の件名や本文を正しくエンコードして送ることができます。

mb_language("Japanese");
mb_internal_encoding("UTF-8");

$to      = 'recipient@example.com';
$subject = 'お問い合わせありがとうございます';
$message = "お問い合わせを受け付けました。\nご返信までしばらくお待ちください。";
$headers = "From: info@example.com";

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

基本のパラメータ

  • $to:送信先メールアドレス
  • $subject:件名
  • $message:本文
  • $headers:送信元や追加情報(オプション)

mb_language / mb_internal_encoding

  • mb_language("Japanese")
    日本語メールを送信する場合に必須。文字エンコーディングを日本語用に設定します。
  • mb_internal_encoding("UTF-8")
    内部文字コードをUTF-8に統一します。

ヘッダーの設定

$headers には送信元メールアドレスやCc/Bccなどを設定できます。

$headers = "From: info@example.com\r\n";
$headers .= "Cc: sub@example.com\r\n";
$headers .= "Bcc: hidden@example.com\r\n";

文字化けを防ぐポイント

  • サーバーのPHP環境で mbstring が有効になっていることを確認する
  • 内部エンコーディングと送信内容を UTF-8で統一する
  • ヘッダーや本文に含まれる改行コードは基本的に \r\n を使う

メールの改行とRFC規格

メールの本文では76文字ごとに改行を入れるなど、RFC規格に沿った形式で送信する必要があります。

長文の場合はライブラリ(PHPMailerやSwiftMailerなど)を使うのもおすすめです。

mb_send_mail() 利用時の注意点

  • メール送信にはMTA(Postfix、Sendmailなど)がサーバーに正しく設定されている必要があります。
  • 共有サーバー環境では大量送信が制限されている場合があります。
  • スパム判定を受けないために、SPF/DKIMなどメール認証設定を行うことが望ましいです。

mb_send_mail() のデメリット

  • メール送信結果はtrue/falseしか返さず、エラー内容を詳しく取得できない
  • 添付ファイルやHTMLメールには標準で対応していない

→ 複雑なメール送信が必要なら、PHPMailerなどの外部ライブラリを検討しましょう。

セキュリティに関する注意点

メールヘッダーインジェクション対策

ユーザーが入力した内容をそのままメールヘッダー(件名、送信元、送信先など)に使用すると、改行文字を挿入されてヘッダーを不正に書き換えられる「ヘッダーインジェクション攻撃」のリスクがあります。送信前に改行文字を含まないかチェックしましょう。

function is_safe_header($str) {
    return !preg_match('/[\r\n]/', $str);
}

if (!is_safe_header($_POST['subject'])) {
    exit('不正な入力が検出されました。');
}

フォームのCSRF対策

お問い合わせフォームなどでメール送信を行う場合、CSRF(クロスサイトリクエストフォージェリ)対策を行いましょう。PHPでトークンを生成し、フォームに埋め込み、送信時に検証する方法が有効です。

// トークン生成
session_start();
if (empty($_SESSION['token'])) {
    $_SESSION['token'] = bin2hex(random_bytes(32));
}

// フォームに hidden で埋め込み
echo '<input type="hidden" name="token" value="' . htmlspecialchars($_SESSION['token'], ENT_QUOTES, 'UTF-8') . '">';

受信時には次のように検証します:

if (!isset($_POST['token']) || $_POST['token'] !== $_SESSION['token']) {
    exit('不正なリクエストです。');
}

入力内容のバリデーション・サニタイズ

  • メール本文や件名、送信先などにユーザー入力を使う場合は必ず htmlspecialchars()filter_var() でサニタイズしましょう。
  • メールアドレスは filter_var($email, FILTER_VALIDATE_EMAIL) で形式をチェックしてから送信に利用するのがおすすめです。

スパム対策(認証設定)

送信したメールが迷惑メール判定されないよう、以下のサーバー側設定も重要です。

  • SPFレコード:送信元IPをDNSに登録し、なりすましを防止。
  • DKIM署名:メール送信ドメインの正当性を保証。
  • DMARCポリシー:SPFやDKIMの結果に基づく受信側の対応を指定。

これらを設定することで、受信者に正しく届きやすくなるだけでなく、自社ドメインの信頼性を高められます。

まとめ

日本語メールを扱うなら mb_send_mail() が便利ですが、サーバー環境やスパム対策、エラーハンドリングまで意識して使うことが大切です。

要件によっては外部ライブラリも活用し、より確実なメール送信を実現しましょう。

公式リファレンス