ユーザーが私の Web サイトにサインアップすると、データベースに email_sent = 'NO' のユーザー レコードが作成されます。次に、数分ごとにウェルカム メールを送信する cron ジョブがあります。email_sent = 'NO' であるすべてのユーザー レコードを選択し、ウェルカム メールを送信します。
電子メールが正常に送信されると、ユーザー レコードが email_sent='YES' に更新されます。私の質問は、電子メールは正常に送信されたが、ユーザー レコードの更新が失敗し、次に cron ジョブが実行されたときに重複した電子メールが送信されるというシナリオをどのように回避できるかということです。データベース トランザクションを使用し、メールを送信する前にレコードを更新し、後でコミットしたとしても、コミットが失敗すると、重複したメールが送信されるという同じ状況になります。
別の方法は、レコードを email_sent='YES' に更新してすぐにコミットしてから、電子メールの送信を試みることです。しかし、電子メールの送信が失敗した場合、電子メールは送信されません。
電子メールの送信が 1 回だけであることを保証する方法はありますか? 電子メールの配信は、多くの外的要因により最終的に失敗する可能性があることを認識していますが、SMTP サーバーが確実に 1 回だけ配信を成功させたいだけです。