0

我将使用社交网络软件 Elgg,用于需要在需要时向特定组发送大量电子邮件的组织。电子邮件的数量可以在 10-1000 之间,具体取决于组。Web 主机每小时仅允许 500 封电子邮件,因此我需要限制脚本以每 8 秒发送一封电子邮件。

我正在将 PHPmailer 与 Elgg 一起使用。PHPmailer 说我应该结合使用这两个脚本(下面的代码)来限制邮件发送。我知道我将如何使用邮件脚本中的代码,我只是不确定一些事情。

1)我不太了解安全模式的目的

2) 在查找 set_time_limit 之后,看起来我应该将其设置为允许发送所有潜在电子邮件的时间量,无论是 10 还是 1000?或者如果需要超时,每个循环最多 30 秒?

3)我应该如何设置它以获得我需要的东西?

链接到 PHPmailer 描述代码:

http://phpmailer.worxware.com/index.php?pg=tip_ext

http://phpmailer.worxware.com/index.php?pg=tip_pause

 <?php

/* The following code snippet with set the maximum execution time
 * of your script to 300 seconds (5 minutes)
 * Note: set_time_limit() does not work with safe_mode enabled
 */

$safeMode = ( @ini_get("safe_mode") == 'On' || @ini_get("safe_mode") === 1 ) ? TRUE : FALSE;
if ( $safeMode === FALSE ) {
  set_time_limit(300); // Sets maximum execution time to 5 minutes (300 seconds)
  // ini_set("max_execution_time", "300"); // this does the same as "set_time_limit(300)"
}

echo "max_execution_time " . ini_get('max_execution_time') . "<br>";

/* if you are using a loop to execute your mailing list (example: from a database),
 * put the command in the loop
 */

while (1==1) {
  set_time_limit(30); // sets (or resets) maximum  execution time to 30 seconds)
  // .... put code to process in here
  if (1!=1) {
    break;
  }
}

?>

<?php

/* Note: set_time_limit() does not work with safe_mode enabled */

while (1==1) {
  set_time_limit(30); // sets (or resets) maximum  execution time to 30 seconds)
  // .... put code to process in here

  usleep(1000000); // sleep for 1 million micro seconds - will not work with Windows servers / PHP4
  // sleep(1); // sleep for 1 seconds (use with Windows servers / PHP4
  if (1!=1) {
    break;
  }
}

?>
4

2 回答 2

1
  1. 安全模式从 php 5.3 开始被弃用,并在 php 5.4 中被删除,所以如果你的安装是相对较新的,这是一个有争议的问题:http: //php.net/manual/en/ini.sect.safe-mode.php#ini 。安全模式

  2. 执行 set_time_limit() 将重置计数器,因此只要您的代码在比先前设置的限制更短的时间内到达 set_time_limit() 调用(例如,在 29 秒内到达那里,时钟留出 1 秒),代码将重置计时器并获得另外 30 秒。但是,由于您不希望您的代码过于激烈,您应该完全禁用时间限制。

  3. 就个人而言,我不会每 8 秒发送一封电子邮件。我会爆破我们被允许的 500 个,然后有一个预定的工作,每小时启动一次脚本,然后从爆炸停止的地方继续。这将使邮件服务器的事情变得有点突发,但从长远来看可能会更有效,因为它可以将相同收件人域的电子邮件批处理在一起。例如,500 个组中的所有@aol.com 邮件可以一起发送,而不是强制服务器多次连接到 aol 以传递单个邮件。

同样,如果您像这样进行批处理,则服务器故障只会在脚本实际运行和构建电子邮件的几秒钟内“坏”。其余时间 PHP 脚本甚至都不会运行,这将由 smtp 服务器来完成。

于 2012-11-07T20:45:28.073 回答
0

我可能没有快速和特别的帮助,但我会考虑采用异步方法。

这涉及将发送电子邮件的任务存储在队列中,并让工作人员处理这些任务。

最简单的方法是将电子邮件存储在数据库中,并在服务器上运行一个 cronjob 以批量发送电子邮件。

更好(但更复杂)的解决方案是使用某种消息队列系统,如zeromq或重量级rabbitmq

我想到的最后一个可能也是最舒服的选择是使用MailChimpPostmark之类的 Web 服务。

于 2012-11-07T20:49:29.360 回答