1. ホーム
  2. WordPress

【WordPress】wp_mail() でメールを送信する方法|ヘッダー・HTMLメール・添付ファイルを解説

Share

WordPress でお問い合わせの通知や会員向けのお知らせなど、プログラムからメールを送りたい場面は少なくありません。そんなときに使うのが wp_mail() です。PHP 標準の mail()mb_send_mail() を直接呼ぶこともできますが、WordPress では wp_mail() を使うことで、テーマやプラグインの設定・フィルターと連携した送信ができます。この記事では、wp_mail() の基本的な送り方から、ヘッダーの指定、HTML メール、添付ファイル、送信に失敗したときの調べ方までを、初心者〜中級者の方に向けて解説します。

wp_mail() とは何か

wp_mail() は、WordPress が用意しているメール送信用の関数です。内部では PHPMailer というメール送信ライブラリを使って組み立てと送信を行っています。PHP 標準の mail() を直接使う代わりにこの関数を経由することで、送信元アドレスや文字コード、コンテンツタイプなどを WordPress のフィルターフックから調整できるようになり、SMTP プラグインなどとも自然に連携できます。

そのため、WordPress のテーマやプラグインからメールを送るときは、原則として wp_mail() を使うのがおすすめです。PHP 標準の mb_send_mail() は日本語メールを手軽に送れる関数ですが、WordPress の設定やフィルターとは無関係に動くため、WordPress サイト内で送信管理を一元化したい場合は wp_mail() のほうが扱いやすくなります。

関数のシグネチャと引数

wp_mail() のシグネチャは次のとおりです。第4引数以降は省略できます。

functions.php
wp_mail(
    $to,                    // 宛先(string または array)
    $subject,               // 件名
    $message,               // 本文
    $headers = '',          // ヘッダー(string または array)省略可
    $attachments = array()  // 添付ファイルのパス(string または array)省略可
);

それぞれの引数の意味は次の表のとおりです。

引数意味
$to宛先のメールアドレス。カンマ区切りの文字列、または配列で複数指定できます。
$subjectメールの件名。
$messageメール本文。既定ではプレーンテキストとして扱われます。
$headersFrom や Reply-To、Content-Type などの追加ヘッダー。文字列でも配列でも渡せます。省略可。
$attachments添付するファイルの絶対パス。文字列(1件)または配列(複数)で指定します。省略可。

基本の送信例

まずは最小限のコードで、プレーンテキストのメールを1通送ってみます。宛先・件名・本文の3つを渡すだけです。

functions.php
$to      = 'user@example.com';
$subject = 'お問い合わせありがとうございます';
$message = "お問い合わせを受け付けました。\n担当者より折り返しご連絡いたします。";

$result = wp_mail( $to, $subject, $message );

宛先を複数にしたい場合は、'a@example.com, b@example.com' のようにカンマ区切りの文字列にするか、array( 'a@example.com', 'b@example.com' ) のように配列で渡します。件名や本文の日本語は、WordPress 側で UTF-8 として適切に処理されるため、文字コード変換を自分で行う必要は基本的にありません。

ヘッダーで送信元や宛先を細かく指定する

第4引数の $headers を使うと、送信元(From)や返信先(Reply-To)、Cc・Bcc、コンテンツタイプなどを指定できます。ヘッダーは1行1項目の文字列でも、各行を要素にした配列でも渡せます。項目が複数あるときは、配列で書くほうが見やすくおすすめです。

functions.php
$headers = array(
    'From: サイト管理者 <info@example.com>',
    'Reply-To: support@example.com',
    'Cc: manager@example.com',
    'Bcc: log@example.com',
);

wp_mail( $to, $subject, $message, $headers );

同じ内容を文字列で渡すこともできます。その場合は、各ヘッダーを改行(\n)でつなぎます。ダブルクォートの文字列内で \n を使う点に注意してください。

functions.php
$headers  = "From: サイト管理者 <info@example.com>\n";
$headers .= "Reply-To: support@example.com\n";

wp_mail( $to, $subject, $message, $headers );

よく使うヘッダーの意味を整理すると次のようになります。

ヘッダー役割
From送信元アドレスと表示名。指定しない場合は既定の送信元が使われます。
Reply-To受信者が返信したときの宛先。From と分けたいときに指定します。
Ccカーボンコピー。他の受信者にも見える形で送る宛先。
Bccブラインドカーボンコピー。他の受信者には見えない宛先。
Content-Type本文の種類。HTML メールにするときは text/html を指定します。

なお From を指定しない場合の既定の送信元アドレスは wordpress@ドメイン名、表示名は WordPress になります。これらは wp_mail_from フィルターと wp_mail_from_name フィルターを使って、サイト全体でまとめて変更することもできます。特定のメールだけ変えたいときは、上記のように From ヘッダーを渡す方法が手軽です。

HTML メールを送る

