使用PHP发送大量电子邮件

时间:2009-07-13 07:47:43

标签: php email bulk massmail

我目前正在写一个音乐博客。管理员每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,雅虎会将其视为DDOS攻击并阻止我的SMTP服务器的IP地址吗?

12 个答案:

答案 0 :(得分:46)

首先,使用PHP附带的mail()函数不是最佳解决方案。它很容易被标记为垃圾邮件,您需要设置标题以确保正确发送HTML电子邮件。至于代码片段是否可行,它会,但我怀疑你会在没有specifying extra headers的情况下正确地获取HTML代码

我建议你看一下SwiftMailer,它有HTML支持,支持不同的mime类型和SMTP身份验证(不太可能将你的邮件标记为垃圾邮件)。

答案 1 :(得分:30)

我会将所有电子邮件插入数据库(有点像队列),然后像在代码中一样处理一个(如果你想使用swiftmailer或phpmailer等,你也可以这样做。)

发送每封邮件后,更新数据库以记录发送的日期/时间。

首先将它们放入数据库中

  1. 您将其发送给
  2. 的记录
  3. 如果您的脚本超时或失败并且您必须再次运行它,那么您最终不会向同一时间的人发送相同的电子邮件
  4. 您可以从cron作业运行发送过程并一次执行批处理,以便您的邮件服务器不会被淹没,并跟踪已发送的内容
  5. 请注意,如何自动发送退回的电子邮件或无效的电子邮件,以便他们自动从列表中删除。

    如果你要发送那么多电子邮件,你肯定会有一些反弹。

答案 2 :(得分:17)

这是建议,而不是答案:使用专用邮件列表软件你会好得多。 mailman是一个常用的例子,但像mlmmj这样简单的东西就足够了。发送大量邮件实际上比实际看起来更困难。您不仅需要发送邮件,还必须跟踪“死”地址,以避免您的邮件,或者更糟糕的是,您的邮件服务器被标记为垃圾邮件。 出于同样的原因,你必须处理取消订阅的人。

你可以自己实施这些东西,但特别是反弹处理是困难和无益的工作。使用邮件列表管理器可以使事情变得更容易。

至于如何使你的邮件适合雅虎,这完全是另一回事。尽管有这些缺点,但它们似乎在SPF和DomainKey中都有很大的优势。您可能必须实现它们,这将需要您的邮件服务器管理员的合作。

答案 3 :(得分:12)

您可以考虑将CRON用于此类操作。一次发送大量邮件肯定不好,可能会被检测为垃圾邮件,ddos,崩溃服务器等。

所以CRON可能是一个很好的解决方案,一次发送100封邮件,然后等待几分钟,接下来发送100封等等。

答案 4 :(得分:9)

不要使用标准PHP工具向5,000人发送电子邮件。您将在几秒钟内被大多数ISP禁止,甚至从未知道。您应该使用一些邮件列表软件或Email Service Provider来做到这一点。

答案 5 :(得分:8)

为什么不宁愿使用phplist?它也建立在PHP Mailer之上,很多行业领导者正在使用它。我自己曾经多次使用它向我的客户发送大量邮件。关于phplist的好处是你可以在域级加上时间限制级别来限制你的消息。

我们用几个内部捕获系统完成的工作是将用户群推送到填充列表,然后每天都有一个cron条目触发给定的邮件。可能性是无穷无尽的,这是开源的绝佳之处!

答案 6 :(得分:4)

还有梨包:

http://pear.php.net/package/Mail_Mime http://pear.php.net/package/Mail http://pear.php.net/package/Mail_Queue

SOB。

PS:请勿使用mail()发送5000封电子邮件。除了其他人所说的,这是非常低效的,因为mail()为每个电子邮件集创建一个单独的套接字,甚至是同一个MTA。

答案 7 :(得分:2)

另请参阅PHPmailer类。 PHPMailer

答案 8 :(得分:0)

我已经使用Lotus NotusPHP完成了该操作。如果您有权访问邮件服务器,或者您可以向mail server管理员请求某些内容:

,则此解决方案有效

1)在mail server:“销售部门”中创建一个组 2)分配到group您需要在该组中的帐户 3)为该组分配一个互联网地址:salesdept@DOMAIN.com 4)使用mail函数创建PHP脚本:
   $ to =“salesdept@DOMAIN.com”;
   邮件($ to,$ subject,$ message,$ headers);

它对我有用,并且该组中包含的所有帐户都收到了邮件。

最好的运气。

答案 9 :(得分:0)

你可以使用swiftmailer。通过使用批处理。

<?php
    $message = Swift_Message::newInstance()
      ->setSubject('Let\'s get together today.')
      ->setFrom(array('myfrom@domain.com' => '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();
?>

答案 10 :(得分:0)

除了使用软件外,还有更多内容。如果您可以创建间歇发送的批量电子邮件程序。假设您要发送5,000个收件人,请创建一个循环,该循环将每次发送38个列表,然后暂停10秒钟。在过去的几周中,我每天实际发送500条消息,到目前为止,我取得了不错的成绩。

另一个要考虑的是您电子邮件的内容。如今,这是您需要提供实际办公地址和“退订”退出的标准。这些是大多数收件人电子邮件服务器正在检查的因素。如果您没有这些内容,他们会将您归类为垃圾邮件发送者。

Mailchimp是我的最佳建议,如果您希望付费服务提供商向您的电子邮件订阅者发送邮件而不发送未经请求的邮件或冷邮件营销。

希望有帮助。

答案 11 :(得分:-1)

为什么要打扰自己?这是一个博客,只需使用Google Feedburner即可通过电子邮件自动向订阅者推送更新。

免费,它使用 Google的基础架构。不能比这更好。我将它用于我的一些网站/博客,效果非常好。

缺点是似乎正在积极开发,不支持。如果你认真对待你的业务,我建议你不要去商业电子邮件列表。