PHP & Pear :: Исчерпание почтовой памяти - PullRequest
0 голосов
/ 04 октября 2010

Решение ниже

Привет, ребята. Я пытался по-разному подойти к этому, но все еще сталкивался с той же ошибкой. У меня есть форма, где вы можете выбрать адреса электронной почты некоторых пользователей и 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);
 }
}

РЕШЕНИЕ
Следующий код работает с гораздо лучшим использованием памяти: <pre> $from = "it@example.com";</p> <p>echo 'From: '.$from."\n"; echo 'Subject: '.$_POST[subject]."\n"; echo 'Text: '.$_POST[message]."\n";</p> <p>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 Ответ

1 голос
/ 04 октября 2010

Не используя Pear :: Mail_Mime, держу пари, что вам не хватает памяти, потому что вы создаете новый объект Mail_Mime() на каждой итерации цикла, когда кажется, что он одинаков во всех них.

Создайте как можно меньше, извлекая его из внешнего foreach.

То же самое для $mail. Возможно, вы сможете повторно использовать тот же объект $mail и передать ему новые заголовки и тело.

Чтобы убедиться, что ваша память используется, окружите подозрительные строки memory_get_usage() и зарегистрируйте его вывод, чтобы увидеть увеличение.

...