54

我目前正在写一个音乐博客。管理员每 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 地址?

4

11 回答 11

49

首先,使用 PHP 自带的 mail() 函数并不是最佳解决方案。它很容易被标记为垃圾邮件,您需要设置标题以确保您正确发送 HTML 电子邮件。至于代码片段是否会起作用,它会起作用,但我怀疑你是否会在不指定额外标题的情况下正确获得其中的 HTML 代码

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

于 2009-07-13T07:58:38.883 回答
37

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

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

首先将它们放入数据库中

  1. 您发送给谁的记录
  2. 如果您的脚本超时或失败并且您必须再次运行它,那么您最终不会向人们发送两次相同的电子邮件
  3. 您可以从 cron 作业运行发送过程并一次执行一批,这样您的邮件服务器就不会不堪重负,并跟踪已发送的内容

请记住,如何自动化退回的电子邮件或无效电子邮件,以便它们可以自动从您的列表中删除。

如果您要发送这么多电子邮件,您一定会收到一些退回邮件。

于 2009-07-13T08:46:45.777 回答
18

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

您可以自己实现这些东西,但特别是反弹处理是一项困难且没有回报的工作。使用邮件列表管理器将使事情变得容易得多。

至于如何让你的邮件适合雅虎,那就完全是另一回事了。尽管存在所有缺点,但他们似乎在SPF和 DomainKey 中投入了大量资金。您可能必须实施它们,这需要您的邮件服务器管理员的合作。

于 2009-07-13T08:01:38.877 回答
14

您可以考虑使用 CRON 进行这种操作。一次发送大量邮件当然不好,它可能会被检测为垃圾邮件、ddos、服务器崩溃等。

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

于 2009-07-13T08:21:28.243 回答
11

不要使用标准 PHP 工具向 5,000 人发送电子邮件。您将在几秒钟内被大多数 ISP 禁止,甚至永远都不知道。您应该使用一些邮件列表软件或电子邮件服务提供商这样做。

于 2009-07-13T10:54:42.960 回答
8

你为什么不使用phplist呢?它也建立在 PHP Mailer 之上,许多行业领导者都在使用它。我自己用过几次来向我的客户发送大量邮件。phplist 的好处是您可以在域级别和时间限制级别上限制您的消息。

我们还对我们拥有的几个内部捕获系统所做的是将我们的用户群推送到邮件列表,然后每天有一个 cron 条目触发给定的邮件。可能性是无穷无尽的,这就是开源的美妙之处!

于 2009-07-13T09:53:10.743 回答
4

还有梨包:

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

哭泣。

PS:不要使用 mail() 发送那 5000 封电子邮件。除了其他人所说的之外,它的效率极低,因为 mail() 为每个电子邮件集创建了一个单独的套接字,即使是同一个 MTA。

于 2009-07-13T17:09:59.790 回答
3

也看看 PHPmailer 类。PHPMailer

于 2009-07-13T08:30:55.277 回答
1

您可以为此使用 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();
?>
于 2017-07-06T09:41:08.420 回答
0

我已经使用Lotus Notusand做到了PHP

如果您有权访问邮件服务器,或者您可以向mail server管理员请求某些内容,则此解决方案有效:

1)在mail server销售部门创建一个组

2)分配给group您需要在组中的帐户

3) 为组分配一个互联网地址:salesdept@DOMAIN.com

4) 使用 mail 函数创建您的 PHP 脚本:

$to = "salesdept@DOMAIN.com";
mail($to, $subject, $message, $headers);



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

最好的运气。

于 2016-01-14T16:05:41.187 回答
0

除了使用软件之外,还有更多内容。如果您可以创建一个间歇性发送的批量电子邮件程序。假设您要发送 5,000 个收件人,创建一个循环,每次发送将发送 38 个列表,然后暂停 10 秒。在过去的几周里,我有每天手动发送 500 个的实际经验,到目前为止我取得了很好的效果。

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

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

希望能帮助到你。

于 2019-10-12T19:06:59.333 回答