2010-03-23 62 views
0

好了,這裏是我的問題:在PHP延遲電子郵件,以避免超出服務器限制

我有一個網站上的會員名單,以及管理員的週期性一個我的網站(誰是不太網站或科技知識)將發送簡訊給會員名單。 我目前的會員名單長度超過800人。

所以,我寫的是發送電子郵件到全會員,在密件抄送標題列出的成員的電子郵件的腳本。

然而,我發現,我的主機服務器每小時300個電子郵件,即使成員在密件抄送字段中列出我顯然超出極限。 (我以前沒有意識到,密件的行爲是派遣獨立的電子郵件。對名單上的每一個名字......)

經過一番思考,我得出的結論是我唯一的解決辦法是讓我腳本只會將電子郵件發送給前300封電子郵件,等待一個小時,然後再發送另一封電子郵件給另外300封電子郵件,再等一小時,等等,直到我將電子郵件發送到整個成員列表。

在互聯網上環顧四周,我已經看到了一些其他的解決方案,人們紛紛拿出在PHP延緩電子郵件。 Sleep()顯然不是一種選擇,因爲我不能將腳本保持打開並運行3到4個小時。我見過一些人提出cron作業,但我不確定在每次發送電子郵件時創建三個新的cron作業,使用它們一次,然後刪除它們,這是多麼可行。 我見過的最終(和我認爲最聰明的)解決方案是在我的數據庫中有一張表來臨時存儲要延遲並稍後發送的電子郵件,然後創建一個cron作業,每次檢查此sql表小時左右,將該行的時間戳與當前時間戳進行比較,然後在一小時後發送電子郵件。

所以我問你所有推薦的方法。有沒有更容易的解決方案,我已經完全查看了(除了獲得不同的託管計劃,哈!),還是有比數據庫/ cron工作方法更乾淨的方法嗎?

tl; dr:我有超過800封電子郵件在服務器上發送,一小時內將我限制爲300個小時。使用PHP,找到一種方法來解決這個問題,發送電子郵件的人只需點擊「發送」即可。

回答

1

您可以將此發送給齒輪工隊列,然後讓齒輪工工人進行適當的睡眠呼叫。請參閱http://gearman.org/http://php.net/gearman

+0

我對Gearman沒有任何經驗,但從我的鏈接中讀到的內容看起來非常有趣。 那麼,Gearman的工作人員會允許我在後臺運行睡眠呼叫過程?或者,我是否也必須將流程轉移到另一臺服務器? – Polyonymy 2010-03-24 02:19:26

+0

啊,在GearmanClient類中找到我的答案。 doBackground()將完美工作。 謝謝多米尼克! – Polyonymy 2010-03-24 02:28:43

0

聽起來像是你需要設置從消息池中拉來發送和處理X每次cron的過程中其運行一個批處理功能。然後,您將擁有一張跟蹤已發送郵件和誰的郵件的表格,以便您可以跟蹤誰收到了電子郵件。

0

我建議您創建一個隊列,並在每次需要發送電子郵件時從隊列中處理X個項目。郵件的發件人只是將電子郵件放入隊列中,並且處理代碼將拾取發送該時段內最大數量項目的項目。偶爾你會失敗並且使用隊列將允許簡單的恢復。處理時只能從隊列中刪除項目。

您可以使用簡單的數據庫表作爲隊列,但您可能更願意使用專家隊列解決方案。

另一個建議是尋找到外部電子郵件服務,如Strongmail。這些將幫助您每小時發送更多電子郵件。

+0

這就和我一樣 - >每小時CRON工作的簡單隊列。它似乎工作正常,你可以將它們標記爲已發送或刪除一次發送的條目。 – niggles 2010-03-24 04:35:38