2016-05-24 82 views
0
$i = 1; 
foreach ($recipients as $email => $name) { 
    $mail->ClearAddresses(); 
    $mail->AddBCC($email, $name); 
    if (!$mail->send()) { 
     $send = 0; 
    } else { 
     $send = 1; 
    } 
    $query = "INSERT INTO `newsletter_send`(`email`, `id_newsletter`, `date`, `send`) VALUES ('$email',$id_newsletter, NOW(),$send) "; 
    $stmt = $link->prepare($query) or die('error'); 
    $stmt->execute(); 
    $mail->clearAllRecipients(); 

    if (($i % 100) == 0) { 
     sleep(60); 
    } 

    $i++; 
} 

什麼是最好的方式發送一個大的電子郵件沒有睡眠(),而無需等待頁面完成加載?除了cron工作外,你還有其他想法嗎?如何發送大郵件?

編輯:我有680個用戶誰將收到電子郵件,但一段時間後,我得到500內部服務器錯誤..爲什麼?它可能是time_limit? enter image description here

+0

試着通過cron發送它 –

+0

如果你不想使用cron,你可以使用像beanstalk這樣的隊列管理器。儘管在任務調度程序已經可用的情況下,您仍然需要在服務器上安裝額外的軟件。 – jeroen

+0

你爲什麼要做'sleep()'調用?郵件服務器應該排隊消息並在服務器準備就緒時發送 - 除非它有限制。 – Tigger

回答

2

消息隊列。

beanstalkd is a good solution.

然後,您可以使用SDK像pheanstalk處理隊列及其作業。

編輯:如果您有限制訪問您的服務器(例如,如果您使用共享主機)消息隊列作爲服務也是一個選項。

+0

你會碰巧知道這個問題的答案關於豆莖/ pheanstalk?:http://stackoverflow.com/questions/37408325/beanstalkd-pheanstalk-security-issue – Webeng

+0

我剛剛回答同樣的事情,你hahah,但是你打敗了我,但後來我想起了我最近發佈的一個關於豆稈隊列和安全性的問題,爲什麼不問一個可能知道答案的人:) – Webeng

-1

在快節奏發送大量電子郵件的一個好方法是有很多工人腳本做的工作,而不是1個PHP的(GiamPy給出了一個很好的例子,可以完成的方法之一,我不會提到它,因爲我不想冗餘)。

一個簡單的(雖然有點hacky)選項是:爲你在一個文件中製作20個PHP腳本。您可以將它們命名爲mailer1.php,mailer1.php,...,mailer20.php。然後,你可以創建一個名爲mail文件夾,並把兩個文件裏面:

mail/config.txt 

mail/email.txt 

裏面mail/config.txt,你會包括以下文本行:

T 
15 

哪裏第一行有TTRUE這意味着您希望郵寄者儘可能快地發送郵件每個15秒。你可以明顯地改變間隔時間以及任何你喜歡的。

而且在mail/email.txt你就必須要發送

成就了所有您做出郵件文件後,完整的電子郵件。你可以先寫1,寫代碼,然後複製粘貼19次,共有20個腳本。內部的代碼可能是這個樣子:

<?php 

$pathconfig = "mail/config.txt"; 
$pathemail = "mail/email.txt"; 

$email = file_get_contents($pathemail);//now you have the email saved 
$filehandleconfig = fopen($pathconfig, "r"); 
$bool = trim(fgets($pathconfig)); 
$sleeptime = (integer) trim(fgets($pathconfig)); 
fclose($filehandleconfig); 

while ($bool === 'T') 
{ 
    //... code that sends the email 

    //recheck if 'T' is still 'T': 
    $filehandleconfig = fopen($pathconfig, "r"); 
    $bool = trim(fgets($pathconfig)); 
    fclose($filehandleconfig); 

    sleep($sleeptime); 
} 


?> 

那麼前面的代碼將基本上做的是提取需要在一開始將要發送的電子郵件,並提取發送電子郵件後,將睡覺的時候,如果它應該繼續發送電子郵件。

這意味着mail/config.txt文件是您的控制面板,如果您將'T'更改爲'T'(例如'F'),則所有腳本都將終止。

這個選項的不足之處在於它有點冒失,但好處是它可以在幾分鐘內開發出來。

+0

我個人寧願在這種情況下使用cronjobs,另一種方法是* reeeaally * hacky! :) – GiamPy

+0

@GiamPy這是哈克哈哈,我只是把它放在那裏,因爲我喜歡集思廣益。有時候,遠遠的想法會導致更好的想法。 YOLO。還有一個選項列表可以有益於未來的讀者獲得我認爲更「完整」的理解。 – Webeng