2009-08-06 7 views
0

Ich habe eine Liste von etwa 5.000 bis 10.000 E-Mail-Adressen (individuelle Benutzer) von Menschen auf der ganzen Welt, jeweils mit ihrem Benutzernamen und Sprachcodes zugeordnet. Ich habe auch eine einzelne Nachricht in die verschiedenen Sprachen der Benutzer übersetzt, die ich per E-Mail senden möchte. Jetzt möchte ich eine einfache Nur-Text-E-Mail an jede Adresse senden, wobei der tatsächliche Text der E-Mail basierend auf der Benutzersprache variiert und mit dem Benutzernamen der Person, die ich per E-Mail versende, personalisiert ist.Personalisierte Bulk-E-Mail programmgesteuert ohne Zeitüberschreitung

Aufgrund der personalisierten Anforderung und der Tatsache, dass sie nur einmal per E-Mail gesendet werden (pro Jahr oder zwei mit einer überlappenden, aber andere Benutzerliste), ist formelle Mailingliste wahrscheinlich (& vorzugsweise). Der Bulk-E-Mail-Dienst von Drittanbietern ist ebenfalls verfügbar.

Ignorieren Programmierzeit, was ist der am wenigsten manuell zeitaufwendige Weg, dies in (vorzugsweise) PHP zu tun? (Ich schreibe das Skript, aber nicht unbedingt die Person, die "den Knopf drückt", um es zu senden.) Das ideale Ergebnis ist, dass die Person nur einen einzigen Befehl eingeben muss, um das Skript auszuführen (die E-Mail wird bereitgestellt) Liste) und alle E-Mails werden ohne weitere Benutzereingriffe gesendet. Dies bedeutet, dass ich Dinge wie das Einrichten von Cron-Jobs vermeiden möchte, um das Skript wiederholt auszuführen, bis die E-Mail-Liste erschöpft ist.

Als dies vor einem Jahr gemacht wurde, schrieb ich ein PHP-Skript, das einfach die E-Mail-Liste Zeile für Zeile einliest, den Benutzernamen, die E-Mail-Adresse und den Sprachcode verarbeitet und daraus den gewünschten E-Mail-Text erstellt zu PHPMailer einzeln senden. Das Problem, das ich hatte, war das Timing des Skripts und ich wusste nicht, wo es hinging, so dass ich die E-Mail-Liste an der richtigen Stelle schneiden kann, um neu zu beginnen. Ich beendete die manuelle Aufteilung der 1 E-Mail-Liste in mehrere Unterlisten, die kurz genug war, so dass das Skript keine Zeitüberschreitung hatte. Wie vermeide ich entweder das Zeitlimit zu vermeiden oder zu verfolgen, wo das Skript E-Mail-Adresse ist, so dass es manuell neu gestartet werden kann und keine Person E-Mails mehr als einmal gesendet wird?

Welche weiteren Punkte sind zu berücksichtigen, z. B. die Vermeidung von Blacklisting usw.?

Antwort

2

Sie müssen über die Funktion set_time_limit und vielleicht ini_set ('memory_limit', xxMB ') für den Speicher lesen;

Sie können ein PHP-CLI-Skript aus Ihrem Webprozess ausführen, welches dann (pcntl_fork) den Elternknoten beendet (der Eltern-CLI-Prozess wird beendet). Der Webserver-Thread, der das Skript ausführt, kann dann mit anderem Code fortfahren oder beenden.

Jetzt kann der CLI-Child-Prozess (A) verzweigen (und zum Elternteil werden) und ein Kind (B) überwachen, das die E-Mails versendet. Wenn das Kind B stirbt, kann sich der nun übergeordnete A-Prozess erneut verzweigen und das neue Kind setzt dort fort, wo der vorherige abgebrochen wurde.

Sie müssen verfolgen, an wen Sie E-Mail an eine Datei/db/shared Memory oder über gepaarten Sockets (socket_create_pair) mit dem übergeordneten Prozess gesendet haben.

Ich hoffe, Sie bekommen die Idee.

1

PHP ist nicht das richtige Werkzeug für den Job hier - Sie wollen etwas, das unabhängig von einem Webserver (obwohl potenziell von ihm ausgelöst) ausgeführt wird, oder Sie werden sicherlich in Timeouts kommen.

Zum Beispiel könnten Sie PHP system() heraus zu einem anderen Skript (Perl? Python?), Die Job-Informationen aus einer Datenbank liest dann Gabeln in den Hintergrund, um seine Arbeit zu tun.

+0

PHP ist für diesen Job genauso geeignet wie Python und Perl. Der große Engpass wird der Mailserver/Netzwerk uDatenrate sein. – OIS

1

Sie sagten, keine Cron-Skripte - haben Sie keinen Zugriff auf Cron auf Ihrem Server? Oder möchten Sie den Cron-Job nicht jedes Mal manuell einrichten, wenn ein Mail-Job gesendet werden muss?

Sie möchten vielleicht http://pear.php.net/package/Mail_Queue betrachten - es ist etwas, das ich vor kurzem verwendet habe. Sie können veranlassen, dass Ihr benutzerdefiniertes Skript alle E-Mails gleichzeitig in der E-Mail-Warteschlange ablegt. Dies ist viel schneller als das Senden der E-Mails im laufenden Betrieb, da Sie sich nicht mit der Kommunikation zwischen Servern, sondern nur mit Ihrer Datenbank beschäftigen müssen.

Dann haben Sie ein Cron-Skript, das alle paar Minuten den Mail_Queue :: sendMailsInQueue-Befehl mit einer Begrenzung der Anzahl der E-Mails sendet, die es per Cron-Aufruf sendet. Sie müssen sich nicht mit dem Cron-Skript herumschlagen, wenn das Ihr Anliegen ist - wenn die Warteschlange leer ist, wird sie einfach beendet. Ihre E-Mail-Adresse wird dann in einem angemessenen Tempo pro Anruf aus dem Server übertragen. Dies verhindert Zeitüberschreitungen aufgrund der Beschränkung von E-Mails pro Cron-Aufruf. Es wird auch helfen, Ärger mit anderen Mail-Servern zu vermeiden, die nicht glücklich sein könnten, plötzlich von vielen E-Mails von Ihnen auf einmal gehämmert zu werden.

+0

Aus Datenschutzgründen habe ich keinen Zugriff auf die eigentliche E-Mail-Liste. In diesem Jahr wird höchstwahrscheinlich jemand anderes das Skript ausführen. Ich möchte eine Lösung, die so wenig wie möglich von ihnen erfordert, damit so wenig wie möglich schiefgehen kann. – KTC