2026年7月27日

2026年7月27日

AWS SESでメール送信を設定する方法|ドメイン認証・サンドボックス解除・WordPressからのSMTP送信

WordPressのメールをAmazon SESで送るには、SESで送信元ドメインを認証(DKIM)し、サンドボックスの解除を申請し、SMTP認証情報を作ってWordPressのSMTP設定に入れる、という3段階が必要です。いちばんつまずきやすいのは、サンドボックスのままだと認証済みのアドレスにしか送れないことと、SMTPのパスワードがIAMのシークレットアクセスキーとは別物であることです。この記事では、ドメインの認証からWordPress側の設定、送信テスト、バウンス(不達)への対応までを順番に説明します。

SESの画面構成や項目名は変わることがあります。ここでの説明は目安とし、手順に迷ったときはAWSの公式ドキュメントで確認してください(2026年10月現在)。

準備:リージョンを決める

SESの設定は、ドメインの認証、サンドボックスの状態、SMTP認証情報のすべてがリージョンごとに分かれています。東京リージョン(ap-northeast-1)で認証したドメインは、ほかのリージョンからは使えません。最初に使うリージョンを決め、以降の作業はコンソールの右上でそのリージョンが選ばれていることを確認しながら進めます。「設定したはずなのに認証されていない」という問い合わせの多くは、別のリージョンを見ていることが原因です。

ステップ1:送信元ドメインを認証する

SESで送るには、送信元のメールアドレスかドメインを「IDとして検証」する必要があります。WordPressサイトから送るなら、アドレス単位ではなくドメイン単位で認証しておくと、no-reply@ や info@ など同じドメインのどのアドレスからでも送れます。

DKIM(Easy DKIM)のレコードを登録する

コンソールでIDの作成を選び、ドメインを入力します。DKIMの方式は、SESが鍵を管理してくれる「Easy DKIM」を選ぶのが手軽です。作成すると、DNSに登録するCNAMEレコードが3つ表示されるので、ドメインのDNSにそのまま登録します。DNSがRoute 53にある場合は、画面からRoute 53に自動で登録できることもあります。

DNSに反映されると、しばらくしてIDの状態が検証済みに変わります。数時間たっても変わらない場合は、次の点を確認します。

  • DNSの管理画面で、ホスト名に自分のドメイン名が二重に付いていないか(例: xxxx._domainkey.example.com.example.com)
  • 登録したDNSが、実際にドメインのネームサーバーとして使われているか
# 登録したCNAMEが引けるか(xxxx は表示された値に置き換える)
dig +short xxxx._domainkey.example.com CNAME

カスタムMAIL FROMドメインとDMARC

DKIMだけでも送信はできますが、受信側での評価を上げるには、カスタムMAIL FROMドメインとDMARCも設定しておきます。

カスタムMAIL FROMドメインは、エラーの戻り先(エンベロープの差出人)に自分のドメインのサブドメインを使う設定です。たとえば mail.example.com を指定すると、SESの画面にそのサブドメイン用のMXレコードとSPFのTXTレコードが表示されるので、DNSに登録します。SPFの値は、たとえば v=spf1 include:amazonses.com ~all のような形です。これにより、SPFの認証結果が送信元のドメインと一致するようになります。

DMARCは、ドメインの頂点ではなく _dmarc.example.com にTXTレコードで登録します。最初は p=none で集計レポートを受け取り、正規の送信がすべて認証を通っていることを確かめてから、quarantine や reject に強めていくのが安全です。

_dmarc.example.com  TXT  "v=DMARC1; p=none; rua=mailto:dmarc-report@example.com"

大手のメールサービスは、送信者に対してSPF・DKIM・DMARCの設定を求める方針を強めています。会員サイトやECサイトなど、送信量が多いサイトでは特に設定しておいてください。

ステップ2:サンドボックスの解除を申請する

作成したばかりのSESのアカウントは「サンドボックス」と呼ばれる制限つきの状態です。サンドボックスでは、送信先も検証済みのアドレスに限られ、送信できる量も少なく抑えられています。この状態でWordPressの問い合わせフォームを動かすと、自分宛てのテストは届くのに、訪問者への自動返信は届かない、という現象になります。

本番で使うには、コンソールから本番アクセスの申請を行います。申請では、次のような内容を具体的に書くと審査が通りやすいとされています。

  • どんなメールを送るか(問い合わせの自動返信、パスワードリセット、注文確認など)
  • 送信先のアドレスをどう集めているか(サイトで本人が登録したもの、など)
  • バウンスや苦情をどう処理するか
  • 配信停止の手段をどう用意しているか(メールマガジンを送る場合)

審査の期間や結果は案件によって異なります。申請が通ったら、コンソールで送信の上限(1日の送信数と1秒あたりの送信数)を確認しておきます。上限はアカウントごとに異なります。

ステップ3:SMTP認証情報を作る

SESのコンソールにあるSMTPの設定画面で、SMTP認証情報を作成します。作成すると、SES送信用の権限を持つIAMユーザーが作られ、SMTPのユーザー名とパスワードが表示されます。パスワードが表示されるのは作成時だけなので、パスワードマネージャーなどに保管します。

ここで注意したいのは、SMTPのパスワードはIAMのシークレットアクセスキーそのものではないことです。SMTPのパスワードは、シークレットアクセスキーからリージョンごとに計算された別の値です。既存のIAMユーザーのキーをそのままSMTPのパスワードに入れても認証は通りません。

