Когда пользователь регистрируется на моем веб-сайте, я создаю запись пользователя в базе данных с email_sent = 'NO'. Затем у меня есть задание cron, которое отправляет приветственные письма каждые несколько минут. Он выбирает все записи пользователей, где email_sent = 'NO', и отправляет приветственное письмо.
Если электронное письмо успешно отправлено, оно обновляет запись пользователя на email_sent='YES'. Мой вопрос в том, как я могу избежать сценария, когда электронное письмо отправляется успешно, но обновление записи пользователя не выполняется, и в следующий раз, когда задание cron запускается, оно отправляет дубликат электронной почты. Даже если бы я использовал транзакцию базы данных и обновил запись перед отправкой электронного письма, но затем зафиксировал ее, если фиксация не удалась, у меня была бы та же ситуация с отправкой дубликатов электронных писем.
Альтернативой является обновление записи до email_sent='YES' и немедленная фиксация, а затем попытка отправить электронное письмо. Но если электронная почта не отправляется, электронная почта не отправляется.
Есть ли способ гарантировать, что электронное письмо будет отправлено ровно один раз? Я понимаю, что доставка электронной почты может в конечном итоге завершиться неудачей из-за ряда внешних факторов, но я просто хочу убедиться, что мой SMTP-сервер успешно отправляет ее ровно один раз.