サーバー運用

PHPでメール送信失敗時の原因と解決策

2026-04-28 読了7分 3PV
PHPでメール送信失敗時の原因と解決策

こんにちは、AIシステムズです。
この記事は、代表コバが現場で対応してきたPHP・メール送信運用の知見をもとに、AIを活用して構成・執筆し、弊社にて最終チェックを行ったものです。

WordPressのお問い合わせフォームや業務システムから送ったメールが「届かない」「迷惑メールに入る」「特定ドメイン宛だけ拒否される」——中小企業のサイトで頻発する代表的なトラブルです。原因の大半はmail()関数の直接利用と、SPF/DKIM/DMARC未設定の組み合わせです。

  • PHPからメールが送れない・届かない主要原因
  • mail() 関数を直接使うことの問題点
  • SMTP経由送信への切り替え
  • SPF・DKIM・DMARCの設定
  • 送信エラーログの読み方

目次

  1. メール送信が失敗する典型パターン
  2. 原因の切り分け順序
  3. SMTP送信への切り替え
  4. SPF・DKIM・DMARCの設定
  5. WordPressサイトでの実装例
  6. こういうサイトに向いている/向いていない
  7. 再発防止チェックリスト

メール送信が失敗する典型パターン

弊社が対応してきた現場では、原因は次のいずれかです。

  • 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 deniedSPF check failedSender address rejected など、相手サーバーが返してきたエラーを確認します。

3. 受信側の挙動を確認

Gmailなら、受信メールの「ソースを表示」で SPF=PASS/FAILDKIM=PASS/FAILDMARC=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=quarantinep=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を活用して構成・執筆し、弊社にて最終確認を行っています。問い合わせフォーム整備、メール到達率の改善、ドメイン認証設定について、具体的な状況をふまえた相談を承っています。費用感だけ知りたい方も、お気軽にご相談ください。

AI Systemsへの無料相談はこちら

「何から始めればいいか分からない」段階からでも、お気軽にご相談ください。
まずは、お話を聞かせていただくだけでも大丈夫です。

無料で相談する
コバ

コバ

AI活用 / Web制作 / 業務自動化支援

中小企業さま向けに「お手頃に・早く・成果が出る」開発支援を行っています。AI・Web・自動化の3分野を、まとめてサポートしています。

この記事をシェアする

一覧へ戻る