簡體   English   中英

用PHP向大量用戶發送電子郵件的最有效方法是什么?

[英]What is the most efficient way to email a lot of users in PHP?

每當有人PM(私人消息)向我的用戶發送電子郵件時,我的網站就會向他們發送電子郵件。 上面寫着“有人剛在SITE NAME上給您發送了一條消息,請登錄查看它”。

目前,我的網站不是很受歡迎,因此我目前的操作方式還不是性能問題:

    // code that sends pm here...

    // code that stores pm in messages table here...

    // notify user by emailing them right away
    mail($user_email, $subject, $message);

基本上,每次發送PM時,都會執行郵件功能並將消息立即發送到現場。 因此,每發送100條消息,mail()就會被調用100次。

我預計我的網站將會越來越受歡迎,並且隨着更多的用戶出現更多的PM,因此我認為我目前的做法將成為一場性能噩夢。 所以我當時想這樣做:

// get the last message that was accounted for by the last cron
$query = mysql_query(" SELECT `last_checked_id` FROM `settings` ");
$last_checked_id = mysql_fetch_array($query);


$user_emails = array();

// get all messages that were added to this table since the last time this cron ran
$query = mysql_query(" SELECT `recipient_id`, `message_id` FROM `messages` WHERE `message_id` > '$last_checked_id' ");

$i = 0;
while($row = mysql_fetch_array($query)) {

    if($i == 0) {
        // set this as the last message processed
        mysql_query(" UPDATE `settings` WHERE `last_checked_id` = '". $row['message_id'] ."' ");
    }

    // only put this user in the to email list if he hasn't been added already (since there can be multiple messages for the same user but we need to notify him only once) 
    if(!in_array($row['recipient_id'], $user_emails)) {
        array_push($user_emails, $row['recipient_id']);     
    }
}
$i++;

// send email to all users at one
mail(implode(',', $user_emails), $subject, $message);

我可以將此腳本設置為cron並使其每小時運行一次。 一次性發送所有電子郵件,而郵件功能僅調用一次。 唯一的缺點是用戶在收到PM時不會立即收到通知,而是在一個小時內收到通知。 但這不是什么大問題,我可以接受。

我的問題是:

  • cron方法在性能上明顯更好,還是可以忽略不計?
  • 這是大多數大型網站的做法嗎? 還是有更好的方法,建立一些圖書館呢?

謝謝。

您可以在mysql表中插入郵件(emailoutgoing)

並且,每隔“ 3”分鍾運行一次cron作業,您可以從表中收到未發送的(100?)電子郵件,發送並將行標記為已發送。

如果我理解正確,您將向每個人發送完全相同的電子郵件嗎? 在這種情況下,您應該將密件抄送字段用於電子郵件地址,否則每個人都會看到其他收件人,但是在這種情況下,反垃圾郵件引擎可能會出現問題,因為它們不會將其用戶視為電子郵件的收件人(未找到),因此可能會忽略您的電子郵件在to或cc字段)。

但是您應該真正考慮為每個用戶發送個性化電子郵件(如果您在發送消息的人和/或消息的一部分中添加時髦的預覽,他們會更加渴望)

首先,請閱讀Mike B評論中的鏈接。

其次,您的代碼有一些有趣的失敗模式-它可能會失敗,將所有郵件標記為已發送,並且沒人會知道。 有關CRON和其他無人值守的流程(包括一般的網站)的關鍵是,您需要知道何時出錯。 發送郵件后,我考慮將“ update”語句放在最后。 進行某種日志記錄,以便您可以跟蹤發生的情況。

第三,請不要將此電子郵件發送給“收件人”字段中的所有這些人-正如Miro所說的,這是垃圾郵件誘餌,但它也向用戶提供了比他們應有的更多信息-他們知道其他人的電子郵件地址您網站的用戶在一個小時內碰巧遇到了PM。 如果您要建立一個約會網站或社交網絡,那幾乎肯定會讓人們生氣。

最后,我處理過的其他具有類似要求的站點都趨向於有一個“事件”表,該表由守護程序/服務風格流程進行監視。 守護程序將做出明智的決定。 我們設計的解決方案適合在多線程甚至多台機器上運行,盡管實際上從不需要。

因此,您可能有一個“事件”表,如下所示:

eventID    eventDate    eventType     eventStatus     eventMeta
-------------------------------------------------------------------
1          1 Feb 2012        PM           NEW         <from>bob@banana.com</from><to>alice@passionfruit.com</to>
2          1 Mar 2012        PM           COMPLETE    <from>fred@pear.com</from><to>jennifer@avocado.com</to> 

守護程序會不斷掃描eventStatus為NEW的記錄,將它們設置為“進行中”,進行處理,然后將狀態設置為完成。

這使您可以查看系統中正在發生的事情-如果記錄“正在進行中”超過一秒鍾,則說明某些內容已損壞。 如果“ NEW”記錄的數量持續增長,而“ complete”記錄的數量沒有增長,則說明出現了問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM