4

重複の可能性:
PHPを使用して大量のメールを送信する

月刊/週刊ニュースレターなど、DB内のすべてのユーザーに個別のメールを送信するPHPスクリプトがあります。

私が使用しているコードは次のとおりです。

$subject = $_POST['subject'];
$message = $_POST['message'];

// Get all the mailing list subscribers.
$query = $db->prepare("SELECT * FROM maildb");
$query->execute();

// Loop through all susbcribers, and send and individual email.
foreach ($query as $row) {

    // Setting maximum time limit to infinite.
    set_time_limit(0);

    $newMessage = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
        </head>
        <body>';

    // Search for the [unsubscribe] tag and replace it with a URL for the user to unsubscribe
    $newMessage .= str_replace("[unsubscribe]", "<a href='".BASE_URL."unsubscribe/".$row['hash']."/".$row['email']."'>unsubscribe</a>", $message);

    $newMessage .= '</body></html>';

    $to = $row['email'];

    // Establish content headers
    $headers = "From: info@domain.com"."\n";
    $headers .= "Reply-To: bounce@domain.com"."\n";
    $headers .= "X-Mailer: PHP v.". phpversion()."\n";
    $headers .= "MIME-Version: 1.0"."\n";  
    $headers .= "Content-Type: text/html; charset=iso-8859-1"."\n";
    $headers .= "Content-Transfer-Encoding: 8bit;";

    mail($to, $subject, $newMessage, $headers); // Send email to each individual user

}

このコードは、非常に小さなデータベースで完全に機能します...最近、テストデータベースに20万人以上のユーザーを配置しましたが、明らかにこのスクリプトは失敗し、メモリが不足し、停止します...

これは非常に多くのメールを送信するのに悪い方法であることを私は知っています。そのため、これを行うためのはるかに効率的な方法をお願いしたいと思います。

どうもありがとうございます!

4

5 に答える 5

2

発生するタイムアウトは、ApacheおよびPHPの実行制限が原因です。

CLIアプリケーションとして実行する必要がありますset_time_limit(0);

/path/to/app/script.phpコンソールでこのようなものをまっすぐにphpします。

SSHアクセスがない場合は、次shell_execのように実行します。

shell_exec("php /path/to/app/script.php > /dev/null 2>/dev/null &");

これにより、それを呼び出すスクリプトが終了するまでぶらぶらしないようになります。

于 2012-09-02T16:23:34.437 に答える
1

1分ごとまたは一定の間隔で実行するようにCronスケジューラを設定できます。スクリプトを実行するたびに、データベースからいくつかのレコードが選択され、データベースから削除されるか、非アクティブとして設定されます。小さなチャンクにメールを送信し、スクリプトを終了させます。別のcron呼び出しでは、他のいくつかのレコードが選択されて終了します。また、exec()を利用することもできます。

于 2012-09-02T16:24:46.750 に答える
1

一度に数個だけ送信するようにバッチで実行し、データベースにその月のニュースレターが送信されたかどうかを確認するフィールドを作成し、ニュースレターがそのユーザーに送信されたときにチェックオフします。全員に送信されるまで、スクリプトを実行し続けることができます。

于 2012-09-02T16:26:48.243 に答える
0

implodeユーザーを変数に入れて、一度にメールを送信したい

$to_array = array();

foreach ($query as $row) {

  $to_array[] = $row['email'];

}

$to = implode(', ', $to_array);

//do your email stuff here

 mail($to, $subject, $newMessage, $headers); // Send email to all users at once

お役に立てれば :-)

于 2012-09-02T16:28:49.573 に答える
0

このURLを参照してください:-

PHPを使用して大量のメールを送信する

まず、PHPに付属しているmail()関数を使用することは、最適なソリューションではありません。スパムとして簡単にマークされるため、HTMLメールを正しく送信するためにヘッダーを設定する必要があります。コードスニペットが機能するかどうかについては、機能しますが、余分なヘッダーを指定しなくても、HTMLコードが正しく機能するかどうかは疑問です。

HTMLをサポートし、さまざまなmimeタイプをサポートし、SMTP認証(メールをスパムとしてマークする可能性が低い)を備えたSwiftMailerを確認することをお勧めします。

于 2012-09-02T16:29:02.987 に答える