web-dev-qa-db-ja.com

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

現在、音楽ブログを書いています。管理者は2〜3日ごとに新しい記事を投稿します。管理者が記事を投稿すると、すぐに約5000人の購読者に大量のメールが送信されます。

大量メール機能を実装する最良の方法は何ですか?

次の機能は動作しますか?

function massmail() 
{
  $content = '...';
  foreach ($recipients as $r) {
    $_content = $content . '<img src="http://xxx/trackOpenRate.php?id='.$r.'">';
    mail($r, 'subject', $_content);
  }
}

別の質問:5000人のサブスクライバー全員がYahoo Mailを使用している場合、YahooはそれをDDOS攻撃として扱い、SMTPサーバーのIPアドレスをブロックしますか?

50
Alan

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

SwiftMailer をご覧になることをお勧めします。HTMLサポート、さまざまなMIMEタイプのサポート、SMTP認証(メールをスパムとしてマークする可能性は低い)があります。

47
Extrakun

すべての電子メールをデータベースに挿入し(キューのようなもの)、コードで行ったように一度に1つずつ処理します(swiftmailerやphpmailerなどを使用する場合は、それも実行できます)。

各メールが送信された後、データベースを更新して、送信された日付/時刻を記録します。

それらを最初にデータベースに入れることで

  1. 送り先の記録
  2. スクリプトがタイムアウトまたは失敗し、再度実行する必要がある場合、同じメールを2回送信することはありません。
  3. cronジョブから送信プロセスを実行し、一度にバッチを実行して、メールサーバーが圧倒されないようにし、送信されたものを追跡することができます。

返送メールまたは無効なメールを自動化してリストから自動的に削除できるようにする方法を覚えておいてください。

その数のメールを送信している場合、数回のバウンスが発生します。

31
bumperbox

これはアドバイスであり、答えではありません。専用のメーリングリストソフトウェアを使用する方がはるかに優れています。 mailman はよく使用される例ですが、 mlmmj のような単純なもので十分かもしれません。大量のメールを送信することは、実際に思われるよりも実際には難しいタスクです。メールを送信する必要があるだけでなく、メール、またはさらに悪いことにメールサーバーがスパムとしてマークされないように、「デッド」アドレスを追跡する必要があります。ほぼ同じ理由で、退会する人を処理する必要があります。

これらは自分で実装できますが、特にバウンス処理は難しく、やりがいのない作業です。メーリングリストマネージャーを使用すると、作業がずっと簡単になります。

Yahooにメールを美味しくする方法については、それはまったく別の問題です。そのすべての欠点について、彼らは [〜#〜] spf [〜#〜] およびDomainKeyに大きな在庫を置いているようです。おそらくそれらを実装する必要があり、メールサーバー管理者の協力が必要になります。

17

そのような操作には、CRONの使用を検討してください。大量のメールを一度に送信することは確かに良くありません。スパム、ddos、サーバーのクラッシュなどとして検出される可能性があります。

したがって、CRONは優れたソリューションであり、一度に100通のメールを送信してから、数分、次の100通などを待ちます。

12
usoban

しないでください標準のPHPツールを使用して5,000人にメールを送信します。ほとんどのISPによって数秒で禁止されます。メーリングリストソフトウェアを使用するか、 電子メールサービスプロバイダー を使用する必要があります。

10
Nir Levy

なぜ phplist を使用しないのですか?また、PHP Mailerと多くの業界リーダーが使用しています。私はそれを自分自身でクライアントにバルクメールを送信するために数回使用しました。 phplistは、ドメインレベルと時間制限レベルでメッセージを調整できることです。

いくつかの内部キャプチャシステムで行ったのは、ユーザーベースをメーリングリストにプッシュし、毎日所定のメールをトリガーするcronエントリを作成することです。可能性は無限です。それがオープンソースのすごいところです!

8
Conrad

Pearパッケージも:

http://pear.php.net/package/Mail_Mimehttp://pear.php.net/package/Mailhttp:// pear。 php.net/package/Mail_Queue

すすり泣き。

PS:これらの5000通のメールを送信するためにmail()を使用しないでください。誰もが言ったことに加えて、mail()は同じMTAに対してさえ、メールセットごとに個別のソケットを作成するため、非常に非効率的です。

4
bucabay

PHPmailerクラスもご覧ください。 PHPMailer

2
Roland

Swiftmailerを使用できます。バッチ処理を使用します。

<?php
    $message = Swift_Message::newInstance()
      ->setSubject('Let\'s get together today.')
      ->setFrom(array('[email protected]' => 'From Me'))
      ->setBody('Here is the message itself')
      ->addPart('<b>Test message being sent!!</b>', 'text/html');

    $data = mysql_query('SELECT first, last, email FROM users WHERE is_active=1') or die(mysql_error());
    while($row = mysql_fetch_assoc($data))
    {
       $message->addTo($row['email'], $row['first'] . ' ' . $row['last']);
    }

    $message->batchSend();
?>
0
Krishna Ghodke

すでにLotus NotusPHPを使用して実行しました。このソリューションは、メールサーバーにアクセスできる場合、またはmail server管理者に何かを要求できる場合に機能します。

1)mail server:「Sales Department」にグループを作成します。
2)groupに、グループに属する必要があるアカウントを割り当てます。
3)グループにインターネットアドレスを割り当てます:[email protected]
4)メール機能を使用して、PHPスクリプトを作成)を作成します。
$ to = "[email protected]";
mail($ to、$ subject、$ message、$ headers);

それは私のために働き、グループに含まれるすべてのアカウントがメールを受け取ります。

最高の幸運。

0
RGA