現在、PHP と Zend Framework を使用して、SMTP と GMail の SMTP サーバーでメールを送信しています。これは、すべてのメールを処理するために Google Apps ドメインを設定しているため、メールが mailer@mycompany.com から送信されているように見えるためです。
ユーザーが登録するか、Web サーバーにメールを送信する必要があることを行うと、PHP 側で SMTP 接続を開始してメールを送信するのに 5 秒ほどかかることがあります。プロセスは次のようになります。
- ユーザーが登録フォームに記入する
- ユーザーがフォームを送信
- PHP スクリプトが情報をデータベースに保存し、メールを送信します (5 ~ 10 秒)
- ユーザーが別のページにリダイレクトされました
彼らがフォームを送信したばかりのとき、ユーザーがそこに10秒間座っている間、Webサーバーから大きな遅延が発生することはありません。基本的に、電子メールの送信プロセスはシングル スレッドであるため、サーバーは電子メールの送信が完了するまで他に何もできません。これは 5 ~ 10 秒で、電子メール アドレスにエラーがある場合は 20 秒かかることもあり、これは長すぎます。
人々は通常、このような問題をどのように回避しますか?
もともと私はいくつかのことを試しました:
SwiftMailer のような別のライブラリを使用します。それでも同じ問題。余分な時間がかかるのは SMTP/TLS ハンドシェイクだと思います。
電子メール データをデータベースに保存し、fsockopen を使用して別のページへの非同期要求を開始し、データベースから電子メール データを取得して電子メールを送信します。その間、私の PHP スクリプトは同期的に続行でき、ユーザーはフォームの送信直後に次のページにリダイレクトされます。問題は、メールが送信されたかどうか、または失敗したかどうかを確認する方法がなかったことです。データベース テーブルにフラグを設定することはできたと思いますが、メールが送信されたことをユーザーに即座にフィードバックしたかったのです。つまり、次のページで 10 秒後に Ajax リクエストを別のページに送信し、データベース テーブルのフラグをチェックして送信されたかどうかを確認し、そのページに応答をユーザーに表示します。メールを間違って入力した場合、これは機能せず、メールを送信できませんでした。
私が思いついた別のオプションは、電子メールデータを $_SESSION 配列に入れることでした。そのため、ページを送信した後、ユーザーはリダイレクトされたページにいて、セッションデータを取得して送信する別のページに ajax リクエストを送信します。電子メールを送信してから、ユーザーが表示していたページに応答を送り返し、電子メールが送信されたことを伝えます。これはかなりうまく機能しますが、おそらく最善の方法ではないと思います。
だから私はそれを行うためのベストプラクティスの方法は何だろうと思っていますか? GMail は TLS ハンドシェイクを行う必要があるため、この種の処理には遅すぎますか? すべての電子メールをデータベースのキューに入れ、数分ごとに CRON ジョブを実行して送信し、送信後にデータベースから削除する必要がありますか? 問題は、電子メールが正しく送信されたというユーザーへの即時フィードバックがないことです。それともとにかくそれを気にする必要はありませんか?彼らは電子メールを受け取るかどうかのどちらかです。