Проблема с тайм-аутом почты SMTP

Когда я создаю пользователя для своего веб-приложения, ему отправляется электронное письмо SMTP (с использованием SmtpClient в ASP.NET) с автоматически сгенерированный пароль. Однако иногда я замечаю, что время истекает, и новый пользователь просто не получит электронное письмо с паролем.

Хорошо, я покажу сообщение о том, что почта не прошла, но пользователь создан.

Таким образом, у системного администратора пока есть 2 варианта:

  1. Сбросьте пароль для пользователя и надейтесь, что еще одно письмо SMTP будет отправлено с автоматически сгенерированным паролем.
  2. Удалите и заново создайте пользователя.

Я мог бы откатить создание пользователя, если smtp не был отправлен, но как лучше всего решить эту проблему?

Я думаю, что мне нужно повторить отправку электронного письма 3 раза с периодом ожидания 5 секунд каждый. Так что 15 секунд будут худшим сценарием.

Это путь?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
5 065
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Что ж, в зависимости от вашей платформы, если вы можете просто передать свою почту местному MTA, он должен обрабатывать повторные попытки и тому подобное. Ваша программа может просто поставить почту в очередь и двигаться дальше, не беспокоясь о тайм-аутах, серых списках и т. д.

Если сообщение по-прежнему не может быть доставлено, вы всегда можете попробовать отправить его повторно (с помощью функции сброса пароля). Если и это не удастся, скорее всего, в адресе электронной почты была ошибка, и я бы предложил удалить учетную запись, что привело к повторной регистрации пользователя.

Это, конечно, может быть невозможно в некоторых системах, в зависимости от того, что можно сделать с неподтвержденным пользователем - это действительно зависит от того, что вы разрешаете людям делать до того, как их электронная почта будет проверена.

ИМХО вы должны уведомить пользователя, попросив его подтвердить электронную почту, без повторных попыток.

Если пользователь не проверяет электронную почту и покидает страницу, вам лучше откатить учетную запись, так как пользователь все равно не может получить к ней доступ.

В большинстве случаев тайм-аут может быть вызван недействительными учетными записями электронной почты. Пользователи либо совершили ошибку, либо дали вам несуществующий адрес электронной почты, чтобы избежать спама.

По возможности не спрашивайте электронные письма пользователей. Правило номер один программирования должно быть: НЕ раздражать пользователя.

Похоже, ваше веб-приложение передает SMTP напрямую почтовому серверу вашего пользователя. [Ваше веб-приложение представляет собой MUA (агент почтового пользователя), взаимодействующий с MTA (агентом пересылки почты) пользователя.] Ничто не говорит о том, что MTA пользователя должен быть доступен или работать в данный момент. Вам нужно запустить свой собственный MTA, чтобы убедиться, что кто-то предоставляет очереди, повторные попытки и т. д.

Если вы действительно хотите наклониться назад, вы можете сделать то, что делаете (правда, только с одной попытки), вернуться к постановке сообщения в очередь и продолжать повторять попытки по более медленному графику в течение как минимум 24 часов, и открыть это незавершенное состояние для Пользователь.

Официальный ответ о том, как должно вести себя ваше приложение, можно найти в RFC1123 (Требования к Интернет-хостам - применение и поддержка):

5.3.1.1 Sending Strategy

The general model of a sender-SMTP is one or more processes that periodically attempt to transmit outgoing mail. In a typical system, the program that composes a message has some method for requesting immediate attention for a new piece of outgoing mail, while mail that cannot be transmitted immediately MUST be queued and periodically retried by the sender. A mail queue entry will include not only the message itself but also the envelope information.

The sender MUST delay retrying a particular destination after one attempt has failed. In general, the retry interval SHOULD be at least 30 minutes; however, more sophisticated and variable strategies will be beneficial when the sender-SMTP can determine the reason for non- delivery.

Retries continue until the message is transmitted or the sender gives up; the give-up time generally needs to be at least 4-5 days. The parameters to the retry algorithm MUST be configurable.

Если вы используете классы ASP.NET и System.Net.Mail, вы, вероятно, отправляете почту через экземпляр IIS на компьютере веб-сервера (я не уверен, поскольку вы не указали). Нет хорошего способа узнать, что происходит с вашим агентом передачи почты (IIS SMTP). У него есть собственная логика повтора, и по умолчанию доставка сообщения может занять много времени.

Как вы определяете, что письмо не было доставлено? От чего исходит "тайм-аут"?

У вас должен быть фоновый процесс, который обрабатывает отправку почты. Если доставка в MTA прошла успешно, следует полагать, что все в порядке. Если вы не попали в черный список за СПАМ, большинство MTA будут повторять попытки, пока не пройдут. Если вы действительно получаете ошибку при отправке сообщения с вашим MTA, то обязательно повторите попытку или выясните, что вызывает сбой, и исправьте ошибку. Честно говоря, эта деталь никогда не должна выходить из строя.

Возможно, вы захотите отслеживать обратный адрес для сообщений о недоставке, чтобы вы могли предпринять какие-то действия, когда вы точно знаете, когда электронное письмо не было доставлено. Но если пользователь еще не может войти в систему, нет хорошего способа сообщить ему, что произошло. Возможно, вы могли бы установить cookie со значением, которое вы связываете с электронной почтой, и разместить что-нибудь на странице входа / регистрации, если вы не смогли доставить почту.

Другие вопросы по теме