2010-04-11 200 views
10

我找了一些意見在這裏,我建立具有的相當標準功能的Web應用程序:一個帳號通過填寫表格並提交其發送電子郵件

  1. 註冊。
  2. 收到了確認代碼的鏈接
  3. 電子郵件點擊鏈接以確認新帳戶並登錄

當您從您的Web應用程序發送電子郵件,它常常(通常情況下)的情況下,將有對持久層進行一些更改。例如:

  1. 爲您網站上的帳戶新用戶註冊 - 新用戶在數據庫中創建和電子郵件發送給他們一個確認鏈接
  2. 用戶分配一個錯誤或問題別人 - 問題被更新並且電子郵件通知被髮送。

如何發送這些電子郵件對於您的應用程序的成功至關重要。您如何發送郵件取決於預期收件人收到電子郵件的重要性。

我們來看看在關係到郵件服務器宕機的情況下以下四個策略,利用例如1

TRANSACTIONAL &同步 電子郵件的發送失敗,向用戶顯示一個錯誤消息說他們的帳戶無法創建。當應用程序等待連接超時時,應用程序看起來很慢並且沒有響應。該帳戶不會在數據庫中創建,因爲事務已回滾。

TRANSACTIONAL & ASYNCHRONOUS 這裏的事務定義是指將電子郵件發送到JMS隊列或將其保存在數據庫表中以供其他後臺進程拾取和發送。

用戶帳戶在數據庫中創建,電子郵件發送到一個JMS隊列稍後處理。交易成功並承諾。用戶會看到一條消息,說明他們的帳戶已創建並檢查他們的電子郵件以確認鏈接。在這種情況下,可能會由於其他錯誤而永遠不會發送電子郵件,但會告知用戶已將電子郵件發送給他們。如果必須調用應用程序支持來診斷電子郵件問題,則可能會延遲向用戶發送電子郵件。

非交易&同步 用戶在數據庫中創建,但應用程序在嘗試使用確認鏈接發送電子郵件時收到超時錯誤。用戶會看到一條錯誤消息,指出存在錯誤。當它等待連接超時時,應用程序緩慢且無響應

當郵件服務器恢復生機並且用戶嘗試再次註冊時,他們被告知他們的賬戶已經存在但尚未被確認並且被給予選項將電子郵件重新發送給他們。

非事務&異步 這和交易&異步之間的唯一區別是,如果有錯誤郵件發送給JMS隊列或保存在數據庫中,仍然是創建用戶帳戶,但電子郵件直到用戶再次嘗試註冊纔會發送。

我想知道的是其他人在這裏做了什麼?你能推薦除上面提到的4以外的其他解決方案嗎?解決這個問題的合理方法是什麼?我不想過度設計一個處理我的郵件服務器宕機的(希望)罕見情況的系統!

最簡單的做法是同步編碼,但這種方法還有其他缺陷嗎?我想我想知道是否有最佳做法,但我無法通過Google搜索找到更多信息。

+0

好問題,但有點囉嗦海事組織。 – 2010-04-11 13:41:10

+1

它可能是,我想我只是試圖使它很好,清晰:) – JMM 2010-04-11 13:42:18

回答

9

我的2美分:

  1. 一旦你有一個用戶註冊,如果從來沒有發送電子郵件失敗回滾登記。出於簡單的商業原因:如果第一次嘗試不成功,他們可能不會回來或重新註冊。而不是容忍不完整的註冊,並嘮叨用戶儘快確認他們的電子郵件地址。

  2. 在大多數情況下,當發送電子郵件出錯時,您的應用程序不會立即得到反饋 - 有效服務器上不存在的電子郵件地址將發送「無法傳送」消息,並延遲一段時間;如果郵件被垃圾郵件過濾器所佔用,您將不會收到任何反饋;在其他情況下,電子郵件可能需要幾分鐘(灰名單)到幾天(郵件服務器暫時關閉)才能發送。因此,等待郵件遞送的同步方法註定了IMO。即使是立即失敗(因爲用戶輸入了明顯虛假的地址)應該從不導致註冊回滾。

我會做什麼時,使帳戶創建儘可能容易,允許帳戶用戶訪問前確認,然後再嘮叨了地獄,他們確認自己的電子郵箱(如有必要,限制進入某些區域直至確認)。儘管如此,我會阻止用同一個電子郵件創建第二個帳戶,以防止混亂。

請確保您允許更改電子郵件地址,即使以前的地址尚未確認,並且允許用戶重新向其他地址請求確認消息。

+0

這個答案需要在硅谷的某個地方刻成石頭,並且所有需要註冊的站點都堅持遵守。 – MusiGenesis 2010-04-11 13:50:17

+0

一些偉大的觀點,謝謝! – JMM 2010-04-11 13:50:23

+0

So Pekka - 你沒有評論電子郵件是應該同步發送還是異步發送,這裏有什麼意見? – JMM 2010-04-12 12:38:30