PHP 邮件列表改进


php mail list improvements

我有一个数据库,里面有邮件列表的订阅者。

我正在使用 php 脚本从数据库中获取电子邮件地址,然后向每个地址发送电子邮件。这一直工作正常,直到订阅者数量增长到很大。

现在,脚本超时,一些订阅者

报告他们收到不止一封电子邮件,一些订阅者根本没有收到电子邮件。

我认为问题可能是脚本需要很长时间才能执行,因为从数据库返回了许多行(163 个订阅者(,但我注意到肯定。我无法访问 php.ini 文件(服务器是共享平台(

有人对如何改进我的脚本有任何建议吗?如何确保每个订阅者都能收到一封电子邮件,有没有办法避免重复?

<?php
//Database connection script
include_once 'inc/dbconnect.php';

$message='Test message';

    $query="SELECT * FROM subscribers WHERE type=1";
    $res1=mysqli_query($dbh, $query) or die(mysqli_error());
    while($user=mysqli_fetch_array($res1)){ 
        $from='myname@mydomain.se';
        $fromname='My name';
        $to=$user['email'];
        $subject='Message subject';
        $header='From: myname@mydomain.se
Reply-To: myname@mydomain.se
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
X-mailer: PHP '.phpversion();   

        if(mail($to, $subject, $message, $header)){
            print 'Mail sent to '.$to.'<br>';
        }
        else{
        print 'Could not send mail to '.$to.'<br>';
        }
    }       

要优化查询,请始终使用逗号分隔的字段名称,而不是使用 *。

为了避免重复,请使用以下查询。

$query="从订阅者中选择不同(电子邮件(,其中类型= 1"; 这将仅获取不同的电子邮件。

页面也有可能超时。您始终可以增加最大执行时间。

有 3 种方法可以做到这一点。

使用htaccess访问php_value max_execution_time 300

使用 PHP 动态更改ini_set("max_execution_time",300(;

php.ini//的更改 为此,如果您无法直接访问它,您需要联系服务器人员来帮助您。max_execution_time = 120

向所有人逐个发送电子邮件是一种不好的做法。它会减慢您的系统速度。你为什么不使用任何库?市场上有一个很棒的库,叫做 Swift Mailer。只需使用它。它真的会帮助你。

Swift Mailer 集成到任何用 PHP 5 编写的 Web 应用程序中,提供 灵活而优雅的面向对象发送电子邮件的方法 众多功能。

主页网址 : http://swiftmailer.org/

Github : https://github.com/swiftmailer/swiftmailer

它允许您通过提供多个收件人的数组一次发送多封电子邮件。

PHP 通常在请求/响应环境中运行。来自服务器的每个响应都有一个运行时限制,以避免单个响应使服务器过载。正如你所说,这可能是你的问题。如果不是现在,随着用户数量的增加,它很可能会成为一个问题。

如果您无法更改执行时间限制(可能在共享服务器上(,那么为了处理这个问题,我会-

  1. 测量各种大小批次的用户的脚本执行时间。
  2. 选择一个在时间限制内轻松完成的"批量大小"。
  3. 将您的邮件作业分解为该大小的块/批次。

棘手的部分是将您必须进入的状态移交给批处理的下一个周期。您可以考虑将"批处理光标位置"写入数据库,或者只是将您的电子邮件批处理页面重定向到自身,然后在 URL 中使用"从此处开始"参数退出。

从长远来看,您可能需要考虑使用通用批处理队列工具来处理长时间运行的作业。不过,这可能需要访问服务器上的cron,假设您运行在Linux/Unix机器上。