こんにちは、AIシステムズです。
この記事は、代表コバが現場で対応してきたPHP・メール送信運用の知見をもとに、AIを活用して構成・執筆し、弊社にて最終チェックを行ったものです。
WordPressのお問い合わせフォームや業務システムから送ったメールが「届かない」「迷惑メールに入る」「特定ドメイン宛だけ拒否される」——中小企業のサイトで頻発する代表的なトラブルです。原因の大半はmail()関数の直接利用と、SPF/DKIM/DMARC未設定の組み合わせです。
- PHPからメールが送れない・届かない主要原因
mail()関数を直接使うことの問題点- SMTP経由送信への切り替え
- SPF・DKIM・DMARCの設定
- 送信エラーログの読み方
目次
- メール送信が失敗する典型パターン
- 原因の切り分け順序
- SMTP送信への切り替え
- SPF・DKIM・DMARCの設定
- WordPressサイトでの実装例
- こういうサイトに向いている/向いていない
- 再発防止チェックリスト
メール送信が失敗する典型パターン
弊社が対応してきた現場では、原因は次のいずれかです。
- PHPの
mail()がそもそも有効になっていない・sendmailがインストールされていない - 送信元アドレスがサーバーのドメインと一致せず、受信側にスパム判定されている
- SPFレコードが未設定で、なりすましとして拒否される
- Gmail・Outlookなど大手プロバイダがDKIMなしのメールを受け付けない(2024年以降強化)
- メール本文に日本語文字コード周りの不備があり、文字化けして拒否される
原因の切り分け順序
1. PHPからの送信が試行できているか
php -r 'mail("test@example.com", "test", "body");'
返り値が false ならPHP/sendmail側で失敗、true でも届かないなら受信側で弾かれています。
2. メールサーバーのログ確認
tail -f /var/log/maillog # RHEL系
tail -f /var/log/mail.log # Debian系
SMTPでの送信試行と相手サーバーの応答が記録されています。relay access denied、SPF check failed、Sender address rejected など、相手サーバーが返してきたエラーを確認します。
3. 受信側の挙動を確認
Gmailなら、受信メールの「ソースを表示」で SPF=PASS/FAIL、DKIM=PASS/FAIL、DMARC=PASS/FAIL の判定が確認できます。
SMTP送信への切り替え
PHPのmail()を直接使うのではなく、外部SMTPサービス(SendGrid、Amazon SES、SMTP2GO、Postmark等)経由で送るのが現代の標準です。
SendGridでの送信例(PHPMailer使用):
$mail = new PHPMailer\PHPMailer\PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'smtp.sendgrid.net';
$mail->SMTPAuth = true;
$mail->Username = 'apikey';
$mail->Password = $_ENV['SENDGRID_API_KEY'];
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->CharSet = 'UTF-8';
$mail->setFrom('noreply@example.com', '会社名');
$mail->addAddress('user@example.com');
$mail->Subject = 'テスト';
$mail->Body = '本文';
$mail->send();
SPF・DKIM・DMARCの設定
これらは「送信元のドメインが正規かどうか」を受信側が判定する仕組みです。2024年以降、Gmail・Yahoo!(米)はこの3つが揃っていない送信元からのメールを拒否するようになりました。
SPF(TXTレコード)
example.com. IN TXT "v=spf1 include:sendgrid.net ~all"
利用するSMTPサービスが指定するincludeを記述します。
DKIM(公開鍵をTXTレコードに登録)
SendGridやAmazon SESの管理画面から鍵を発行し、指定された s1._domainkey.example.com 形式のTXTレコードをDNSに登録します。
DMARC
_dmarc.example.com. IN TXT "v=DMARC1; p=none; rua=mailto:report@example.com"
最初は p=none で運用してレポートを集め、問題なければ p=quarantine や p=reject に上げていきます。
WordPressサイトでの実装例
WordPressサイトでは「WP Mail SMTP」プラグインを導入し、SendGrid・SES等の認証情報を設定するだけで wp_mail() 全体がSMTP経由になります。Contact Form 7・WPForms・MW WP Formなど、各種フォームプラグインすべてに一括で効きます。
弊社が保守を引き受けたWordPressサイトでは、メール送信を mail() 直接利用からSMTP経由に切り替えるだけで、迷惑メール判定の発生率が大きく下がります。
こういうサイトに向いている/向いていない
このメール送信整備は、お問い合わせフォーム・予約フォーム・自動通知メールを業務で使っている中小企業のサイト全般に直接効きます。メール送信を一切行わない静的サイトでは不要です。
再発防止チェックリスト
- SMTP経由で送信しているか(
mail()直接利用を排除) - SPF・DKIM・DMARCがすべて設定されているか
- 送信元アドレスが自社ドメインで、受信できるアドレスになっているか
- mail.netcraft.comやmail-tester.comで定期的にスコアを確認しているか
- API Key等のシークレットを環境変数管理しているか
まとめ
PHPからのメール送信失敗は、mail()直接利用からSMTPへの切り替えと、SPF/DKIM/DMARCの整備で大半が解消します。2024年以降のメール認証強化を踏まえると、SMTP+SPF/DKIM/DMARCはもはや必須の標準構成です。
本記事は、代表コバが中小企業のメール送信運用の現場で対応してきた知見をもとに、AIを活用して構成・執筆し、弊社にて最終確認を行っています。問い合わせフォーム整備、メール到達率の改善、ドメイン認証設定について、具体的な状況をふまえた相談を承っています。費用感だけ知りたい方も、お気軽にご相談ください。