PHPのmail()関数で送ったメールがGmailに届かない原因と対策を解説。SPF・DKIM設定、SMTP切り替えの実践手順をコード例付きで紹介します。
こんな悩み、ありませんか?
お問い合わせフォームを実装したのに「メールが届かない」とクライアントから連絡が来た。ローカル環境やテストでは問題なく送れていたのに、本番サーバーに上げた途端にGmailへのメールが消える――。そういった経験をお持ちのエンジニアは少なくないはずです。
とくにここ数年、Googleは迷惑メール対策を大幅に強化しています。2024年2月からはGmailの受信ポリシーがさらに厳格化され、SPFやDKIMが正しく設定されていないドメインからのメールは、問答無用でスパムフォルダに直行、あるいは完全に拒否されるケースが増えました。
この記事では、PHPのメール送信がGmailに届かない根本的な原因を整理したうえで、SPF・DKIMの設定方法、そして信頼性の高いSMTPリレーへの切り替え手順を実践的に解説します。弊社(Fivenine Design)が実際のクライアント案件で踏んだ失敗談も交えながら、再現性のある解決策をお伝えします。
なぜGmailに届かないのか?原因を正確に理解する
PHPの mail() 関数は、サーバーのローカルMTA(SendmailやPostfixなど)を介してメールを送信します。この仕組み自体はシンプルですが、現代のメールフィルタリングの観点から見るといくつかの致命的な弱点があります。
主な原因は3つ
① SPFレコードが設定されていない、または不正確
SPF(Sender Policy Framework)は「このドメインから送っていいサーバーはどれか」をDNSに登録する仕組みです。VPSや共用サーバーから mail() で送ると、送信元IPがSPFレコードに含まれていないことが多く、受信側で「なりすましの疑い」と判断されます。
② DKIMによる電子署名がない
DKIM(DomainKeys Identified Mail)は、メールに電子署名を付与してメール本文の改ざんがないことを証明する仕組みです。mail() 関数ではDKIM署名を自動付与する機能がないため、受信サーバーから信頼されにくくなります。
③ 送信元IPのレピュテーション問題
共用ホスティング環境では、同じIPを使う別のサイトがスパムを送っていると、そのIP自体がブラックリストに登録されていることがあります。自分のコードに問題がなくても弾かれる、というやっかいなケースです。
これら3つが複合的に絡み合っている場合がほとんどで、一つだけ対処しても解決しないことがよくあります。
解決手順:SPF・DKIM設定 + SMTP切り替えの実践
STEP 1|SPFレコードをDNSに追加する
まず、ドメインのDNS管理画面(お名前.com、CloudFlare、Route 53など)でTXTレコードを追加します。
# 例:VPSのIPが203.0.113.10の場合
v=spf1 ip4:203.0.113.10 include:_spf.google.com ~all
include:_spf.google.com は、Google Workspaceを経由して送信する場合に必要です。自前SMTPのみであれば省略可です。~all はソフトフェイル(疑わしいが拒否はしない)、-all はハードフェイル(即拒否)を意味します。最初は ~all で設定し、動作確認後に厳格化するのがおすすめです。
STEP 2|DKIMを設定する(Postfixの場合)
DKIMの設定はやや複雑ですが、opendkim を使えばPostfixと連携できます。
# opendkimのインストール(Ubuntu系)
sudo apt install opendkim opendkim-tools
# 鍵ペアの生成
sudo mkdir -p /etc/opendkim/keys/example.com
sudo opendkim-genkey -b 2048 -d example.com -D /etc/opendkim/keys/example.com -s default -v
sudo chown -R opendkim:opendkim /etc/opendkim/keys/
生成された /etc/opendkim/keys/example.com/default.txt の内容をDNSのTXTレコード(default._domainkey.example.com)に登録します。その後、/etc/opendkim.conf を編集してPostfixと連携させます。
# /etc/opendkim.conf の主要設定
Domain example.com
KeyFile /etc/opendkim/keys/example.com/default.private
Selector default
Socket local:/run/opendkim/opendkim.sock
設定後は sudo systemctl restart opendkim postfix で再起動し、MXToolBox などでDKIMが正しく機能しているか確認しましょう。
STEP 3|PHPをSMTP経由に切り替える(PHPMailer使用)
SPF・DKIMを設定したとしても、mail() 関数の信頼性には限界があります。最も確実な解決策は、信頼性の高いSMTPサービスを経由して送信することです。
弊社では多くの案件でGoogle WorkspaceやSendGridを利用しています。以下はPHPMailerを使ったSMTP送信の実装例です。
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
$mail = new PHPMailer(true);
try {
// SMTPサーバー設定(SendGrid)
$mail->isSMTP();
$mail->Host = 'smtp.sendgrid.net';
$mail->SMTPAuth = true;
$mail->Username = 'apikey'; // SendGridではこのまま
$mail->Password = 'YOUR_SENDGRID_API_KEY';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
$mail->CharSet = 'UTF-8';
// 送信者・受信者
$mail->setFrom('[email protected]', 'サイト名');
$mail->addAddress('[email protected]', '受信者名');
// メール本文
$mail->isHTML(true);
$mail->Subject = 'お問い合わせを受け付けました';
$mail->Body = '<p>お問い合わせありがとうございます。</p>';
$mail->AltBody = 'お問い合わせありがとうございます。';
$mail->send();
echo 'メール送信成功';
} catch (Exception $e) {
echo "送信失敗: {$mail->ErrorInfo}";
}
Laravelの場合は .env を書き換えるだけで対応でき、実装コストは非常に低いです。
各SMTPサービスの比較
| サービス | 無料枠 | 到達率 | 設定難易度 | おすすめ用途 |
|---|---|---|---|---|
| SendGrid | 100通/日 | ◎ | 低 | 汎用・中規模 |
| Amazon SES | 62,000通/月 | ◎ | 中 | 大規模・AWS環境 |
| Google Workspace | なし(有料) | ◎ | 低 | 小規模・G Suite連携 |
| Mailgun | 100通/日 | ○ | 低 | APIでの送信 |
よくある失敗パターンと対処法
ここでは、弊社が実際に経験したミスや、クライアントから相談を受けたケースをご紹介します。
失敗①|From:アドレスを [email protected] にしてしまう
自社ドメインでなく gmail.com や yahoo.co.jp を From: に指定してしまうケース。これはなりすましと判定され確実に弾かれます。必ず自社ドメインのアドレスを From: に設定してください。
失敗②|SPFに include:sendgrid.net を追加せずSendGridを使う
SendGrid経由で送る場合、SPFレコードに include:sendgrid.net を追加しないと認証が通りません。サービスを切り替えたらDNS設定も必ず更新する必要があります。
失敗③|Google WorkspaceでアプリパスワードでなくGoogleアカウントのパスワードを使う
Googleは通常のパスワードによるSMTP認証を廃止しています。Google Workspace経由で送る場合は、Googleアカウントの2段階認証を有効にしたうえでアプリパスワードを発行してください。通常パスワードでは認証エラーになります。
失敗④|DMARCを設定しないままにする
SPFとDKIMを設定したあと、DMARCレコードも追加しておくと到達率がさらに安定します。最低限のポリシーとして以下をDNSに追加することをおすすめします。
# _dmarc.example.com に追加するTXTレコード
v=DMARC1; p=none; rua=mailto:[email protected]
p=none は監視モードで、まずはレポートを受け取りながら状況を確認するのが安全です。
設定後の到達率改善イメージ
トラブル対応・復旧
自分で直すのが難しいと感じたら
エラーの原因調査から復旧、再発防止まで対応します。急ぎの場合は、フォームで「緊急対応希望」にチェックを入れて送ってください。
まとめと次のステップ
PHPのメール送信がGmailに届かない問題は、「なぜ弾かれるのか」を正確に理解すれば、体系的に解決できます。mail() 関数に頼り続けることのリスクは年々高まっており、SendGridなどの信頼性の高いSMTPサービスへの切り替えが最もコストパフォーマンスの高い解決策です。
まずは以下のチェックリストに沿って、現状の確認から始めてみてください。
設定変更にはDNSの伝播に最大48時間かかることも覚えておいてください。変更直後にテストして「まだ届かない」と焦るケースも多いです。
「自分でやってみたけど解決しなかった」「そもそも設定する時間が取れない」という場合は、ぜひFivenine Designにご相談ください。サーバー環境の確認からDNS設定、SMTP切り替えの実装まで、ワンストップで対応いたします。神奈川拠点ですが、全国のクライアント様のご支援実績があります。