0

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

由于个性化的要求,以及他们只会通过电子邮件发送一次(每年或两年有重叠但不同的用户列表)的事实,正式的邮件列表可能(最好)已经出局。3rd 方批量电子邮件服务也已推出。

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

在一年前完成此操作时,我编写了一个 PHP 脚本,它简单地逐行读取电子邮件列表,处理用户名、电子邮件地址和语言代码,并从中构建所需的电子邮件文本,然后将其提供给 PHPMailer 以发送分别。我遇到的问题是脚本超时,我不知道它到了哪里,以便我可以在正确的位置修剪电子邮件列表以重新开始。我最终手动将 1 个电子邮件列表拆分为几个足够短的子列表,以便脚本不会超时。我如何避免超时,或者跟踪脚本在哪里取决于电子邮件地址,以便可以手动重新启动它并且没有人被多次发送电子邮件?

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

4

3 回答 3

2

您需要阅读有关函数 set_time_limit 和 ini_set('memory_limit', xxMB') 的信息;

您可以从您的 Web 进程运行 php cli 脚本,该脚本分叉(pcntl_fork)然后杀死父进程(父 cli 进程退出)。然后,运行脚本的网络服务器线程可以继续执行其他代码或退出。

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

您必须在文件/数据库/共享内存中或通过与父进程配对的套接字( socket_create_pair )跟踪您向谁发送了电子邮件。

我希望你能明白。

于 2009-08-06T15:14:34.497 回答
1

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

例如,您可以将 PHP system()输出到另一个脚本(Perl?Python?),该脚本从数据库中读取作业信息,然后分叉到后台执行其工作。

于 2009-08-06T14:57:52.170 回答
1

你说没有 Cron 脚本——你不能访问你服务器上的 Cron 吗?或者您是否担心每次必须发送邮件作业时都不想手动设置 Cron 作业?

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

然后你有一个 Cron 脚本,它每隔几分钟调用 Mail_Queue::sendMailsInQueue 命令,并限制每次 Cron 调用发送的电子邮件数量。如果您担心的话,您不必弄乱 Cron 脚本 - 如果队列为空,它就会退出。然后,您的电子邮件将在每次通话时以合理的速度从服务器中流出。这将防止由于每次 cron 调用的电子邮件限制而导致的超时。它还有助于避免其他邮件服务器出现问题,这些服务器可能不乐意突然被您的大量电子邮件重创。

于 2009-08-06T15:08:54.273 回答