在php5的網絡應用程序,從用戶獲取電子郵件地址,並將其粘貼到數據庫中,但希望發送電子郵件,而無需用戶等待電子郵件完成。使用Gmail,有時需要幾秒鐘。在php5中,希望在不同的過程中發送電子郵件
想着fopen("http://self.com/mailer.php", "r")
,其中mailer.php
會做實際的郵件。這會工作嗎?
在php5的網絡應用程序,從用戶獲取電子郵件地址,並將其粘貼到數據庫中,但希望發送電子郵件,而無需用戶等待電子郵件完成。使用Gmail,有時需要幾秒鐘。在php5中,希望在不同的過程中發送電子郵件
想着fopen("http://self.com/mailer.php", "r")
,其中mailer.php
會做實際的郵件。這會工作嗎?
有兩種方法在過去對我很好。
數據庫郵件隊列
在您的數據庫或其他任何你正在使用的持久性存儲創建一個「email_queue」表。每個條目都包含發送電子郵件所需的所有內容(例如主題,收件人,發件人,正文等)和「已發送」標誌字段。要發送電子郵件,請使用助手類將條目添加到此表中。
然後,您創建一個cli php腳本,該腳本從隊列表中讀取過濾條件,將發送標誌設置爲0,發送電子郵件並最終將發送標誌設置爲1.此腳本需要在cron作業中運行,但由於您可能想要運行一分鐘以上,因此您可以使用類似Frequent-cron的內容。計劃的任務應該只能在一個Web服務器上運行,以防萬一您擁有多個(並且假設您的持久性存儲是共享的)。
本地郵件隊列
我也有一些成功配置每個Web服務器上的本地後綴服務器使用外部SMTP服務發送郵件。這裏的目標是讓postfix儘可能快地接受電子郵件(因爲它是本地的),然後通過外部SMTP服務器以不同的過程傳遞它。 Postfix將充當中介隊列。
我個人比較喜歡第一個解決方案,因爲它給你的應用程序有關的電子郵件傳送進行統計分析記錄保存等更多信息..
希望有所幫助。
謝謝。而不是cron,你如何看待守護進程在檢查郵件隊列後睡了60秒 - 這將節省數據庫重新連接 – 2011-12-29 13:51:42
這也可以工作,但你必須在PHP之外的其他東西中自定義它。 Php會像瘋子一樣泄露內存:)所以一直運行它可能無法持久。然而,重新連接通常不是一個大問題。 – SuitedSloth 2011-12-29 13:59:47
相關知識。認爲會從客戶端使用ajax返回到服務器發送電子郵件。因爲這可能是不可靠的(客戶端轉到新頁面),將使用cron來捲曲相同的頁面以拾取任何丟棄的電子郵件。 – 2011-12-29 14:05:17
發送電子郵件應該是毫秒級的問題。因爲這個,你有沒有實際的性能問題? – 2011-12-29 12:46:34
沒有用戶等待,你的意思是什麼? – 2011-12-29 12:46:53
通過gmail發送郵件有時需要幾秒鐘。想要在沒有等待電子郵件發送的情況下向用戶顯示下一頁。 – 2011-12-29 12:49:05