PHPMailer: memory size exhausted

TomHege

Grünschnabel
Hallo Zusammen,

ich benutze zum Versenden des Newsletters die PHP-Klasse PHPMailer. Beim Versenden von E-Mails mit Anhang ist folgende Fehlermeldung aufgetreten:
Fatal error: Allowed memory size of 41943040 bytes exhausted (tried to allocate 17000988 bytes) in /phpmailer/class.phpmailer.php on line 918

In diesem Fall wurden der E-Mail zehn Dateien mit jeweils 2 MB Größe angehangen, was eigentlich bei einer "Allowed memory size" von 40 MB keinen Fehler verursachen dürfte. Außerdem wundert mich, dass das Script nach eigenen Angaben nur 16 MB reservieren wollte, also auch weit weniger als 40 MB.

Die PHP-Datei ist folgendermaßen aufgebaut:
PHP:
foreach(unserialize($row_newsletter['Anhang']) as $wert)
		$mail->AddAttachment($wert['pfad'], $wert['name']);

// Auslesen der Empfängerdaten

while($row_abonnenten = mysql_fetch_assoc($result_abonnenten)) {

		// Weitere Angaben machen und E-Mail versenden

		$mail->ClearAllRecipients();
}

An irgendeiner Stelle scheint der zu viel Speicherplatz zu benötigen, aber die finde ich leider nicht. Der Fehler tritt übrigens auch auf, wenn man den Newsletter nur an eine Person verschickt.

Vielen Dank für Eure Antworten!
 
Hi,

schickt der PHPMailer die E-Mails in einer "while"-Schleife nach einander ab? Oder nimmt er die Adressen in den Header auf und verteilt sie so?


Was steht denn genau in der Zeile 918 ?
 
Der PHPMailer schickt die E-Mails nacheinander ab. Die Dateien werden allerdings nur einmal der Mail angehängt (s. foreach-Schleife im PHP-Code).

In Zeile 918 steht:
PHP:
$result .= $this->AttachAll();
 
Die Funktionsbeschreibung lautet: Attaches all fs, string, and binary attachments to the message.

Das Problem wird sein, dass diese Funktion für jede Mail aufgerufen wird und das dann immer wieder neu in den Speicher schreibt.
Ich brauche also eine PHP-Funktion, die den Speicher leert.
 
Genau das wird es sein. Schreibst dir einfach ne Methode die nach jedem verschicken der Mail die Speicher leert. Oder du lässt alle Empfänger in den mail() Header schreiben und machst du eine Verteilung. Allerdings sieht dann ein Empfänger auch alle anderen E-Mail Empfänger. Ob das so schön ist weiss ich nicht.
 
Da müsstet Ihr mir weiterhelfen. Ich weiß leider nicht, wie man den Speicher mit PHP leeren kann.

Das blöde an PHPMailer ist wohl, dass er dieselben Dateien während eines einzigen Mailversandes öfters in den Speicher schreibt. Wobei natürlich sowieso niemals 40 MB per E-Mail verschickt werden. Trotzdem brauche ich jetzt eine Methode, die nach jedem Mailversand den Speicher leert.

Dankeschön!
 
Zurück