質問: 申し込みフォームでユーザーがE-mailアドレスを入力し、そのアドレスに自動返信メールを送信するケースで、 もし存在しないアドレスを入力し、自動送信メールが送れなかった場合の処理の仕方を知りたいです。 PHPなど、一般的な考え方やメソッドなどあれば教えていただけますと幸いです。
回答: まずは「メールの送信の可否」と、「メール到達の成否」は別で考える必要があります。 「メール送信の可否」 PHP標準のmail関数ですといわゆるOS側のmailコマンドを実行します。 一般的にはmailコマンド自体はMTAにメール送信の依頼を投げるだけで、エラーメールだったかどうかは返しません。 ではどんなときにメール送信の失敗になるかといえば ・そもそもメールサービスが起動していないとき ・メール送信のコマンドが間違っているとき 等が挙げられます。 今回の質問の中にある「存在しないアドレス」に対しては、そもそも送ってみないと存在するかどうかはわかりませんのでつまりはメール送信は可能であるということになります。 「メール到達の成否」 ほとんどのMTAの場合、エラーメールだったかどうかはログに出力されています。 リアルタイムで返さないのはメール送信はキューイングで処理されているからです。 ではなぜキューイングなのでしょうか?それは、一時的に受け付けなかったり、遅延でメールの送信が遅くなったりする可能性があるためです。 一時的に受け付けない遅延でメールの送信が遅くなってしまうとその間プログラムがずっと継続することになってしまうため、キューイングのサービスで実装されています。 では本題です。 PHPでエラーメールをキャッチするためにはどうしたらよいかというといくつか方法があります。 ・MTAのログを見る 上記で書いてあるとおり、ログに吐き出されているのでそれを確認します。 ただ、実際はリアルタイムではないのでメールが到達したかどうかの判定も何日間も保留するような実装が必要です。 ・エラーメールをキャッチする MTAの設定でエラーだった場合は、リターンパスにメールを返すことも可能なので エラーだったメールをキャッチすることで、どのメールがエラーだった確認できます。 ほぼログと同様になりますが、ログと違ってメールで見ることができるので営業担当とか顧客担当でも対処が可能になります。 ・メール配信サービスを使う SMTPを用意してあるメールサービスはメール到達のログもAPIで取得したりすることが可能です。 自前でメールサーバを立てて、エラーハンドリングをするのではなく、外部のメール配信サービスでカバーしてしまうほうが楽だと思います。 参考