WordPress wp_mail() の使い方
WordPress でメールを送信する際、最も基本的かつよく使われる関数が wp_mail() です。お問い合わせフォームやエラー通知など、WordPress サイトにおいてメール機能は欠かせません。
以下では wp_mail() の基本的な使い方から、$headers の指定方法、PHPMailer を直接使う方法、SMTP 設定や送信エラーの検出方法などを解説しています。
更新日:2025年06月16日
作成日:2025年06月13日
wp_mail() とは
wp_mail() は、WordPress が提供するメール送信用のラッパー関数で、PHP のメール送信機能をより簡単かつ柔軟に扱えるように設計されています。内部的にはメール送信ライブラリ PHPMailer を利用しており、SMTP 認証や HTML メール、添付ファイルの送信など、多くの機能を標準でサポートしています。
WordPress のコアに組み込まれているため、プラグインやテーマから簡単に呼び出して使用することができ、サイト全体で一貫したメール送信の方法を提供します。また、wp_mail() の動作はフィルターフックを通じてカスタマイズ可能で、独自の送信処理や外部SMTPサーバーの利用にも対応できます。
wp_mail() の動作は PHPMailer によって制御されており、その設定を書き換えることで送信方法(SMTP、Sendmail、mail())を切り替えることができます。
関連ページ:
wp_mail() の基本的な使い方
以下は wp_mail() の書式です。
wp_mail( $to, $subject, $message, $headers = '', $attachments = array() );
最もシンプルな使用例は以下の通りです。
$to = 'example@example.com';
$subject = 'テストメール';
$message = 'これは WordPress の wp_mail() を使ったテストメールです。';
wp_mail( $to, $subject, $message );
以下は引数の詳細です。$to, $subject, $message は必須です。
引数 | 型 | 説明 |
---|---|---|
$to | string|array | 宛先のメールアドレス。1つのアドレスを文字列で指定するか、複数の場合は配列で指定。 |
$subject | string | メールの件名。文字コードは自動的に適切に処理されます(デフォルトは UTF-8)。 |
$message | string | メールの本文。プレーンテキストまたは HTML(後述のヘッダー指定が必要)で送信可能。 |
$headers | string|array | 任意。追加のメールヘッダー(From, Cc, Bcc, Content-Type など)を指定。文字列または配列で指定。 |
$attachments | array | 任意。添付ファイルのパスを配列で指定。例:array( '/path/to/file1.jpg', '/path/to/file2.pdf' ) |
ヘッダーの使用例
HTMLメールを送るには、以下のように Content-Type ヘッダーを明示的に指定する必要があります。
$headers = array(
'From: サイト管理者 <admin@example.com>',
'Cc: cc@example.com',
'Bcc: bcc@example.com',
'Content-Type: text/html; charset=UTF-8' // Content-Type に text/html を指定
);
wp_mail( $to, $subject, $message, $headers ); // $to, $subject, $message は別途定義(省略)
添付ファイルの使用例
ファイルは絶対パスで指定する必要があります。
$attachments = array( WP_CONTENT_DIR . '/uploads/sample.pdf' );
$headers
$headers パラメータには、メールヘッダーを指定できます。これは、送信元情報や宛先の追加、本文の形式(プレーンテキストかHTMLか)などを制御するのに使います。
以下は $headers に指定できる主な項目です。
ヘッダー | 説明 | 使用例 |
---|---|---|
From | 差出人の名前とメールアドレスを指定 | From: 管理者 <admin@example.com> |
Reply-To | 返信先メールアドレスを指定 | Reply-To: support@example.com |
Cc | カーボンコピー送信先を指定 | Cc: ccuser@example.com |
Bcc | ブラインドカーボンコピー送信先を指定 | Bcc: hiddenuser@example.com |
Content-Type | メールの内容タイプを指定(HTML送信時など)。 | Content-Type: text/html; charset=UTF-8 |
MIME-Version | 通常は指定不要(PHPMailerが自動設定) | MIME-Version: 1.0 |
単一文字列で指定することもできますが、\r\n(CRLF)で区切る必要があります(配列なら自動で処理)。
$headers = "From: 管理者 <admin@example.com>\r\n";
$headers .= "Reply-To: support@example.com\r\n";
$headers .= "Content-Type: text/html; charset=UTF-8\r\n";
配列で指定すると、可読性が高くなり、複数ヘッダーも扱いやすくなります。
$headers = array(
'From: 管理者 <admin@example.com>',
'Reply-To: support@example.com',
'Cc: ccuser@example.com',
'Bcc: bccuser@example.com',
'Content-Type: text/html; charset=UTF-8'
);
注意点
- From ヘッダーを指定しない場合、WordPress のデフォルト設定(wordpress@ドメイン名)が使用されます。名前を省略すると WordPress が使われます。例:WordPress <wordpress@localhost>
- HTML メールを送信するには、必ず Content-Type: text/html を指定します。Content-Type を省略した場合のデフォルトは text/plain; charset=UTF-8(テキストメール)になります。
名前付きのメールアドレスを指定
Reply-To や Cc などのヘッダーに名前付きのメールアドレスを指定する場合は、以下の形式で名前とメールアドレスを組み合わせて < >
でメールアドレスを囲みます。
名前 <メールアドレス>
これは From, Reply-To, Cc, Bcc のすべてで使用できます。
$headers = array(
'From: 管理者 <admin@example.com>',
'Reply-To: サポート担当 <support@example.com>',
'Cc: 山田 太郎 <taro@example.com>',
'Bcc: 鈴木 花子 <hanako@example.com>',
'Content-Type: text/html; charset=UTF-8'
);
注意点
- 名前に全角スペースや記号が含まれていても OK(ただし、文字コードが正しく処理されるよう charset=UTF-8 の指定はしておくと安全です)。
- WordPress(PHPMailer)はこの形式に対応しており、必要に応じて自動的にエンコードされます。
- From を含め、これらのヘッダーを複数指定したい場合は、カンマ区切りで並べるか、配列の複数行として記述できます。
複数の Cc を指定する例
$headers = array(
'Cc: 山田 太郎 <taro@example.com>, 鈴木 次郎 <jiro@example.com>'
);
または、
$headers = array(
'Cc: 山田 太郎 <taro@example.com>',
'Cc: 鈴木 次郎 <jiro@example.com>'
);
デフォルト値
wp_mail() を使用する際に WordPress は内部的に PHPMailer を利用してメールを構築します。
$headers を省略した場合、デフォルトのヘッダー値は以下のとおりです。
ヘッダー | デフォルト値 | 備考 |
---|---|---|
From | wordpress@{現在のサイトのドメイン} | wp_mail_from フィルターで変更可能 |
Reply-To | 指定されない(未設定) | 明示的に指定しない限り設定されない |
Cc | 指定されない(未設定) | $headers で指定しない限り送信されない |
Bcc | 指定されない(未設定) | 同上 |
Content-Type | text/plain; charset=UTF-8 | wp_mail_content_type フィルターで変更可能 |
MIME-Version | 1.0 | PHPMailer により自動で付加される |
X-Mailer | PHPMailer {version} | PHPMailer により自動で追加される |
Date | 現在日時(Date: ...) | 自動的に付加される(RFC 準拠) |
Message-ID | 自動生成された一意の ID | PHPMailer により自動生成 |
Return-Path | メールサーバーによって処理される(通常は From) | SMTP サーバーやサーバー設定に依存 |
簡単なメール送信テストの例
以下は、クラシックテーマで使える wp_mail() の動作確認用の固定ページテンプレートです。このテンプレートでは、宛先メールアドレスをフォームで入力し、ボタンを押すと wp_mail() を使ってテストメールが送信されます。
ページテンプレートを作成
以下を page-mail-test.php などのファイル名で wp-content/themes/your-theme/ に保存します。
$headers の From のメールアドレスにはサイトの有効なアドレスを指定する必要があります。
<?php
/**
* Template Name: メール送信テスト
*/
get_header(); // ヘッダーの読み込み
if (
$_SERVER['REQUEST_METHOD'] === 'POST' // リクエストが POST メソッドであり、
&& isset($_POST['test_email']) // $_POST['test_email'] が存在し、
&& check_admin_referer('send_test_mail') // ノンスの検証に成功した場合
) {
$to = sanitize_email($_POST['test_email']); // 宛先メールアドレスをサニタイズ
$subject = 'WordPress テストメール'; // メールの件名
$message = "これは wp_mail() によるテスト送信です。\n\n送信日時: " . current_time('Y-m-d H:i:s'); // メール本文を作成
$headers = [
'Content-Type: text/plain; charset=UTF-8', // プレーンテキスト・UTF-8 のヘッダー
'From: WordPress <no-reply@example.com>' // 送信元アドレス(From)を指定( ※ 実際の値に変更)
];
// wp_mail() でメール送信
$mail_sent = wp_mail($to, $subject, $message, $headers);
if ($mail_sent) {
// メール送信成功時のメッセージ表示
echo '<div style="padding:10px; border:1px solid green; color:green;">メール送信に成功しました。</div>';
} else {
// メール送信失敗時のメッセージ表示
echo '<div style="padding:10px; border:1px solid red; color:red;">メール送信に失敗しました。</div>';
}
}
?>
<div class="wrap">
<h2>✉️ テストメール送信</h2>
<form method="post"> <!-- POST メソッドでフォーム送信 -->
<?php wp_nonce_field('send_test_mail'); ?><!-- フォームに CSRF 対策用の隠しフィールドを出力 -->
<p>
<label for="test_email">宛先メールアドレス:</label><br>
<input type="email" name="test_email" id="test_email" required style="width: 300px;"><!-- 宛先メールアドレス入力欄 -->
</p>
<p>
<button type="submit">テストメールを送信</button> <!-- 送信ボタン -->
</p>
</form>
</div>
<script>
// 再読み込みによる二重送信防止
if (window.history.replaceState) {
window.history.replaceState(null, null, window.location.href);
}
</script>
<?php get_footer(); // フッターの読み込み
?>
check_admin_referer('send_test_mail')
と wp_nonce_field('send_test_mail')
は、CSRF 対策として WordPress が提供しているノンス(nonce)の仕組みを使っています。
管理画面から公開
管理画面「固定ページ > 新規追加」で新規に固定ページを作成します。
タイトルやスラッグは任意ですが、例えば mail test というタイトルで作成すると、スラッグは自動的に mail-test になります。
右側サイドバーの「テンプレート」で「メール送信テスト」を選択して保存し、ページを公開します。
ページにアクセスすると、例えば以下のように表示されるのでメール送信をテストすることができます。
wp_mail() の代わりに PHPMailer を直接使う
以下は、前述のテンプレート page-mail-test.php を wp_mail() の代わりに PHPMailer を直接使うように書き換えた例です(参考まで)。
$headers 配列は wp_mail() 用のもので、PHPMailer では $mail->setFrom() や $mail->addCustomHeader() を使います。このコードでは $headers は使われていないため、削除可能です。
パスワードなどの機密情報は wp-config.php で定数化して、ここで defined() で取得するようにするとより安全です。
ABSPATH は WordPress の ルートディレクトリの絶対パスで、WPINC は WordPress のコアファイルが格納されているサブディレクトリ名(通常は wp-includes)です。ABSPATH . WPINC は PHPMailer など、WordPress コア内のライブラリファイルをパス指定で読み込むときに使われます。
<?php
/**
* Template Name: メール送信テスト
*/
get_header(); // WordPress のヘッダーを読み込む(テーマの一部)
// PHPMailer クラスと Exception クラスを名前空間付きで使用宣言
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
// WordPress に同梱されている PHPMailer 関連のファイルを読み込む
require_once ABSPATH . WPINC . '/PHPMailer/PHPMailer.php';
require_once ABSPATH . WPINC . '/PHPMailer/Exception.php';
require_once ABSPATH . WPINC . '/PHPMailer/SMTP.php';
// POST リクエストかつ email が送信され、CSRF ノンスが有効な場合
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['test_email']) && check_admin_referer('send_test_mail')) {
// PHPMailer インスタンスを作成(例外を有効にして初期化)
$mail = new PHPMailer(true);
// 入力されたメールアドレスをサニタイズ
$to = sanitize_email($_POST['test_email']);
// 件名と本文の設定
$subject = 'WordPress テストメール';
$message = "これは PHPMailer() によるテスト送信です。\n\n送信日時: " . current_time('Y-m-d H:i:s');
// ヘッダー情報(今回は未使用だが構造保持のため定義 → 使用しないので削除可能)
$headers = [
'Content-Type: text/plain; charset=UTF-8',
'From: No Reply <no-reply@example.com>'
];
try {
// SMTP 経由でメールを送信する設定
$mail->isSMTP(); // SMTP を使用
$mail->Host = 'smtp.example.com'; // SMTP サーバーのホスト名
$mail->SMTPAuth = true; // SMTP 認証を有効化
$mail->Username = 'your-smtp-username'; // SMTP ユーザー名
$mail->Password = 'your-smtp-password'; // SMTP パスワード
$mail->SMTPSecure = 'tls'; // 暗号化方式(tls または ssl)
$mail->Port = 587; // 使用するポート(通常 587)
// 送信者情報を設定
$mail->setFrom('info@example.com', 'your site name');
// 宛先アドレスを追加
$mail->addAddress($to);
// 件名と本文を設定
$mail->Subject = $subject;
$mail->Body = $message;
// メール送信を実行
$mail->send();
// 成功メッセージを表示
echo '<div style="padding:10px; border:1px solid green; color:green;">メール送信に成功しました。</div>';
} catch (Exception $e) {
// エラーメッセージを表示(例外が発生した場合)
echo '<div style="padding:10px; border:1px solid red; color:red;">メール送信に失敗しました。</div>';
}
}
?>
<div class="wrap">
<h2>✉️ テストメール送信</h2>
<form method="post"> <!-- POST メソッドでフォーム送信 -->
<?php wp_nonce_field('send_test_mail'); ?><!-- フォームに CSRF 対策用の隠しフィールドを出力 -->
<p>
<label for="test_email">宛先メールアドレス:</label><br>
<input type="email" name="test_email" id="test_email" required style="width: 300px;"><!-- 宛先メールアドレス入力欄 -->
</p>
<p>
<button type="submit">テストメールを送信</button> <!-- 送信ボタン -->
</p>
</form>
</div>
<script>
// 再読み込みによる二重送信防止
if (window.history.replaceState) {
window.history.replaceState(null, null, window.location.href);
}
</script>
<?php get_footer(); // フッターの読み込み
?>
ブロックテーマのテンプレート
ブロックテーマテンプレートは、/templates/ フォルダに配置する HTMLファイルで定義されます。PHP ではなく HTML 構文で書かれ、WordPress がブロック単位で解釈・描画します。
但し、wp_mail() を用いたサーバーサイド処理は HTML ファイル内では直接書けないため、メール送信処理自体は別途 PHP テンプレートパーツや カスタムブロック、ショートコードなどに委任する形になります。
以下は、wp-content/themes/your-theme/templates/mail-test.html に配置するテンプレートファイルの例です(一応テスト用としては機能しますが、本番環境では使用できるものではありません)。
このテンプレートでは、[mail_test_form] というショートコードを使ってフォーム部分とメール送信処理をPHPで実行します。
<!-- wp:template-part {"slug":"header"} /-->
<!-- wp:group {"layout":{"type":"constrained"}} -->
<div class="wp-block-group" style="padding: 2rem;">
<!-- wp:heading {"level":1} -->
<h2>✉️ テストメール送信</h2>
<!-- /wp:heading -->
<!-- wp:shortcode -->
[mail_test_form]
<!-- /wp:shortcode -->
</div>
<!-- /wp:group -->
<!-- wp:template-part {"slug":"footer"} /-->
ショートコードの PHP 実装(テーマの functions.php に追加)
add_shortcode('mail_test_form', function () {
ob_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['test_email']) && check_admin_referer('send_test_mail')) {
$to = sanitize_email($_POST['test_email']);
$subject = 'WordPress テストメール';
$message = "これは wp_mail() によるテスト送信です。\n\n送信日時: " . current_time('Y-m-d H:i:s');
$headers = [
'Content-Type: text/plain; charset=UTF-8',
'From: WDL <info@webdesignleaves.com>'
];
$mail_sent = wp_mail($to, $subject, $message, $headers);
echo '<div style="padding:10px;border:1px solid ' . ($mail_sent ? 'green' : 'red') . ';color:' . ($mail_sent ? 'green' : 'red') . ';">';
echo $mail_sent ? 'メール送信に成功しました。' : 'メール送信に失敗しました。';
echo '</div>';
}
?>
<form method="post">
<?php wp_nonce_field('send_test_mail'); ?>
<p>
<label for="test_email">宛先メールアドレス:</label><br>
<input type="email" name="test_email" id="test_email" required style="width: 300px;">
</p>
<p>
<button type="submit">テストメールを送信</button>
</p>
</form>
<script>
if (window.history.replaceState) {
window.history.replaceState(null, null, window.location.href);
}
</script>
<?php
return ob_get_clean();
});
投稿タイプテンプレートとして登録
作成したテンプレートを WordPress ダッシュボードの固定ページで選べるようにするには、テーマの theme.json に以下を追加して、「メール送信テスト」として登録します。
"customTemplates": [
{
"name": "mail-test",
"postTypes": ["page"],
"title": "メール送信テスト"
}
]
管理画面から公開
管理画面「固定ページ > 新規追加」で新規に固定ページを作成します。
タイトルやスラッグは任意ですが、例えば mail test というタイトルで作成すると、スラッグは自動的に mail-test になります。
右側サイドバーの「テンプレート」の部分をクリックして「テンプレートを変更」を選択します。「テンプレートを選択」で作成したテンプレート「メール送信テスト」を選択します。
必要に応じて「メール送信テスト」のテンプレートをサイトエディターで編集します。
必要に応じて「メール送信テスト」をクリックして「テンプレートを編集」を選択してサイトエディターで編集します。
ページにアクセスすると、例えば以下のように表示されるのでメール送信をテストすることができます。
メールが送信できない
上記サンプルを実行して「メール送信に成功しました。」と表示されるのに、メールが送信できないことがあります。
ローカル(MAMP/XAMPP など)には MTA(sendmail/postfix)がインストールされていない、または無効になっている可能性が高いので、別途 SMTP 設定をしないとメール送信できません。
また、本番環境でメールが送信できない場合は、以下の From アドレスを確認すると良いかもしれません。
From アドレスが SMTP 認証ユーザーと一致していない
多くのレンタルサーバーでは、SMTP 認証で使用するユーザー名(例: info@xxxx.com)と、送信元 (From) メールアドレスが一致していないと送信を拒否する設定になっていることがあります。
SMTP 設定
wp_mail() 自体には SMTP 設定を直接渡す機能はないため、WordPress の内部で使われている PHPMailer の設定を、phpmailer_init フックで変更(設定)します。
または、より簡単で管理しやすい方法としては、SMTP プラグイン(例:WP Mail SMTP)などを使って設定することができます。
phpmailer_init を使う
phpmailer_init フックで SMTP を設定する例です。以下を functions.php に記述します。
// 最低限指定すべき項目
add_action('phpmailer_init', function($phpmailer) {
$phpmailer->isSMTP();
$phpmailer->Host = 'smtp.example.com'; // SMTP サーバー
$phpmailer->SMTPAuth = true; // SMTP認証
$phpmailer->Port = 587; // ポート番号(通常は 587 or 465)
$phpmailer->Username = 'your-smtp-username';// SMTP ユーザー名
$phpmailer->Password = 'your-smtp-password';// SMTP パスワード
$phpmailer->SMTPSecure = 'tls'; // または 'ssl'
$phpmailer->From = 'your@email.com'; // 差出人メールアドレス
$phpmailer->FromName = 'あなたのサイト名'; // 差出人名
});
注意点
- パスワードなどの情報は、できれば .env ファイルや wp-config.php の定数にして保護します。
- From や FromName を固定したい場合、wp_mail_from・wp_mail_from_name フィルターを使用することができます。
wp-config.php に定数として定義
パスワードなどの機密情報を functions.php に直接書かず、wp-config.php に定数として定義することで、安全かつ管理しやすくなります。
wp-config.php に次のような定数を追加します。これらは define() によって WordPress 起動後にグローバルで使えるようになります。
/* Add any custom values between this line and the "stop editing" line. */
/** 独自の定数を追加 **/
define('SMTP_HOST', 'smtp.example.com');
define('SMTP_AUTH', true);
define('SMTP_PORT', 587);
define('SMTP_USER', 'your-smtp-username');
define('SMTP_PASS', 'your-smtp-password');
define('SMTP_SECURE', 'tls');
define('SMTP_FROM', 'your@email.com');
define('SMTP_FROM_NAME', 'あなたのサイト名');
/* That's all, stop editing! Happy publishing. */
functions.php で定数を使用するように変更します。
以下の例では $phpmailer->From のデフォルト値に get_option('admin_email') で管理者メールアドレスを指定していますが、必要に応じて適宜変更します。
add_action('phpmailer_init', function($phpmailer) {
$phpmailer->isSMTP();
$phpmailer->Host = defined('SMTP_HOST') ? SMTP_HOST : '';
$phpmailer->SMTPAuth = defined('SMTP_AUTH') ? SMTP_AUTH : true;
$phpmailer->Port = defined('SMTP_PORT') ? SMTP_PORT : 587;
$phpmailer->Username = defined('SMTP_USER') ? SMTP_USER : '';
$phpmailer->Password = defined('SMTP_PASS') ? SMTP_PASS : '';
$phpmailer->SMTPSecure = defined('SMTP_SECURE') ? SMTP_SECURE : 'tls';
$phpmailer->From = defined('SMTP_FROM') ? SMTP_FROM : get_option('admin_email');
$phpmailer->FromName = defined('SMTP_FROM_NAME') ? SMTP_FROM_NAME : get_bloginfo('name');
});
メリット
- セキュリティ向上 : 認証情報を functions.php などのテーマファイルに含めない。
- コードの再利用性 : 他のプラグインや機能からも定数として共通利用できる。
- 設定の一元化 : wp-config.php だけ変更すれば、環境に応じて切り替え可能(本番用/開発用など)。
phpmailer_init のデフォルト値
以下は、phpmailer_init フックを使って SMTP を設定する場合に、それぞれのプロパティを指定しなかったときの WordPress/PHPMailer におけるデフォルト値です。
プロパティ | デフォルト値 | 補足 |
---|---|---|
$phpmailer->isSMTP() | 呼ばなければ mail() が使用される(SMTP無効) | SMTPを使うなら必ず呼び出す必要あり |
$phpmailer->Host | 'localhost' | SMTP ホストが指定されない場合はローカル |
$phpmailer->SMTPAuth | false | 認証なし(=ユーザー名・パスワード不要) |
$phpmailer->Port | 25 | TLSやSSLを使わない場合の標準SMTPポート |
$phpmailer->Username | 空文字 | SMTPAuth = true でも未設定ならログイン失敗 |
$phpmailer->Password | 空文字 | 同上 |
$phpmailer->SMTPSecure | 空文字 | 暗号化なし。'tls' も 'ssl' も使用されない |
$phpmailer->From | wordpress@{サーバーのホスト名} | 例: wordpress@localhost(ホスト名依存) |
$phpmailer->FromName | 'WordPress' |
よくあるミス
- isSMTP() を指定しない → mail() 関数が使われ、SMTP 設定は一切無視される
- SMTPAuth = true なのに Username / Password を設定しない → エラー
- Host を省略 → localhost を見に行くが、多くのローカル環境では SMTP サーバーが立っていないので失敗
- From を設定しない → wordpress@localhost のようになり、スパム判定されやすい
wp_mail() のデフォルト挙動(SMTP 設定をしていない場合)
- PHPの mail() 関数が使われる
- つまり、WordPress や PHPMailer は SMTP を使用しません。
- サーバー側に設定された sendmail や postfix などの MTA(メール転送エージェント)を通してメールが送信されます。
- ローカル環境では mail() がうまく動作しないことが多く、メールが届かない原因になります。
- 差出人(From)アドレスのデフォルト
- アドレス: wordpress@{ホスト名}(例: wordpress@localhost ※ ドメインがないので、正しいメールアドレスとして認識されず、エラーの原因になる)
- 名前: WordPress
mail() 関数を使用する場合、TLS(暗号化)やポート番号の制御は基本的にできません。これらは、OS 上で動作する MTA(Mail Transfer Agent)= sendmail / postfix / exim などの設定に完全に依存します。
モード | メールの送信経路 | TLS やポート |
---|---|---|
mail() 関数 | PHP → MTA(sendmail/postfix) | MTA の設定に依存 |
SMTP モード(PHPMailer) | PHP → SMTP サーバー | PHP コード内で自由に設定可能 |
PHPMailer のエラーログを有効化
WordPress の wp_mail() はエラー内容を返さない(単に false を返す)ため、詳細なエラーを知るには PHPMailer のデバッグ出力を有効にする必要があります。
add_action('phpmailer_init', function($phpmailer) {
$phpmailer->isSMTP();
$phpmailer->SMTPDebug = 2; // または 3、4(数字が大きいほど詳細)
$phpmailer->Debugoutput = function($str, $level) {
error_log("PHPMailer debug ($level): $str");
};
$phpmailer->Host = 'smtp.example.com';
$phpmailer->SMTPAuth = true;
$phpmailer->Port = 587;
$phpmailer->Username = 'your-smtp-username';
$phpmailer->Password = 'your-smtp-password';
$phpmailer->SMTPSecure = 'tls';
$phpmailer->From = 'your@email.com';
$phpmailer->FromName = 'あなたのサイト名';
});
これでエラー内容が WordPress の error_log() に出力されるようになります。(wp-content/debug.log やサーバーのエラーログに出力)
wp_mail() エラー検出 wp_mail_failed フック
PHPMailer のエラーログを有効化しても、wp_mail() のエラーを全て検知できるわけではありません。
wp_mail_failed フックを使うと、wp_mail() の内部で何が失敗したのか、PHPMailer の例外も含めて把握できるので、以下を functions.php に記述すると、wp_mail() のトラブルシュートに役立ちます。
// wp_mail() のエラーを検出
function mail_failure($wp_error) {
error_log('Mailing Error Found: ');
error_log(print_r($wp_error, true));
}
add_action('wp_mail_failed', 'mail_failure', 10, 1);
SMTP 通信のログ出力 SMTPDebug
SMTPDebug は PHPMailer のプロパティで、SMTP モードが有効な場合に SMTP 通信のログ出力レベルを制御します。セキュリティ上、本番環境ではオフにします。
add_action('phpmailer_init', function($phpmailer) {
// サーバーとの通信内容(送受信されるコマンドとレスポンス)をすべて表示 ※ 本番環境ではオフにします。
$phpmailer->SMTPDebug = \PHPMailer\PHPMailer\SMTP::DEBUG_SERVER;
$phpmailer->isSMTP(); // SMTPDebug は SMTP 使用時のみ有効
$phpmailer->Host = 'smtp.example.com';
$phpmailer->SMTPAuth = true;
$phpmailer->Username = 'user@example.com';
$phpmailer->Password = 'password';
$phpmailer->SMTPSecure = 'tls';
$phpmailer->Port = 587;
});
上記の例の場合、SMTP::DEBUG_SERVER と指定しているので、サーバーとの通信内容(送受信されるコマンドとレスポンス)をすべて表示します。
これにより、メール送信エラーの原因特定に役立ちます。
出力先に注意
PHPMailer はデフォルトで echo を使ってログを出力するため、管理画面やフロントに直接出力されます。そのため、デバッグ時以外は 無効化しておくのが安全です。
レベル名 | 値 | 出力内容 |
---|---|---|
SMTP::DEBUG_OFF | 0 | 出力なし(デフォルト) |
SMTP::DEBUG_CLIENT | 1 | クライアント側の操作ログのみ |
SMTP::DEBUG_SERVER | 2 | クライアントとサーバー間の通信ログ |
SMTP::DEBUG_CONNECTION | 3 | 通信の詳細ログ(I/O レベル) |
SMTP::DEBUG_LOWLEVEL | 4 | さらに低レベルのすべての情報 |
以下はメール送信失敗時の出力例です(SMTP::DEBUG_SERVER を指定)。
以下はメール送信成功時の出力例です(SMTP::DEBUG_SERVER を指定)。
wp_mail_from と wp_mail_from_name フィルター
wp_mail_from および wp_mail_from_name フィルターは、WordPress 全体で送信されるメールの From アドレスと表示名をカスタマイズするためのフィルターです。
wp_mail_from と wp_mail_from_name フィルターは wp_mail() の内部処理で $headers に From: が含まれていないときに使われます。
// 送信元メールアドレス(From:)を変更するためのフィルター
add_filter('wp_mail_from', function() {
// 返り値に任意のメールアドレス(正しい形式である必要あり)を返すことで変更可能
return 'info@example.com';
});
// 送信元の「表示名」(From: 表示名 <メールアドレス> の表示名部分)を変更するためのフィルター
add_filter('wp_mail_from_name', function() {
// 任意の文字列を返すことで表示名を変更可能
return 'カスタム名';
});
From の設定優先順位
From が $headers や wp_mail_from フック、または phpmailer_init の $phpmailer->From に設定されている場合、wp_mail() は最終的に $headers を最優先します。
以下が優先順位(高い順)です。
- $headers の From
- この設定があると、他のすべての方法(フィルター・phpmailer_init)は無視されます。
- wp_mail_from / wp_mail_from_name フィルター
- これらのフィルターは、wp_mail() の内部処理で $headers に From: が含まれていないときに使われます。
- phpmailer_init での $phpmailer->From / $phpmailer->FromName
- この設定は wp_mail() がフィルターで上書きする前の初期値にすぎないため、上記のいずれかの方法が使われると上書きされます。
但し、phpmailer_init で $phpmailer->From / $phpmailer->FromName が設定してある場合でも、ローカル環境では、デフォルトの wordpress@localhost が使われてしまうため、wp_mail_from / wp_mail_from_name フィルターまたは $headers の From を設定するのが確実です。
SMTP プラグインを使う
WP Mail SMTP by WPForms などのプラグインを使って簡単に設定することができます。
「WP Mail SMTP by WPForms」などのSMTP系プラグインは、WordPressに同梱されているPHPMailerライブラリの設定をGUI(管理画面)から簡単に制御できるようにするためのツールです。
具体的には、プラグインは以下のようなことを行います。
phpmailer_init フィルターを使って PHPMailer を設定
プラグインは、phpmailer_init アクションフックを使って、PHPMailer の以下のプロパティを動的に上書きします。
- $phpmailer->isSMTP();
- $phpmailer->Host
- $phpmailer->Port
- $phpmailer->Username
- $phpmailer->Password
- $phpmailer->From
- $phpmailer->FromName
- $phpmailer->SMTPSecure など
GUI での設定変更を可能に
通常、functions.php などにコードを書く必要がある設定を、WordPress の管理画面から操作できるようにしてくれるので簡単です。
利点(まとめ)
- UIで設定ができる
- Gmail、SendGrid、SMTP など多様な送信方法に対応
- 認証情報をセキュアに管理しやすい(定数化することが推奨されています)
使用手順(WP Mail SMTP の例)
- 管理画面からプラグインをインストール・有効化
- 「WP Mail SMTP セットアップウィザード」を実行。
- または、「WP Mail SMTP」設定ページへ移動して SMTP サーバー情報を入力(この画面からセットアップウィザードを起動することもできます)
- 送信元メールアドレス
- 送信者名
- メーラー(Gmail なども指定可能。候補にない場合は「その他の SMTP」)
- SMTP ホスト(例: smtp.example.com など)
- 暗号化方式(TLS または SSL)
- SMTP ポート(通常 587 または 465)
- 認証(オン)
- SMTP ユーザー名
- SMTP パスワード
セットアップウィザードは、一度実行後は「WP Mail SMTP」設定ページから再度起動することができます。セットアップウィザードを完了するとテストメールが送信されます。