
我正在考慮一個系統的架構,該系統應該處理傳入郵件並將其傳遞給處理傳入郵件的 Rails 應用程式。我不確定做類似事情的最好方法是什麼。
它應該像這樣工作:
- 郵件寄至 contact@user_id.myapp.com 等位址
- 郵件伺服器接受郵件並將它們傳遞到 Rails 應用程式(或儲存它們並由 Rails 應用程式取得它們)
- Rails 應用程式處理郵件(一些分析然後將它們丟到資料庫中)
它基本上應該像隊列一樣工作。郵件流量的突然高峰不應導致 Rails 應用程式癱瘓。
我並不是在尋找完整的解決方案。我只是對你的意見感興趣。我想到了 3 個可能的選擇:
- Rails 透過 Pop3 連接到郵件伺服器並僅下載訊息(可能很慢)
- 郵件伺服器透過 POST 請求將郵件傳送到 Rails APP(可能也太慢,遇到郵件炸彈時可能會殺死網路伺服器)
- maildir實際上連結到rails應用程式伺服器的檔案系統(郵件伺服器和應用程式伺服器必須分開),而rails只是直接從中讀取。
您認為在性能和安全性方面最好的方法是什麼?我在這裡錯過了什麼嗎?有沒有更好的辦法?您現在有一些最佳實踐資源嗎?
謝謝!
答案1
答案2
我見過應用程式使用 POP3 來實現這一點(Spiceworks 是我能想到的一個例子)。我認為這是分離應用程式的好方法。伺服器從郵件伺服器中分離出來,並允許您讓郵件伺服器專注於它擅長的事情,並將客戶端從訊息的排隊/儲存職責中解放出來。
回覆:安全
讓人想到的 POP3 的一個問題是明文憑的預設使用。如果您可以透過 SSL(取決於郵件伺服器)運行它,則可以減輕這種擔憂。
回覆:效能和擴展
我不太確定 POP3 存取是否會那麼慢。我對在檔案系統層級進行整合持謹慎態度,因為當新郵件進來時,您可能會遇到爭用和鎖定問題(呃——考慮透過NFS 安裝maildirs 作為有趣的檔案系統爭用問題的範例) 。
讓多個使用者同時在同一個 POP3 郵箱上執行可能會出現問題(如果您嘗試橫向擴展以處理更多訊息流量)。為此,您可能需要在郵件伺服器端編寫一些腳本,以循環方式將傳入訊息分發到一組郵箱中,並將每個使用者綁定到給定的郵箱。 (您可能會考慮將 IMAP 用於多消費者架構,但這只是我在胡言亂語,沒有認真思考。)
當然,您添加了更多的層和潛在的瓶頸,而不僅僅是直接在程式碼中接受 SMTP,但您正在利用郵件伺服器作者已經完成的所有工作。不過,我寧願在郵件伺服器上遇到擴充問題,也不願在自訂 SMTP 伺服器程式碼上遇到擴充問題。
答案3
Rails 可能不是適合這項工作的工具。您可能想要編寫一個小腳本來接受標準輸入上的電子郵件並將其插入資料庫中。您也許可以使用相同的 ActiveRecord 程式碼來執行此操作。然後,您只需設定 MTA,透過將郵件傳送到腳本來傳送郵件。
如果您需要更高的效能,您可以將腳本重寫為透過 LTMP 接受電子郵件的守護進程,這將節省為每封郵件啟動進程的低效率。
答案4
使用 IMAP(S),而不是 POP(如果您採用該路線)。這樣,一旦操作完成,您就可以將伺服器上的內容保留為「讀取」狀態。