2010-04-11 4 views
10

Я ищу некоторые мнения здесь, я создаю веб-приложение, которое имеет довольно стандартную функциональность:Отправка сообщений электронной почты в веб-приложениях

  1. зарегистрировать учетную запись, заполнив форму и представить его ,
  2. Получить электронное письмо с ссылкой кодом подтверждения
  3. Нажмите на ссылку, чтобы подтвердить новую учетную запись и войти

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

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

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

Мы рассмотрим следующие четыре стратегии по отношению к случаю, когда почтовый сервер вниз, используя пример 1.

TRANSACTIONAL & SYNCHRONOUS Отправка сообщения электронной почты не удается, и пользователю будет показано сообщение об ошибке сообщение о том, что их учетная запись не может быть создана. Приложение будет выглядеть медленным и не отвечает, поскольку приложение ожидает таймаут соединения. Учетная запись не создается в базе данных, так как транзакция откатывается.

TRANSACTIONAL & ASYNCHRONOUS Транзактная определение здесь относится к отправке сообщения электронной почты в очереди JMS или сохранить его в таблице базы данных для другого фонового процесса, чтобы забрать и отправить.

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

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

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

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

Что я хотел бы знать, что здесь делают другие люди? Можете ли вы порекомендовать любые другие решения, кроме 4, упомянутых выше? Каков разумный способ решения этой проблемы? Я не хочу переучивать систему, которая имеет дело с (надеюсь) редкой ситуацией, когда мой почтовый сервер падает!

Простейшая вещь, чтобы сделать это, чтобы закодировать его синхронно, но есть ли другие подводные камни для этого подхода? Наверное, мне интересно, есть ли лучшая практика, я не мог найти много там по поиску.

+0

Хороший вопрос, но немного длинный ИМО. –

+1

Возможно, это, я думаю, я просто стараюсь сделать это красивым и ясным :) – JMM

ответ

9

Мои 2 цента:

  1. После того как вы пользователь не зарегистрируетесь, никогда не откатить регистрации, если посылающий E-Mail не удается. По простым бизнес-причинам: они могут не вернуться или перерегистрироваться, если они не сработают с первой попытки. Скорее допустите неполную регистрацию и попросите пользователя подтвердить свой адрес электронной почты как можно скорее.

  2. В большинстве случаев при отправке электронной почты происходит неточно, ваше приложение не будет получать немедленную обратную связь в любом случае - несуществующие адреса электронной почты на действительных серверах будут отправлять обратно сообщение «недоставок» с некоторой задержкой; если почта будет съедена спам-фильтром, вы не получите никакой обратной связи; в других сценариях может потребоваться несколько минут (greylisting) до нескольких дней (почтовый сервер временно) для получения E-Mail. Таким образом, синхронный подход, ожидающий доставки почты, обречен на ИМО. Даже немедленный сбой (потому что пользователь ввел явно поддельный адрес) должен никогда не привести к тому, что регистрация будет откат.

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

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

+0

Этот ответ должен быть высечен в камне где-то в Силиконовой долине и религиозно соблюден для всех сайтов, требующих регистрации. – MusiGenesis

+0

Некоторые замечательные моменты, спасибо! – JMM

+0

Итак, Пекка - вы не прокомментировали, следует ли отправлять электронную почту синхронно или асинхронно, какие-либо мнения здесь? – JMM

Смежные вопросы