【问题标题】:PHP Mass Email Best Practices? (PHPMailer + Gmail)PHP 群发邮件最佳实践? (PHPMailer + Gmail)
【发布时间】:2010-12-20 18:28:44
【问题描述】:

我正在考虑如何处理从我的网络应用程序发送大量电子邮件,以及这样做是否有任何最佳做法。 StackOverflow 已经将其标记为“主观”,这在一定程度上可能是这样,但我需要知道实现该系统的最成功方法,或者是否存在任何标准化方法。

在我的 webapp 中,有一些用户是 1 到 10,000 个用户组的负责人。该用户必须能够通过我的系统通过电子邮件向所有这些用户发送消息。因此,我的系统负责向每个组长的个人用户发送多达 10,000 封电子邮件。

据我所知,GMail 对向个人发送邮件没有速率限制(尽管最多有 500 个收件人)。

现在,我当前的设置是:

  • 当消息通过系统发送时,它会进入电子邮件队列。
  • cron 脚本每隔几分钟从队列中抓取消息,然后发送这些电子邮件。
  • 所有电子邮件都通过 GMail 的 SMTP 服务器发送。
  • 执行邮件的实际应用程序是 PHPMailer。

随着用户群的增长,这种设置可能不够用。我的问题是:

  1. 我应该改用本地 SMTP 服务器吗?
  2. 我应该在本地机器上使用邮件二进制文件吗?在这种情况下,我可以完全跳过队列吗?
  3. 是否有公认的方法来做到这一点?

谢谢!

【问题讨论】:

  • 感谢大家的回答,尤其是Alfred,特别详细的回答。只要我的声望得分超过 15,我就会给你们投票。

标签: php email gmail standards


【解决方案1】:

Gmail 和 Google Apps 将您限制为每天大约 500 封电子邮件。我不确定这如何与最多 500 个收件人相结合,但如果您想发送 10 000 封电子邮件,您可能需要找到另一个邮件服务器。我个人使用本地服务器或 ISP 或数据中心的 SMTP。

如果您要发送这么多电子邮件,我建议您使用队列,这样用户就不会坐在那里等待发送电子邮件。

【讨论】:

    【解决方案2】:

    由于每天有 10.000 封“高”电子邮件数量,我不会依赖 GMail(或任何其他)SMTP。并不是说他们不能处理,显然他们可以处理更多。但他们可能不想。

    拥有本地 SMTP 服务器是 IMO 的必经之路:

    • 设置非常简单(只是不要让人们在没有强大的身份验证方案的情况下使用它)
    • 最现代的MTA 可以很好地处理发送队列
    • 您不必面对 GMail(或其他人)决定某天出于配额原因阻止您的帐户

    【讨论】:

      【解决方案3】:

      谷歌应用引擎

      我会在 Google 应用引擎 (python) 中编写此代码,因为:

      • 它可以很好地扩展。
      • 它有一个很好的电子邮件 api。
      • 它有一个任务队列和一个很好的 api 来访问它。
      • 因为 python 是一门非常好的语言。
      • 它(相对)便宜。

      PHP

      如果我会在 PHP 中实现它,我会

      • 为自己找一个好的 SMTP 服务器,它可以让您发送这种数量的邮件,因为 Gmail 不允许您发送这种数量的邮件。我确信这会花费您一些钱。
      • 为自己找一个不错的 PHP 电子邮件库,用于发送消息,例如您所说的 PHPMailer。
      • 使用诸如 beanstalkd 之类的消息队列将电子邮件消息放入队列并异步发送电子邮件。首先,因为有了这个,用户将有更快的页面加载。其次,使用像 beanstalkd 这样的消息队列,您可以更好地调节发送速度,这将防止您的电脑因工作而超载。您需要对服务器具有 ssh 访问权限才能编译(安装)beantalkd。你可以在beanstalkd找到beantalkd
      • 您还需要 ssh 访问权限才能在后台运行 PHP 脚本,该脚本将处理消息队列。您可以在 php beanstalkd-client 找到 beanstalkd 客户端

      来自 php/apache/网页

      这是您向用户发送消息的页面。在此页面中,您将通过以下代码行向 beanstalkd 发送消息:

      // register Pheanstalk class loader
      require_once('pheanstalk_init.php');
      $pheanstalk = new Pheanstalk('127.0.0.1');
      $message = ""; // This would contain your message
      $pheanstalk->put(json_encode($message);
      

      您必须使用 put 命令将消息放入消息队列中

      来自后台长时间运行的 PHP 脚本:

      代码如下所示:

      // register Pheanstalk class loader
      require_once('pheanstalk_init.php');
      $pheanstalk = new Pheanstalk('127.0.0.1');
      
      while(true) {
        $job =  $pheanstalk->reserve();
        $email = json_decode($job->getData());
        // Sent email using PHP mailer.
        $pheanstalk->delete($job);
      }
      

      就像我说的,PHP 和 Google 应用引擎都可以,但我会选择应用引擎,因为它更容易实现。

      【讨论】:

        【解决方案4】:

        请务必小心,不要将您的域作为垃圾邮件域列入黑名单。如果是这样,您可以预期您的大部分电子邮件会被阻止、支持、销售等。这反过来可能会非常昂贵。

        您可能希望使用AWeber 之类的服务。它们不仅可以处理这些数量的电子邮件,而且它们可能会为您提供比您自己实现的更多的指标。

        【讨论】:

          【解决方案5】:

          我不确定它是否会在任何地方发布,但根据经验,我可以告诉您,如果您开始一次发送数百封邮件,Gmail 会冻结您的帐户十五分钟左右。这上周发生在我身上。我认为您应该托管自己的 SMTP 服务器。使用 mail() 函数通常会将您的邮件放入某人的垃圾邮件文件夹中。

          【讨论】:

            【解决方案6】:

            只需在本地机器或同一 LAN 上的机器上安装 Postfix 即可获得最大的访问速度。确保它从外部得到很好的保护,并且可以从内部快速访问。

            然后编写您的 PHP 脚本以将电子邮件直接注入 Postfix 队列。这将大大提高邮件传递的处理速度。

            【讨论】:

              猜你喜欢
              • 2011-07-08
              • 2013-01-22
              • 2016-09-08
              • 2017-11-04
              • 2013-09-06
              • 2021-02-28
              • 1970-01-01
              • 2012-11-16
              • 1970-01-01
              相关资源
              最近更新 更多