Viele personalisierte Newsletter (mehr als 1500) gleichzeitig versenden

dwex

Erfahrenes Mitglied
Hallo Leute,

ich muss für einen Kunden ein Newslettersystem schreiben und bin mir noch nicht so ganz sicher wie ich die Geschichte mit dem Time-Out bei langen Scriptlaufzeiten lösen soll.

Wenn ich mit der mail()-Funktion und einer Schleife personalisierte Newsletter aus einer MySQL-DB versende dann komme ich irgenwann (ziemlich schnell) an die Grenzen der Serverlaufzeit.

Wie würdet Ihre das machen oder seht Ihr da im Vorfeld kein Problem (so wie ich)?
 
Dürfen die Empfänger untereinander etwas von sich wissen? Sonst wäre auch das gleichzeitige Senden an alle oder zumindest an einen Teil aller Empfänger möglich. Das würde je nach Methode die Zeit sicherlich verringern.
 
Hallo Knuffel,

werde ich mir mal ansehen - denke aber, dass ich auf fertige Scripte nicht zurückgreifen kann/darf. da dieses in ein bestehendes System (nahtlos) im eigenen look&feel eingebunden werden muss.

Hallo Gumbo (alter Mitstreiter),
die Mails sollen personalisiert werden - ein BCC scheidet demnach aus.

Wer hat noch Vorschläge?
 
Hallo Ceppi,

geht leider auch nicht, da set_time_limit() nur ohne aktiviertem safe_mode läuft.
 
Die beste Lösung hierbei ist ein Cronjob.
Du trägst dann beim "versenden" alle zu sendenden Emails in die DB ein.
newsletter_to_send(id, newsletter_id, email_id)
newsletter(id, titel, text,..)
newsletter_emails(id, email, name, ...)

Der Cronjob liest dann immer n weitere zu sendende emails aus der newsletter_to_send tabelle verschickt die und löscht den eintrag.

Den würde ich dann pro Minute einmal aufrufen und so 100-200 verschicken.
Das dürfte hinkommen.
 
Wenn man einen Cronjob verwendet, würde ich allerdings Perl oder C/C++ anregen, das sollte um den Faktor n schneller sein als PHP...
 
Ein Cron-Job wäre dazu gar nicht notwendig, denn ich denke, dass die E-Mail-Nachricht vorher auch manuell geschrieben wird. Es wäre nur notwendig, dass das Skript sich nach Versand wieder selbst aufruft.
 
Hallo,

hab' in dem Zusammenhang folgendes ausprobiert:
PHP:
$offset = $_GET['offset']; /* beim ersten aufruf des scriptes muss '1' mit übergeben werden
EDIT: beim ersten aufruf muss '0' übergeben werden, nicht '1' */

$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/plain; charset=iso-8859-1\r\n";
$headers .= "From: test-versand <test@stuvwxyz.de>";

	// abfrage für die gesamtzahl der empfänger
	$sql_adr_anz = "SELECT * FROM `adressen`";
	$res_adr_anz = mysql_query($sql_adr_anz) OR exit(mysql_error());

if($offset < mysql_num_rows($res_adr_anz)) { // wenn offset kleiner als gesamtzahl

	$sql_adr = "SELECT * FROM `adressen` ORDER BY `id` ASC LIMIT 10 OFFSET ".$offset."";
	$res_adr = mysql_query($sql_adr) OR exit(mysql_error());

	if(mysql_num_rows($res_adr)) {
		while($zeile_adr = mysql_fetch_array($res_adr)) { // Schleife für 10 Empfänger ab OFFSET
			mail($zeile_adr['epost'], $offset, $offset, $headers);
		}
		$offset += 10;
	}
	header ("Location: dieses_script.php?offset=".$offset."");
}
/* AUSGABE */
Die Funktion verschickt pro Durchlauf 10 Emails, erhöht dann den OFFSET-Wert um 10 und lädt dann das selbe Script neu mit dem neuen OFFSET.

Das funktioniert soweit, hab' auch mal eine andere Funktion in der Schleife probiert, die ich 1.000.000x ausführen lassen konnte (bei Emails an mich selbst wollte ich das vermeiden ;) ), was insgesamt fast drei Minuten gedauert hat, ohne dass der Server die Verbindung vorzeitig abgebrochen hat.

Schöne Grüße:
27apricot

EDIT: Achso, nur zur Erklärung: die Verwendung des aktuellen OFFSET-Wertes in der mail()-Funktion als Betreff und Inhalt ist dafür da, um nachvollziehen zu können, was das Script macht, da ich 30x den selben Empfänger in der DB habe.
 
Zuletzt bearbeitet:
Zurück