2008-08-20 9 views
5

Was ist der beste Weg zum Senden von E-Mails von mindestens 1000 oder mehr in PHP? Jede zuverlässige E-Mail-Warteschlangen-Technik, die damit umgehen kann? E-Mail-Warteschlange in PHP

Antwort

5

Sie können einfach Ihre E-Mails in eine Mail-Queue-Datenbanktabelle einfügen und einen separaten Prozess überprüfen, ob die Warteschlange und der Stapel eine bestimmte Nummer gleichzeitig senden.

0

Ich habe im Allgemeinen auf einen Hack verlassen. Ich habe eine Datenbankliste von E-Mail-Adressen und dann eine Meta-Redirect zu self mit einem steigenden Offset-Parameter, der angibt, welche Zeile in der Datenbank ich bin. Serverumleitungen verursachen Probleme, da Browser davon ausgehen, dass die benötigte Zeit eine Endlosschleife angibt.

1

wie Mercutio vorgeschlagen, würde ich einen neuen Datensatz in eine E-Mail-Queue-Tabelle für jede E-Mail senden senden und dann einen separaten Prozess (wie ein CRON) verwenden, um die Tabelle regelmäßig für alle in der Warteschlange befindlichen Elemente zu überprüfen.

Wenn E-Mails in die Warteschlange gestellt werden (und die E-Mail nicht für jeden Empfänger angepasst wird), würde ich die E-Mails nach Domäne gruppieren und Blöcke zusammen senden, um die Gesamtzahl der zu versendenden E-Mails zu reduzieren, dh wenn Sie 1000 haben E-Mails in der Warteschlange und 250 sind Gmail-Konten, die ich die 250 in 25 Blöcken von 10 senden würde (erinnere dich an Bcc-Empfänger, damit sie sich nicht sehen).

, um tatsächlich die E-Mail senden i PEAR mail über die PHP-Funktion mail()

nach der E-Mail zu senden entweder löschen Datensatz (n) aus der Warteschlange oder ändern, um einen Status-Flag ihm benutzen würde gesendet und Schleife zu zeigen, wurde - i würde auch einen Zähler hinzufügen, um die E-Mails zu verfolgen, die nach x fehlgeschlagenen Versuchen nicht gesendet und entfernt wurden

um Timeout-Probleme zu überwinden, würde ich entweder (je nach Situation) - setzen Sie die set_time_limit() auf x Sekunden und Verfolgen Sie die Ausführungszeit des Skripts (das Skript wird nach (x-1) Sekunden beendet) - rufen Sie das Skript über die Befehlszeile auf, um Tim zu vermeiden euts - Setzen Sie ein Limit für die Anzahl der E-Mails, die das Skript in einer Ausführung senden könnte

1

Sicher, die Datenbanktabelle könnte eine Idee sein. Aber was ist mit dem Senden von 1000 E-Mails mit einem 2-MB-Anhang? Das müßtest du auch berücksichtigen. Ich hatte das Problem selbst, und schließlich habe ich die E-Mail in die Datenbank und die Dateien in das Dateisystem geschrieben. Das E-Mail-Skript, das ich verwendet habe, hat dann die Datenbankeinträge gelesen und versucht, die zu sendenden Anhänge abzurufen.

2

Es gibt eine geprüfte Lösung für die: PEAR Mail_Queue

funktioniert gut für mich.

+1

Ich habe dies verwendet, um mehr als 30.000 Mails gleichzeitig anstehen. Ein relativ einfaches Skript sendet etwa 250 Mal - wenn der Lastdurchschnitt nicht zu hoch ist. Sie werden sie nicht schneller senden, aber es wird es ohne Probleme tun. –

1

Sind Sie sicher, dass Sie diese Mail in die Warteschlange stellen müssen?

Liefern Sie einfach alle E-Mails an den Mail-Transfer-Agent des lokalen Rechners (sendmail ...), und kümmern Sie sich um das Einreihen und Senden. Für was ist das eigentlich gedacht?

Mit anderen Worten: Mach dir keine Sorgen!

+1

Wenn Sie ein paar Dutzend liefern, ist das kein Problem. Sendign Tausende von E-Mails werden einen neuen sendmail-Prozess für alle aufkommen lassen - und dann enden Sie mit großen Lastdurchschnittswerten, die den Server in die Knie zwingen.Ich habe Pear_Mail_Queue 50.000+ ohne Problem –

+0

Ich habe versucht, und festgestellt, dass sendmail beginnt lange Pausen geben - siehe http://serverfault.com/questions/551649/sendmail-slow-to-accept-emails – Rich