PHP&梨::邮件记忆耗尽

时间:2010-10-04 15:56:39

标签: php loops email pear

以下解决方案

你好。我一直在尝试不同的方法来解决这个问题,但仍然遇到同样的错误。我有一个表单,您可以选择一些用户的电子邮件地址和一些pdf文件,它将发送给他们。问题是PHP会抛出错误,因为脚本使用了大量内存(超过90兆)。我尝试过使用mail()并尝试使用PEAR:Mail_Mime还有其他方法可以做到这一点吗?


include_once('Mail.php');
include_once('Mail/mime.php');
$from = "it@example.com";
$subject = $_POST[subject];
$text = $_POST[message];

if (count($_POST[emailEnq]) > 0) {
 foreach ($_POST[emailEnq] as $Ekey => $Evalue) {
  $message = new Mail_mime();
  $message->setTXTBody($text);
  if (count($_POST[emailFile]) > 0) {
   foreach ($_POST[emailFile] as $key => $value) {
    $filepath = "/home/mds07/console/admin/media/listings/" . $_POST[list_ID] . "/docs/";
    ////////////////////You will need to change the above line if the location of the PHP program ever moves////////////////////////////
    $fileatt = $filepath . $value;
    $message->addAttachment($fileatt);
   }
  }
  $body = $message->get();
  $extraheaders = array("From" => $from, "Subject" => $subject);
  $headers = $message->headers($extraheaders);
  $mail = Mail::factory("mail");
  $mail->send($Evalue, $headers, $body);
 }
}


以下代码使用更好的内存使用情况:

$from = "it@example.com";

echo 'From: '.$from."\n"; echo 'Subject: '.$_POST[subject]."\n"; echo 'Text: '.$_POST[message]."\n";

include_once('Mail.php'); include_once('Mail/mime.php'); $message = new Mail_mime(); $message->setTXTBody($_POST[message]); if (count($_POST[emailFile]) > 0) { foreach ($_POST[emailFile] as $key => $filename) { $filepath = "/home/mds07/console/admin/media/listings/" . $_POST[list_ID] . "/"; ////////////////////You will need to change the above line if the location of the PHP program ever moves//////////////////////////// $fileatt = $filepath . $filename; $message->addAttachment($fileatt); echo 'Attached File: '.$filename."\n"; } } $body = $message->get(); $extraheaders = array("From" => $from, "Subject" => $_POST[subject]); $headers = $message->headers($extraheaders); $mail = Mail::factory("mail"); if (count($_POST[emailEnq]) > 0) { foreach ($_POST[emailEnq] as $key => $recipient) { $mail->send($recipient, $headers, $body); echo 'Sent mail to: '.$recipient."\n"; } }

1 个答案:

答案 0 :(得分:1)

如果没有使用Pear :: Mail_Mime,我会打赌你的内存耗尽,因为你在每次循环迭代中都会创建一个全新的Mail_Mime()对象,而它们似乎在所有循环中都是相同的。

尽可能少地创建,将其从最外层的foreach中取出。

$mail相同。您可以重复使用相同的$mail对象并将其提供给新的标题和正文。

要确定使用内存的位置,请使用memory_get_usage()包围可疑行并记录其输出以查看增加。