php邮件列表的改进

时间:2016-02-15 11:30:00

标签: php list email

我有一个包含邮件列表订阅者的数据库。

我正在使用php脚本从数据库中获取电子邮件地址,然后向每个地址发送电子邮件。 这种情况很好,直到订阅者数量增长为止。

现在,脚本超时,一些订阅者报告他们收到了多封电子邮件,有些订阅者根本没有收到电子邮件。

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

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

<?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>';
        }
    }       

3 个答案:

答案 0 :(得分:0)

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

在您的情况下,为了避免重复,请使用以下查询。

$ query =“SELECT DISTINCT(email)FROM subscriber WHERE type = 1”; //这将只获取不同的电子邮件。

页面也有可能超时。 您总是可以增加最长执行时间。

有三种方法可以做到。

用htaccess php_value max_execution_time 300

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

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

答案 1 :(得分:0)

逐个向每个人发送电子邮件是不好的做法。它会降低你的系统速度。你为什么不使用任何库?市场上有一个很棒的图书馆叫做Swift Mailer。只是使用它。它真的会帮助你。

  

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

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

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

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

答案 2 :(得分:0)

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

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

  1. 衡量各种规模用户的脚本执行时间。
  2. 选择&#34;批量大小&#34;在时间限制之内舒适地完成。
  3. 将您的邮件工作分成这个大小的批量/批次。
  4. 棘手的部分是将您所处的状态切换到批处理的下一个循环。您可以选择编写&#34;批处理光标位置&#34;进入数据库,或者只是将您的电子邮件批处理页面重定向到自己,然后退出&#34;从这里开始&#34; URL中的参数。

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