接続先の情報は次のとおりです。

  • ホスト:email-smtp.<リージョン>.amazonaws.com(東京なら email-smtp.ap-northeast-1.amazonaws.com)
  • ポート:587(STARTTLS)または465(TLS)
  • 認証:あり(作成したSMTPのユーザー名とパスワード)

EC2からは、25番ポートでの送信が既定で制限されています。587番を使えば、この制限は関係しません。

ステップ4:WordPressからSESで送る

プラグインを使う方法

SMTPの設定には、WP Mail SMTPやFluentSMTPなどの定番プラグインが使えます。どちらも送信方法としてAmazon SESを選べますが、SESのAPIで送る機能がどのエディションで使えるかは製品や時期によって異なります。いずれのプラグインでも、汎用のSMTP設定を選んで上記のホスト・ポート・認証情報を入れれば、SMTP経由で送れます。

プラグインによっては、パスワードを管理画面に入力するとデータベースに保存されます。wp-config.phpの定数で渡す方法が用意されている場合は、そちらを使うほうがDBのバックアップから漏れる経路を減らせます。

コードで設定する方法

プラグインを増やしたくない場合は、phpmailer_init アクションでSMTPの設定を行えます。テーマの functions.php ではなく、テーマを変えても影響を受けない wp-content/mu-plugins/ にファイルを置きます。作業前にバックアップを取り、まずステージング環境で試してください。

// wp-config.php(このファイルはGitに含めない)
define( 'SES_SMTP_USER', 'your-smtp-username' );
define( 'SES_SMTP_PASS', 'your-smtp-password' );
<?php
/**
 * Plugin Name: SES SMTP
 * Description: wp_mail を Amazon SES の SMTP で送信する
 */

add_action( 'phpmailer_init', function ( $phpmailer ) {
	if ( ! defined( 'SES_SMTP_USER' ) || ! defined( 'SES_SMTP_PASS' ) ) {
		return; // 定数が無ければ通常の送信方法のまま
	}
	$phpmailer->isSMTP();
	$phpmailer->Host       = 'email-smtp.ap-northeast-1.amazonaws.com';
	$phpmailer->Port       = 587;
	$phpmailer->SMTPSecure = 'tls'; // 587番では STARTTLS
	$phpmailer->SMTPAuth   = true;
	$phpmailer->Username   = SES_SMTP_USER;
	$phpmailer->Password   = SES_SMTP_PASS;
} );

// 送信元はSESで認証したドメインのアドレスにする
add_filter( 'wp_mail_from', function () {
	return 'no-reply@example.com';
} );
add_filter( 'wp_mail_from_name', function () {
	return get_bloginfo( 'name' );
} );

// 送信失敗の理由をログに残す(認証情報は書き出さない)
add_action( 'wp_mail_failed', function ( $error ) {
	error_log( 'wp_mail failed: ' . $error->get_error_message() );
} );

送信元のアドレスを wp_mail_from で固定しているのは、WordPressの初期値(wordpress@ にサイトのドメインを付けたもの)や、プラグインが指定した未認証のアドレスで送ろうとすると、SESに拒否されるためです。

ステップ5:送信をテストする

WP-CLIが使える環境なら、次のコマンドで wp_mail() を直接呼び出して結果を確認できます。

wp eval "var_dump( wp_mail( 'you@example.com', 'SES test', 'This is a test.' ) );"

bool(true) ならSESが受け付けています。false の場合は、上の wp_mail_failed で残したログを確認します。よくあるエラーと原因は次のとおりです。

  • 認証に失敗する:SMTPのユーザー名・パスワードの誤り、リージョンの違い、IAMのキーをそのまま入れている
  • 「Email address is not verified」のような拒否:送信元が未認証、またはサンドボックスのまま未認証の宛先に送っている
  • 接続できない:ポートの誤り、サーバーのファイアウォールで外向きの587番が塞がれている

受信したメールでは、ヘッダーの認証結果(Authentication-Results)を見て、SPF・DKIM・DMARCがそれぞれ pass になっているかを確認します。SESにはバウンスや苦情をわざと発生させられるテスト用のアドレス(メールボックスシミュレーター)も用意されているので、バウンス処理の確認に使えます。

運用:バウンスと苦情に対応する

存在しないアドレスへの送信(バウンス)や、受信者が迷惑メールとして報告すること(苦情)が多いと、SESのアカウントに送信の制限がかかることがあります。SESにはアカウント単位の抑制リストがあり、バウンスや苦情があったアドレスへの送信を自動で止める仕組みが用意されています。あわせて、設定セットとSNSを組み合わせると、バウンスや苦情の発生を通知で受け取れます。

WordPress側では、会員登録時のメール確認を有効にする、問い合わせフォームにスパム対策を入れて架空のアドレスへの自動返信を減らす、といった対策がバウンスを減らすのに役立ちます。送信ログに宛先のメールアドレスを残す場合は、個人情報として扱い、プライバシーポリシーとの整合と保存期間に気を付けてください。

まとめ

  • SESの設定はリージョンごと。最初に使うリージョンを決めて、そこで作業する
  • Easy DKIMの3つのCNAMEに加え、カスタムMAIL FROMとDMARCも設定する。DMARCは p=none から始める
  • サンドボックスでは検証済みの宛先にしか送れない。本番アクセスを申請し、用途とバウンス処理を具体的に書く
  • SMTPのパスワードはIAMのシークレットアクセスキーとは別物。ポートは587か465を使う
  • WordPressはプラグインか phpmailer_init で設定し、送信元を認証済みドメインに固定、wp_mail_failed で失敗を記録する

お気軽にご相談ください

お見積りへ お問い合わせへ
▲