代码之家  ›  专栏  ›  技术社区  ›  KTC

以编程方式个性化批量电子邮件而不超时

  •  0
  • KTC  · 技术社区  · 15 年前

    我有一个大约5000到10000(个人用户提供)来自世界各地的人的电子邮件地址列表,每个都与他们的用户名和语言代码相关。我也有一个单一的信息翻译成不同的语言的用户,我想通过电子邮件。现在,我想向每个地址发送一封纯文本电子邮件,电子邮件的实际文本根据用户语言的不同而有所不同,并使用我发送电子邮件的人的用户名进行个性化设置。

    由于个性化的要求,而且事实上他们只会通过电子邮件发送一次(每年或两次,有重叠但不同的用户列表),正式的邮件列表很可能(最好)被删除。第三方批量电子邮件服务也已退出。

    忽略编程时间,在(最好是)PHP中,最省时的手动方法是什么?(我正在编写脚本,但不一定是“按下按钮”发送脚本的人。)理想的结果是,发送脚本的人只需键入一个命令即可运行脚本(提供电子邮件列表),所有电子邮件都将在不需要用户干预的情况下发送。这意味着我希望避免设置cron作业来重复运行脚本,直到电子邮件列表用完。

    在一年前完成这项工作时,我编写了一个PHP脚本,它只需逐行在电子邮件列表中读取用户名、电子邮件地址和语言代码,并在将其提供给phpmailer单独发送之前,从中构建所需的电子邮件文本。我遇到的问题是脚本超时了,我不知道它的作用是什么,这样我就可以在正确的地方整理电子邮件列表,重新开始。最后我手动将1个电子邮件列表拆分为几个足够短的子列表,这样脚本就不会超时。如何避免超时,或者跟踪脚本在电子邮件地址方面的位置,以便手动重新启动脚本,并且不会有任何人多次收到电子邮件?

    还有哪些其他问题需要考虑,如避免黑名单等?

    3 回复  |  直到 15 年前
        1
  •  2
  •   OIS    15 年前

    您需要阅读关于函数set_time_limit和ini_set(‘memory_limit’,xxmb’)的内容;

    您可以从Web进程中运行php cli脚本,这将导致( pcntl_fork )然后杀死父级(父级CLI进程退出)。运行脚本的Web服务器线程可以继续使用其他代码或退出。

    现在,cli子进程(a)可以分叉(并成为父进程)并监视发送电子邮件的子进程(b)。如果子进程B死了,那么现在的父进程A可以再次分叉,新的子进程将在前一个进程停止的地方继续。

    您必须在文件/db/共享内存或通过成对的套接字跟踪发送电子邮件的对象。( socket_create_pair )使用父进程。

    我希望你明白这个想法。

        2
  •  1
  •   bdonlan    15 年前

    在这里,PHP不是合适的工作工具——您需要独立于Web服务器运行的东西(尽管可能由它触发),否则您肯定会遇到超时。

    例如,您可以使用PHP system() 输出到另一个脚本(perl?蟒蛇?)从数据库中读取作业信息,然后分叉到后台进行工作。

        3
  •  1
  •   matthock    15 年前

    你说没有cron脚本-你没有访问服务器上的cron的权限吗?或者您的问题是不想在每次必须发送邮件作业时手动设置cron作业?

    你可能想看看 http://pear.php.net/package/Mail_Queue -这是我最近一直用的东西。您可以让名为script的用户将所有电子邮件一次转储到邮件队列中。这比实时发送电子邮件要快得多,因为您不需要处理服务器之间的通信,而只需要处理数据库。

    然后,您有一个cron脚本,每隔几分钟调用mail_queue::sendmailsinqueue命令,对每个cron调用发送的电子邮件数进行限制。如果这是您的问题,那么您不必处理cron脚本——如果队列是空的,那么它将退出。然后,您的电子邮件将以合理的速度从服务器中流出。这将防止超时,因为每个cron调用的电子邮件限制。这也有助于避免与其他邮件服务器的麻烦,他们可能不高兴突然受到来自您的许多电子邮件的打击。