2009-07-13 38 views
46

現在、音楽ブログを作成中です。管理者は2〜3日ごとに新しい記事を投稿します。管理者が記事を投稿すると、直ちに5,000人のユーザーに大量のメールが送信されます。PHPを使用した大量メールの送信

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

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

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

もう一つの問題:すべての5000人の加入者は、Yahooメールを使用している場合は、YahooはDDOS攻撃として扱い、私のSMTPサーバーのIPアドレスをブロックしますか?

+0

私は想像していたが、5000人の受信者には納得がいかない。 –

+0

PHP mail()関数で5000個のメールを送信するとどうなりますか?しかし、すべてのメールはBCCにありますが、mail()でループしませんか?それは大丈夫ですか? – user345602

+9

@ user346665:何千ものBCC電子メールが電子メールのヘッダに入ってくるので、次のような致命的なエラーが発生します(自分自身で取得します):php-server postfix/sendmail [26573]:fatal:[email protected](33 ):受信者を抽出できません:メッセージのヘッダーの長さが安全な制限を超過しました。 ' – YOMorales

答えて

44

まず、PHPに付属のmail()関数を使うのは最適な解決策ではありません。これは簡単にスパムとしてマークされ、HTMLメールを正しく送信するためにヘッダーを設定する必要があります。コードスニペットが機能するかどうかについては、正しくはありません。specifying extra headers

SwiftMailerを参照してください。SwiftMailerは、さまざまなMIMEタイプをサポートしていますSMTP認証(メールを迷惑メールとする可能性は低い)

+9

+1 メールサーバーをどの程度うまく制御できるかによって、遅延/時限送信を行うこともできます。一度に何百ものメッセージを送信すると、一部の宛先サーバーによってブロックされることがあります。 また、送信された各電子メールのステータスに関する詳細なログを保持することもできます。 テスト用の電子メールアカウント(テストアカウント)が100以上あり、異なる内容で段階的にテストすることが役に立ちます。 –

+6

+1 SwiftMailer – alex

+0

+1 Swiftmail、それは数年前に使用され、振り返らない。 – Chud37

15

これはアドバイスではなく、答えではありません。専用のメーリングリストソフトウェアを使用する方がはるかに優れています。 mailmanはよく使われる例ですが、mlmmjのような単純なもので十分です。大量のメールを送信することは、実際に起こっているよりも難しい作業です。メールを送信するだけでなく、迷惑メールとしてマークされているメールサーバー、またはメールサーバーを回避するために、「死んだ」アドレスを追跡する必要があります。 同じ理由で、退会しているユーザーを処理する必要があります。

あなたはこれらのことを自分で実装することができますが、特にバウンス処理は難しく、手抜きではありません。メーリングリストの管理者を使うと、作業が楽になります。

あなたのメールをyahooの口当たりを良くする方法は、まったく別の問題です。すべての欠点について、彼らはSPFとDomainKeyに大きな株式を入れているようだ。おそらくそれらを実装する必要があります。これは、メールサーバー管理者からの協力が必要です。

+0

このアドバイスをありがとう、Michiel。私は自分が管理しているウェブサイトからあらかじめ注文した顧客に約4000通のメールを送りたいと考えていました。サービスを利用するには、多くの優れた議論があり、クライアントのMailchimpアカウント(1ヶ月間)に加入者を追加するためのコストを見てみると、約30USドルの増加となりました。手作業よりもはるかに経済的です。 – Jason

12

CRONをこの種の操作に使用することを検討することがあります。一度に大量メールを送信することは確かに良くありません。スパム、ddos、サーバーがクラッシュするなどの恐れがあります。

CRONはすばらしい解決策であり、一度に100通のメールを送信してから数分待ってくださいなど。

+12

CRONからPHPスクリプトを実行しているときに、PHPをコマンドラインから実行しているときにPHPタイムアウトはありません。これは数分おきにCRONを設定する代わりに、sleep(some_time)を送信した電子メール100件をカウントしてスクリプトを続行するコードにsleep cmdを入れることができます。 – Martin

+2

@Martinのステートメントをサポートするための少しの追加: http://www.php.net/manual/en/features.commandline.differences.php – YOMorales

2

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

+0

私が間違っていない場合、SwiftMailerはPHPMailerの上に構築されていません? – Extrakun

+3

PHPMailerの上に構築されたものがたくさんありますが、PHPListもPHPMailerの上に構築されています – Roland

26

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

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

データベースにそれらを置くことによって最初にあなたは

  1. アウトスクリプト回数場合
  2. にそれを送信したり、失敗した人の記録を持っている、あなたは、あなたがしません、それを再度実行する必要があります最後に同じメールを人に2回送ってください。
  3. cronジョブから送信プロセスを実行して、一度にバッチを実行してメールサーバに圧倒されないようにしてください。

バウンスされた電子メールまたは無効な電子メールを自動化してリストから自動的に削除する方法を覚えておいてください。

多くのメールを送信している場合、いくつかのバウンスが発生します。

8

むしろphplistを使用してください。また、PHP Mailerの上に構築されており、多くの業界リーダーがそれを使用しています。私は私のクライアントにバルクメールを送信するためにそれを数回使ってきました。 phplistの素晴らしい点は、ドメインレベルと時間制限レベルでメッセージを抑制できることです。機能の完全なリストについては、次をご覧ください:http://www.phplist.com/details

私たちが持っている内部キャプチャシステムのいくつかは、ユーザベースをmaillingリストにプッシュしてから、cronエントリをトリガします毎日特定のメール。可能性は無限で、オープンソースに関するすばらしいことです!

8

は、標準PHPツールを使用して5,000人に電子メールを送信します。あなたは数秒でほとんどのISPによって禁止され、それを知らないことさえありません。メーリングリストのソフトウェアを使うか、Email Service Providerを使ってください。

+1

それは本当でしょうが、あなたのメールを毎時100メッセージ以下に保つと、ほとんどのISPはあなたにあまり悲しみを与えません。しかし、あなたがネットワークを乱用するとすぐに、あなたはそれを手に入れます!ヘッダーが標準化されていることを確認してください。ネットワークを乱用しないでください。安全です。 – Conrad

-1

なぜ自分自身をプログラムするのですか?それはブログで、Google Feedburnerを使用すると、自動的に更新プログラムを電子メールでプッシュします。

これは無料で、Googleのインフラストラクチャを使用しています。それ以上は得られない。私はいくつかの私のサイト/ブログに使用しています。

欠点は、それがではは積極的に開発し、、それ以上をサポートしていないしていないようです。あなたのビジネスを真剣に考えているなら、あなたは商業的な電子メールリストに目を通すことをお勧めします。

0

すでにLotus NotusPHPを使用しています。このソリューションは、メールサーバーへのアクセス権がある場合、またはmail server管理者に何かをリクエストすることができます。

1)mail server: "Sales Department"でグループを作成します。
2)groupにグループに必要なアカウントを割り当てます。
3)インターネットアドレスをグループに割り当てる:[email protected]
4)メール機能を使用してPHPスクリプトを作成します。
$ to = "[email protected]";
mail($ to、$件名、$メッセージ、$ヘッダー);

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

幸運の最高。

0

あなたはそれのために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(); 
?> 
関連する問題