【问题标题】:Sending mass email using PHP使用 PHP 发送大量电子邮件
【发布时间】:2010-11-10 05:29:53
【问题描述】:

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

【问题讨论】:

  • 是的,但我想对于 5000 名收件人来说相当糟糕。
  • 如果我使用 PHP mail() 函数发送 5000 封电子邮件会发生什么。但是所有邮件都在密件抄送中,而不是用 mail() 循环?可以吗?
  • @user346665:由于成千上万的密件抄送电子邮件将进入电子邮件的标题,那么您将收到以下致命错误(我自己搞定):php-server postfix/sendmail[26573]: fatal: mailer@mydomain.com(33): unable to extract recipients: message header length exceeds safety limit

标签: php email bulk massmail


【解决方案1】:

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

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

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

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    我已经使用Lotus NotusPHP 做到了。

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

    1) 在mail server 中创建一个群组:销售部

    2) 为group 分配您需要加入群组的帐户

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

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

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



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

    祝你好运。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 你的意思是 www.phplist.org 而不是 .com ?
      【解决方案4】:

      您可以使用 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();
      ?>
      

      【讨论】:

        【解决方案5】:

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

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

        通过将它们首先放入数据库中,您就拥有了

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

        请记住,如何自动将退回的电子邮件或无效电子邮件从您的列表中删除。

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 这可能是对的,但是如果您将邮件保持在每小时 100 条以下,那么大多数 ISP 不会让您感到难过;但是,一旦您滥用他们的网络,那么您就参与其中!只需确保您的标题结构符合标准;不要滥用网络,您会很安全。
          【解决方案7】:

          还有 Pear 包:

          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。

          【讨论】:

            【解决方案8】:

            还可以查看 PHPmailer 类。 PHPMailer

            【讨论】:

            • 如果我没记错的话,SwiftMailer 不是建立在 PHPMailer 之上的吗?
            • 很多东西都是建立在PHPMailer之上的,PHPList也是建立在PHPMailer之上的
            【解决方案9】:

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

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

            【讨论】:

            • 从 CRON 运行 PHP 脚本时,没有 php 超时,因为您是从命令行运行 PHP。这意味着您可以在代码中放置一个 sleep cmd,而不是每隔几分钟设置一个 CRON,该 cmd 计算发送的 100 封电子邮件,然后 sleep(some_time) 并且脚本将继续。
            • 一点补充支持@Martin 的声明:php.net/manual/en/features.commandline.differences.php
            【解决方案10】:

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

            您可以自己实现这些事情,但尤其是反弹处理是一项困难且没有回报的工作。使用邮件列表管理器会让事情变得更容易。

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

            【讨论】:

            • 感谢您的建议,米歇尔。我希望向从我管理的网站预订的客户发送大约 4000 封电子邮件。使用服务有很多很好的论据,当我查看将这些订阅者添加到我客户的 Mailchimp 帐户(一个月)的成本时,大约增加了 30 美元。比手工更经济。
            【解决方案11】:

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

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

            【讨论】:

            • +1 您可能还想进行一些延迟/定时发送,具体取决于您控制邮件服务器的能力。如果您一次发送数百条消息,某些目标服务器可能会阻止您。此外,您可能希望详细记录每封已发送电子邮件的状态。拥有 100 多个测试电子邮件帐户(您的测试帐户),并使用不同的内容逐步测试它们会有所帮助。
            猜你喜欢
            • 2011-02-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-09-25
            • 2015-02-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多