
コードは完璧に書いたはず。送信完了画面も出る。なのに、メールボックスには何も届かない……。
自作のお問い合わせフォームで誰もが直面するこの問題、本当に胃が痛くなりますよね。納品直前の案件ならなおさらです。実はこの問題、プログラムの記述ミスよりも「サーバー設定」や「受信側のセキュリティ」に原因があることがほとんどです。
特に2024年以降、Gmailをはじめとする主要メールサービスのセキュリティ要件は劇的に厳しくなりました。昔ながらのPHPコードだけでは、スパム扱いされて弾かれるのが当たり前の時代になってしまったのです。
本記事では、自作派が必ずハマる落とし穴を一つずつ解消し、確実にメールを届けるための技術的ステップを解説します。ただ動けばいいというレベルではなく、ビジネスで通用する「信頼性の高いフォーム」へのアップデートを一緒に進めていきましょう。
なぜ自作のフォームだけ届かない?メール不達の3つの大きな壁
- プログラムのバグ: コード自体の記述ミスや関数仕様の誤解
- サーバー設定の不備: Webサーバーがメールサーバーとして認知されていない
- 受信側の拒否: Gmail等のセキュリティポリシーによるブロック
自作フォームが動かない時、私たちはついコードエディタとにらめっこしてしまいます。しかし、私自身の経験からも言えることですが、PHPの文法エラー(Syntax Error)が出ていないのに届かない場合、原因は「コードの外」にある可能性が極めて高いです。
特にフリーランスや個人で開発していると、サーバー構築からドメイン設定まで全て一人で完結させなければならず、どこに穴があるのか特定するのが困難です。「WordPressならプラグイン入れたら終わるのに……」と後悔する瞬間かもしれません。
しかし、ここで逃げずに仕組みを理解することは、エンジニアとしての基礎体力を大きく引き上げます。メールが届くまでの道のりには、大きく分けて3つの関所があります。「送り出すプログラム」、「送り出すサーバー」、そして「受け取る側のサーバー」です。
現在は特に3つ目の「受け取る側のサーバー(Gmailなど)」の壁が非常に高くなっています。彼らは「身元不明のサーバーからのメールは受け取らない」というスタンスを強めています。つまり、あなたのPHPコードがどれだけ美しくても、サーバーが「私は怪しい者ではありません」という身分証明(SPF/DKIM設定)を持っていなければ、門前払いされるのです。
まずはPHPコードを確認:mb_send_mailの戻り値とヘッダー設定
- 戻り値の確認:
TRUEが返ってきても「届いた」証拠ではない - Fromヘッダーの罠: ユーザーのメアドをFromに設定してはいけない
- 文字化け対策: 言語設定とエンコーディングの明示
まずは足元、PHPコードの基本から確認しましょう。最も多くの人がハマるのが mb_send_mail 関数の解釈です。
よくある誤解ですが、この関数が TRUE を返したからといって、相手にメールが届いたわけではありません。これはあくまで「サーバーの送信プログラム(SendmailやPostfix)にメールを渡すことに成功した」というだけの合図です。郵便ポストに投函できたからといって、郵便事故が起きないとは限らないのと同じです。
次に致命的なのが、Fromヘッダーの設定です。
お問い合わせフォームの送信元(From)に、入力された「お客様のメールアドレス」を設定していませんか?