wp_mail() は既定ではプレーンテキストとしてメールを送ります。本文に HTML を書いてそのまま表示させたい場合は、コンテンツタイプを text/html に変える必要があります。方法は2つあります。

1つ目は、先ほどのヘッダーに Content-Type: text/html; charset=UTF-8 を含める方法です。単発の送信であればこれが最も簡単です。

functions.php
$message = '<p>ご登録ありがとうございます。</p>'
         . '<p><a href="https://example.com/mypage">マイページはこちら</a></p>';

$headers = array( 'Content-Type: text/html; charset=UTF-8' );

wp_mail( $to, $subject, $message, $headers );

2つ目は、wp_mail_content_type フィルターでコンテンツタイプを text/html に切り替える方法です。フィルターを使う場合に注意したいのは、これがそのリクエスト中に送られるすべてのメールに影響するという点です。HTML メールを送り終えたら、必ず元のプレーンテキストに戻しておきましょう。戻さないと、そのあと WordPress が送る通知メールなどまで HTML 扱いになり、意図しない表示崩れの原因になります。

functions.php
// コンテンツタイプを text/html に変えるコールバック
function my_set_html_content_type() {
    return 'text/html';
}

add_filter( 'wp_mail_content_type', 'my_set_html_content_type' );

wp_mail( $to, $subject, $message );

// 送信後に元へ戻す(他のメールに影響させないため)
remove_filter( 'wp_mail_content_type', 'my_set_html_content_type' );

ファイルを添付する

第5引数の $attachments にファイルの絶対パスを渡すと、そのファイルを添付できます。1件なら文字列、複数なら配列で指定します。URL ではなくサーバー上のファイルパスを渡す点に注意してください。アップロードディレクトリのパスは wp_upload_dir() などから取得できます。

functions.php
$upload_dir = wp_upload_dir();

$attachments = array(
    $upload_dir['basedir'] . '/invoices/invoice-001.pdf',
    $upload_dir['basedir'] . '/invoices/terms.pdf',
);

wp_mail( $to, $subject, $message, $headers, $attachments );

添付ファイルが1件だけであれば、配列にせず $upload_dir['basedir'] . '/invoices/invoice-001.pdf' のように文字列で渡してもかまいません。指定したパスにファイルが存在しないと添付されないため、パスが正しいかどうかは事前に確認しておくと安心です。

戻り値と送信の成否を確認する

wp_mail() は、メールの送信処理が成功した場合に true、失敗した場合に false を返します。ここでの「成功」はあくまで送信処理を受け付けたことを意味し、相手に確実に届いたことまでを保証するものではない点は覚えておきましょう。

送信に失敗したときの原因を詳しく知りたい場合は、wp_mail_failed アクションフックを使います。このフックには WP_Error オブジェクトが渡され、そこからエラーメッセージを取り出せます。ログに書き出しておくと、トラブル発生時の調査に役立ちます。

functions.php
function my_log_mail_error( $wp_error ) {
    // WP_Error からメッセージを取り出してログに残す
    error_log( 'メール送信エラー: ' . $wp_error->get_error_message() );
}
add_action( 'wp_mail_failed', 'my_log_mail_error' );

メールが届かないときに疑うこと

コードは正しいのにメールが届かない、というのはよくある悩みです。多くの場合、原因はコードそのものではなく、サーバーからのメール送信環境にあります。

サーバーの mail() 設定に依存している

既定の wp_mail() は、最終的にサーバーの PHP mail() 機能を使って送信します。共有サーバーによってはこの送信が制限されていたり、送信元ドメインと実際のサーバーが一致しないことで、受信側に迷惑メールと判定されて届かない、といったことが起こります。まずは迷惑メールフォルダも確認してみてください。

SMTP プラグインで送信経路を変える

確実に届けたい場合は、SMTP 経由で送信するのが定番の解決策です。「WP Mail SMTP」などのプラグインを導入すると、Gmail や送信専用のメールサービスの SMTP サーバーを使って wp_mail() の送信を行えるようになります。これらのプラグインは wp_mail() の内部処理に介入する仕組みになっているため、送信コード側を書き換える必要はありません。wp_mail() を使っておけば、あとからプラグインを入れるだけで送信経路を差し替えられる、というのも WordPress でこの関数を使う大きな利点です。

まとめ

wp_mail() は、宛先・件名・本文を渡すだけでメールを送れる WordPress のメール送信関数です。第4引数の $headers で From や Reply-To、Cc・Bcc、Content-Type を指定でき、これは文字列でも配列でも渡せます。HTML メールにするには Content-Type: text/html をヘッダーに含めるか、wp_mail_content_type フィルターで切り替えたうえで送信後に元へ戻します。ファイルを添付したいときは第5引数に絶対パスを渡します。戻り値は成功で true、失敗の詳細は wp_mail_failed アクションから取得できます。内部が PHPMailer ベースであることや、届かないときは WP Mail SMTP などの SMTP プラグインで送信経路を変えられることも押さえておくと、実運用でつまずきにくくなります。

参考ページ