Massenmail per php

Hey Leute,

ich bin grade etwas am grübeln…
Und zwar geht es um das versenden eines Newsletters…

Es ist ja so, dass man sich bei vielen grösseren Seiten zu Newslettern anmelden kann… Manchmal steht dann auch im Newsletter, an wieviele mailadressen dieser geschickt wurde/wird…

Nun stelle ich mir für meinen Eigenbedarf die Frage wie das funktioniert…
Zum einen darf ja nicht jeder Empfänger sichtbar sein… Also als BCC senden? Ne, so machen die grossen das zumindest nicht - da steht lediglich meine Adresse im To-Feld… Wie aber funktioniert das?
Wird da wirklich jede email einzeln verschickt? Wenn ja - wie wird geregelt, dass die mails auch ankommen und dass das Script nicht aufgrund einer maximum execution time irgendwann abbricht…?

Wie also soll man da ran gehen, wenn man einen eigenen Newsletterdienst einrichten will, bei dem nur der jeweilige Empfänger im To: steht…?

Zusatzfrage: Wenn mein Provider eine maximum execution time von 90 sec. hat, wieviele mailadressen kann ich dann maximal anschreiben, bevor das Script austimed?

vielen Dank
Munich

Hallo MunichFreak,

wie folgt kannst du an jeden angemeldeten User einen Newsletter versenden:

**// Text ohne Anrede in $text (z.B. durch Formulareingabe) speichern
// darf auch HTML enthalten, genauso wie später die Anrede

$text=„Blablabla …“

// Header konfigurieren (Beispiel)
$header=„From: Ich \n“;
$header.=„Reply-To: \n“;
$header.=„MIME-Version: 1.0\n“;
$header.=„Content-Type: text/html\n“;
$header.=„X-Mailer: PHP/“.phpversion();

// MySQL-Abfrage nach Email-Adressen + Namen in Tebelle newsletter
$a = „SELECT * FROM newsletter“;
$b = mysql_query($a);
$c = mysql_num_rows($b);

// Schleife, die an jede gefundene Adresse eine Mail sendet
while ($daten = mysql_fetch_array($b))
{
//Namen in Anrede setzen
$anrede=„Hallo $daten[name],/n“;
//Nachricht zusammensetzen ($c = Anzahl der Adressen)
$nachricht="$anrede $text /n/nDieser Newsletter wurde an $c User versendet.";
//Namen in Betreff setzen
$betreff=„DeineFirma - Newsletter für $daten[name]“;
//Mail senden
mail($daten[email],$betreff,$nachricht,$header);
}**

So ist gewährleistet, dass z.B. der Betreff stets dieselbe Form hat. In jeder Mail steht genau ein User (to) im Header. Du hast individualisierte Betreffe und Anreden. Du brauchst lediglich den Mailtext z.B. in ein Formular einzugeben und loszusenden. Du kannst natürlich auch mit HTML den Mailinhalt vorher weiter ausschmücken, was aber, wie du sicher weißt, aus gutem Grund häufig kritisiert wird. Wieviele Mails der Server in 90s senden kann, ist mir leider nicht bekannt. Schlimmstenfalls kannst du die MySQL-Email-Abfrage wiederum in kleinere Pakete unterteilen und diese dann in Ruhe nacheinander abarbeiten, bis alle Adressen durch sind. So kannst du in jedem Fall einem Timeout entkommen. Dies wäre allerdings erheblich aufwändiger von der Programmierung. Ich glaube jedoch, dass es auch ohne diesen Aufwand geht.

Gruß
Habe Durchfall

das beantwortet zwar die Frage nicht
aber trotzdem vielen Dank für Deine Mühen…

Wie der Mailversand funktioniert weiss ich aber im grossen und ganzen - nur eben nicht, wie ich es angehen sollte, wenn ich sehr sehr viele empfänger habe :wink:

Der Gedanke, den ich dabei habe ist per cronjob und Datenbank die mails zu versenden und zu markieren, welche schon verschickt wurden… aber vllt gibts ja noch nen Trick dabei, den ich noch nicht kenne

Hallo MunichFreak,

ich meine, dass du mit den Email-Adressen umgehen kannst wie man es oft mit anderen großen Datensätzen macht: Du rufst die Email-Adressen z.B. 100- oder 200-stückweise ab (die von mir erwähnten „Pakete“, die Größe kannst du ja noch entsprechend anpassen) und lässt das PHP-Script deinen Newsletter an diese 100 oder 200 Adressen den Newsletter versenden. Dann lässt du ein Javascript automatisch nach einer kurzen Warteschlaufe den Text inklusive des Indexes der Datenbankabfrage - z.B. mittels Hidden-Formularfeldern, in welche du den Text und den Abfrageindex speicherst - an dieselbe PHP-Datei senden (eine Fallunterscheidung muss natürlich programmiert werden, aber das dürfte kein Problem darstellen), die dann die nächsten 100 oder 200 Datensätze abruft und diese Mails versendet etc. etc. Der Zyklus läuft dann so lange, bis alle Datensätze durch sind, wodurch der Vorgang dann abgebrochen werden kann. Es wird bei entsprechender Stückzahl und Pausenzeit keiner der Zyklen die Timeout-Grenze erreichen. Du brauchst den Text nur einmal einzutippen und das Ding lediglich in Ruhe durchlaufen zu lassen. Das Ganze kann natürlich eine Weile dauern, wenn du z.B. an mehrere tausend Empfänger sendest. Dafür ist das Timeout-Problem aus dem Weg, weil du ständig zwischen serverseitiger und clientseitiger Verarbeitung mit kurzer Pause hin und her schaltest. Das ist meine spontane Idee als Alternative zum Chronjob. Ich hoffe, diesmal deine Frage besser getroffen zu haben.

Gruß
Habe Durchfall