以编程方式个性化批量电子邮件,无需超时

时间:2009-08-06 14:52:26

标签: php email timeout queue bulk

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

由于个性化要求,以及它们仅通过电子邮件发送一次(每年或两年具有重叠但不同的用户列表)的事实,正式邮件列表可能(并且优选地)出来。第三方批量电子邮件服务也已经发布。

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

当这在一年前完成之前,我编写了一个PHP脚本,只需在电子邮件列表中逐行读取用户名,电子邮件地址和语言代码,然后在提供之前构建所需的电子邮件文本。 PHPMailer单独发送。我遇到的问题是脚本超时,我不知道它到底在哪里,以便我可以在正确的地方修剪电子邮件列表重新开始。我最终手动将1个电子邮件列表分成几个足够短的子列表,以便脚本不会超时。我如何避免超时,或者跟踪脚本在电子邮件地址方面的位置,以便可以手动重新启动,并且不会向任何人发送多次电子邮件?

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

3 个答案:

答案 0 :(得分:2)

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

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

现在cli子进程(A)可以fork(并成为父进程)并监视发送电子邮件的子进程(B)。如果孩子B死亡,那么现在的父A进程可以再次进行分叉,并且新的子进程继续前一个离开的位置。

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

我希望你明白这一点。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

您说没有Cron脚本 - 您是否在服务器上无法访问Cron?或者您不想在每次发送邮件作业时手动设置Cron作业?

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

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