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
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.
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.
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
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.
Es gibt eine geprüfte Lösung für die: PEAR Mail_Queue
funktioniert gut für mich.
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!
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 –
Ich habe versucht, und festgestellt, dass sendmail beginnt lange Pausen geben - siehe http://serverfault.com/questions/551649/sendmail-slow-to-accept-emails – Rich
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. –