54426


申し込みフォームでユーザーがE-mailアドレスを入力し、そのアドレスに自動返信メールを送信するケースで、  
もし存在しないアドレスを入力し、自動送信メールが送れなかった場合の処理の仕方を知りたいです。  
PHPなど、一般的な考え方やメソッドなどあれば教えていただけますと幸いです。


CC BY-SA 4.0
2019-04-23T07:55:42.500
54423
2019-04-23T13:09:03.953
2019-04-23T09:10:39.257
12297
12297
question
javascript php
申し込みフォームで存在しないメールアドレスが入力されたときの処理、が知りたい。


まずは「メールの送信の可否」と、「メール到達の成否」は別で考える必要があります。

「メール送信の可否」  
PHP標準のmail関数ですといわゆるOS側のmailコマンドを実行します。  
一般的にはmailコマンド自体はMTAにメール送信の依頼を投げるだけで、エラーメールだったかどうかは返しません。  
ではどんなときにメール送信の失敗になるかといえば  
・そもそもメールサービスが起動していないとき  
・メール送信のコマンドが間違っているとき  
等が挙げられます。

今回の質問の中にある「存在しないアドレス」に対しては、そもそも送ってみないと存在するかどうかはわかりませんのでつまりはメール送信は可能であるということになります。

「メール到達の成否」  
ほとんどのMTAの場合、エラーメールだったかどうかはログに出力されています。  
リアルタイムで返さないのはメール送信はキューイングで処理されているからです。  
ではなぜキューイングなのでしょうか？それは、一時的に受け付けなかったり、遅延でメールの送信が遅くなったりする可能性があるためです。  
一時的に受け付けない遅延でメールの送信が遅くなってしまうとその間プログラムがずっと継続することになってしまうため、キューイングのサービスで実装されています。

では本題です。  
PHPでエラーメールをキャッチするためにはどうしたらよいかというといくつか方法があります。  
・MTAのログを見る  
上記で書いてあるとおり、ログに吐き出されているのでそれを確認します。  
ただ、実際はリアルタイムではないのでメールが到達したかどうかの判定も何日間も保留するような実装が必要です。  
・エラーメールをキャッチする  
MTAの設定でエラーだった場合は、リターンパスにメールを返すことも可能なので  
エラーだったメールをキャッチすることで、どのメールがエラーだった確認できます。  
ほぼログと同様になりますが、ログと違ってメールで見ることができるので営業担当とか顧客担当でも対処が可能になります。  
・メール配信サービスを使う  
SMTPを用意してあるメールサービスはメール到達のログもAPIで取得したりすることが可能です。  
自前でメールサーバを立てて、エラーハンドリングをするのではなく、外部のメール配信サービスでカバーしてしまうほうが楽だと思います。

参考  
<http://www.nanisama.com/about_Mail/mail-server/index.html>  
<https://www.slideshare.net/yaasita/ss-30560641>


CC BY-SA 4.0
2019-04-23T08:22:16.577
54426
2019-04-23T08:22:16.577
22665
54423
answer


メールの到達性も大事ですけど

  * そのメールアドレスに紐づく「ユーザー＝真の人間」がいるか
  * 申込者の誤入力によって、メールアドレスが当人でない他人のアドレスになってしまっていないか
  * 悪意ある攻撃者が他人のメールアドレスを騙っていないか（あなたのシステムを使って被害者に複数のSPAMを送り付けようとしていないか）

あたりが到達性よりもっと重要です（セキュリティ・UXの面で）。

今時、

  * メールが遅延することは考えにくいこと（分単位ならありえても、時単位で遅延するなどまず絶対にない）
  * その手の申込フォームに入力を行っている人間は継続的にオンライン状態であり、メールが届いたら（分単位の遅延があっても）即受信できる状況であると想定してよいこと

あたりから、誤入力なり悪意あるいたずらの防止なりの対応としては

申込フォーム入力完了時に HTML で申込者に直接返す web 内容は

  * 入力されたメールアドレスにメールを送信しました。
  * 通常は数分以内にメールが届きますが、ネットワークが輻輳しているなどの場合に数時間かかることもありえます。
  * 数時間たってもメールが届かない場合はメールアドレスの入力ミスが考えられます。もしくは迷惑メールのほうに分類されている可能性があります。
  * 迷惑メールボックスを確認していただき、それでも届いていない場合は再度申し込みをお願いします

あなたのシステムからユーザーの入力したメールアドレスに送る確認メールの内容は

  * このメールは＊＊＊さんの申込フォーム入力によりお届けしました
  * もし申し込んだ覚えがないなら、そのまま破棄してください
  * 申し込んだ覚えがあって内容が正しいなら、１２時間以内にメール内リンクにアクセスしていただくことで申し込みの完了になります

なんてのが「メールアドレスの先に本当に人間がいる確認」の常套手段でしょう。

当然、

  * あなたのサーバー上にて１２時間以内のみ有効な申し込み完了確認 URI を生成し
  * その URI をメールに記入して送る
  * その URI にアクセスがあって初めて申し込み完了とする
  * 申込フォームで（仮）パスワードを入力させたなら、確認 URI 上でも再入力必須
  * 同一メールアドレスを使った複数の申込（完了しないもの）が連続したら、２回目以後は申し込みを受け付けない（メールを送らない：攻撃に利用されない対策）
  * 期限が切れたのちに申し込み完了 URI にアクセスがあっても、申込内容をアクセス者に返却しない（プライバシー保護：別人が申込内容を確認できないよう）

あたりの対処は必須でしょう。

なので、メールが到達しないと次のアクションが取れないようなシステムにしておくと、入力されたメールアドレスが正しいかどうかなど気にする必要はないってことになります。


CC BY-SA 4.0
2019-04-23T13:09:03.953
54435
2019-04-23T13:09:03.953
8589
54423
answer