WordPress:メール送信にGmailのSMTPを使う(プラグインなし)

WordPress:メール送信にGmailのSMTPを使う(プラグインなし)

Docker を使ってローカルでテーマを作っていますのでメール送信のテストが出来ません。また、実際に可動させる場合でもレンタルサーバーのメール設定をせずにテーマ内で全て完結できる方が簡単ですので、Gmail の SMTP サーバーを使ってメール送信ができるようにします。WP Mail SMTP by WPForms などプラグインを使わなくても簡単に出来ます。

01Google からアプリパスワード取得

作業の流れは2段階で済みます。

  1. Google アカウントでアプリパスワードを取得する
  2. functions.php に SMTP サーバー設定を書き加える

まず、Google アカウントからのアプリパスワードの取得です。取得画面は 2023年3月のものです。よく変更になりますので変わっている可能性があります。

Google アカウントにログインし、セキュリティをクリックします。

2段階認証を有効にしていませんと先に進めませんので、していない場合は先に2段階認証の設定します。2段階認証が有効になっている場合はクリックして先に進みます。

スクロールしますと一番下にアプリパスワードがありますのでクリックします。

「アプリを選択」で「メール」を選び、「デバイスを選択」で「その他」を選び「WordPress」など好きな名前を入れて生成をクリックします。そうしますとダイアログが開きパスワードが表示されますのでコピーして記憶しておきます。閉じてしまいますと次に見ることができなくなるようです。その場合は削除して新しく作ればいいです。

Google の方はこれで完了です。

02functions.php に書き加える

WordPress は通常 wp_mail 関数を使ってメール送信を行います。その設定をアクションフック phpmailer init を使って Gmail の SMTP サーバーに変更します。

phpmailer_init のリンク先にサンプルコードがあります。

以下のコードを functions.php に書き加えます。

function my_phpmailer_example( $phpmailer ) {
    $phpmailer->isSMTP();     
    $phpmailer->Host = 'smtp.gmail.com';  
    $phpmailer->SMTPAuth = true;
    $phpmailer->Port = '587';
    $phpmailer->Username = 'yourusername'; // Googleログインユーザ名
    $phpmailer->Password = 'yourpassword'; // Googleアプリパスワード
    $phpmailer->SMTPSecure = 'tls';
//    $phpmailer->From = get_option('admin_email'); // Googleには渡らない?
//    $phpmailer->FromName = get_option( 'blogname' ); // Googleには渡らない?
}
add_action( 'phpmailer_init', 'my_phpmailer_example' );

add_filter( 'wp_mail_from', function( $email ){
    return get_option('admin_email');
});
add_filter('wp_mail_from_name', function( $name ){
    return get_option('blogname');
});

上記コメント行の説明です。

$phpmailer->Username, $phpmailer->Password には Googleアカウントのユーザ名と上で取得したアプリパスワードを入れます。

$phpmailer->From と $phpmailer->FromName はメールの差出人として表示される From: FromName <From> に当たるものですが、ここで設定してもうまくメーラーに渡りません。その場合は、wp_mail の $headers に $headers = ‘From: メールアドレス’ と渡せばいいのですが、それも面倒ですのでフィルターフックを使って書き換えておきます。これをしておかないとデフォルトの差出人メールアドレスが wordpress@yoursite.com になって送信できなくなります。

これで、wp_mail を使ったメール送信は Google の SMTP サーバーから送信されます。

03メール送信チェック

で、これまでの設定のチェックをするのに一番シンプルな方法は何なんでしょう…と、しばし悩んでしまいました(笑)。結局、

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

を実行できればいいわけですので、page-mailtest.php などの固定ページを次のようにつくりテストすることにしました。wordpress を通さない php ファイルではだめですし、ショートコードにするのも面倒ですし、ましてやプラグインなど入れるのもさらに面倒ですし、とにかくこれ以外の方法を思いつきませんでした。

<?php
wp_mail('****@****.com', 'メールテスト', '本文');

これを page-mailtest.php として WordPress のルートに置いて固定ページに設定しアクセスしてみました。ページは真っ白ですが無事に送信できました。

なお、セキュリティの上で $phpmailer の各設定項目を wp-config.php に 定数定義(define)しておく方がいい場合もあります。ただ、管理者ひとり、利用者ひとりであればほとんどリスクは変わらないと思います。