2010-01-27 29 views
7

我正在準備一個網站,它會向註冊用戶發送電子郵件通知。從我的經驗來看,發送電子郵件對PHP來說是一個痛苦的過程,特別是當我們談論數千個時。我的一個網站不時發送電子郵件給1000-1500人。 PHP需要大約5分鐘才能完成,所以我們在服務器負載最低時通宵運行它。我使用本地mail()功能沒有任何SMTP。這在專用服務器上運行良好,但我並不是這個解決方案的忠實粉絲。關於從php發送電子郵件的意見

我希望能夠在任何時候發送類似的金額,而不會冒服務器故障(並將其列入黑名單)的風險。
我讀過,理想的解決方案是每隔幾分鐘從Cron觸發的腳本中批量發送電子郵件(比如20)。在我看來,這似乎是一個非常合理的想法,但是......如果我無法訪問Cron(並非所有託管提供商都可以訪問它)而且網站不夠流行,無法在頁面上觸發腳本加載?

我堅持使用我的服務器來做郵件,而不是任何外部解決方案。

PS。我發現這樣的解決方案:http://www.mywebcron.com/但這有什麼好處?


編輯

我想補充:

  • 我使用笨,
  • 速率的電子郵件是由我目前的服務器發送通常是0.2秒每封郵件。
+0

有一個笨包裝器SwiftMailer;它在wiki中,請給它一個鏡頭:http://codeigniter.com/wiki/CI_SWIFT_MAILER/ – gyo 2010-01-27 16:32:29

回答

3

使用PHP郵件類如PHPmailerSwiftMailer,您可以通過SMTP直接發送郵件,這將更快。 是的,發送大量電子郵件最好通過cron完成,因此您每分鐘發送X封電子郵件。您將以這種方式避免服務器過載。 如果你不能在你的服務器上創建cron作業,我建議你切換你的託管服務提供商,否則你鏈接的網站是你唯一可行的選擇(但這是依靠某些第三方,這不是很酷)

+0

作爲Jan的答案的補充:如果您無法在您的服務器上安排cron作業(正如大多數廉價託管解決方案),有一些純粹的PHP替代品來運行計劃任務:[phpjobscheduler](http://www.phpjobscheduler.co.uk/)是其中一種替代方案。 – Powertieke 2010-01-27 08:49:22

2

如果您不能使用定期作業,您可能需要查看像Gearman這樣的排隊解決方案。

您想要做的是將所有電子郵件推入隊列,並有一個或多個長時間運行的工作人員從隊列中選擇工作。如果您想在系統中添加延遲,只需在該處添加睡眠。

一些非常基本的僞代碼:

#wherever you launch the jobs from 
for each user 
    gearman.push(user.generateEmail()) 


#in your consumer script 
while true 
    message = gearman.consume() 
    message.send() 
    sleep(5)