お問い合わせフォームや自動返信メールなど、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()
が便利ですが、サーバー環境やスパム対策、エラーハンドリングまで意識して使うことが大切です。
要件によっては外部ライブラリも活用し、より確実なメール送信を実現しましょう。