PHP & Pear::Mail Memory Exhaustion
Solution below
Hi guys. I've been trying different ways to approach this but still hitting the same error. I have a form where you can select some users email addresses and some pdf file and it will开发者_如何学Python send to them. Problem is that PHP will throw an error because the script is using massive amounts of memory (over 90 meg). I have tried using mail() and now trying PEAR:Mail_Mime Is there another way I can do this?
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);
}
}
SOLUTION
The following code is working with much better memory usage:
$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";
}
}
Without having used Pear::Mail_Mime I'd bet you run out of memory because you create a brand new Mail_Mime()
object on every loop iteration, when it seems like it's the same in all of them.
Create as few as possible, taking it out of the outermost foreach.
Same for $mail
. You can probably re-use the same $mail
object and feed it new headers and body.
To make sure where your memory is used, surround the suspect lines with memory_get_usage()
and log its output to see the increase.
精彩评论