限制PHPmailer在Elgg中使用

时间:2012-11-07 20:40:14

标签: php elgg

我将使用社交网络软件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;
  }
}

?>

2 个答案:

答案 0 :(得分:1)

  1. 从php 5.3开始不推荐使用安全模式,在php 5.4中删除了安全模式,所以如果您的安装相对较新,那么这是一个有争议的问题:http://php.net/manual/en/ini.sect.safe-mode.php#ini.safe-mode

  2. 执行set_time_limit()将重置计数器,因此只要您的代码在比之前设置的限制更短的时间内达到set_time_limit()调用(例如,在29秒内到达,在时钟上留下1秒) ),代码将重置计时器并再获得30秒。但是,由于您不希望代码充满活力,因此您应该完全禁用时间限制。

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

  4. 同样,如果您正在进行这样的批处理,那么在脚本实际运行和构建电子邮件的几秒钟内,服务器故障将只会“糟糕”。其余的时间PHP脚本甚至都不会运行,并且由smtp服务器完成它的工作。

答案 1 :(得分:0)

我可能不是快速而专注的帮助,但我会考虑采用异步方法。

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

最简单的方法是只在电子邮件中存储电子邮件,并在服务器上运行cronjob,批量发送电子邮件。

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

我最后也许是最舒服的选择是使用MailChimpPostmark等网络服务。