Es gibt keinen Grund, warum Sie es nicht in PHP schreiben könnten, obwohl ich es nicht tun würde Machen Sie es zu einem Teil eines Webrequest / HTTP-Prozesses. Ich habe erfolgreich 500.000 Abonnenten pro Mailing implementiert (abhängig von den verfügbaren lokalen Daten, da dies ein standortspezifisches Projekt war). Es war ein Inhouse-Projekt, also leider kein Code/Paket für Sie, aber einige Hinweise, auf die ich gestoßen bin:
Lieferung einrichten
- Begonnen mit phpmailer selbst, um sich um die Formatierung, Codierung von Inhalten und Kopfzeilen, das Hinzufügen von Anhängen usw. zu kümmern. Dieser Teil davon funktioniert gut, und ich würde das nicht von Grund auf neu schreiben wollen.
- Das 'Versenden' einer E-Mail selbst ist nur das Setzen eines Flags in einer Datenbank, ob / wie / was an (einen Teil der) Abonnenten gesendet werden soll.
- Nachdem dieses Flag gesetzt wurde, wird es automatisch von einem Cronjob abgeholt, kein weiterer Webserver ist beteiligt.
- Ich begann mit einer stark verschmutzten Datenbank mit Millionen von E-Mail-Adressen, von denen viele waren offensichtlich nicht gültig, also mussten zuerst alle E-Mail-Adressen auf format validiert werden, dann auf host:
filter_var($email, FILTER_VALIDATE_EMAIL);
über die Abonnenten (und das Speichern des Ergebnisses natürlich) wurden die ersten paar hunderttausend ungültigen E-Mails los.- Aufteilen des Hosts (und Speichern den Hostnamen) aus den E-Mails, und validieren Sie dies (hat es einen MX- oder zumindest einen A-Eintrag im DNS, aber denken Sie daran:Sie können E-Mails an eine IP-Adresse senden
[email protected][255.255.255.255]
, also halten Sie diese gültig)) eine gute Portion mehr losgeworden. Die E-Mail-Adressen hier sind nicht dauerhaft deaktiviert, aber mit einem Status-Flag, das anzeigt, dass sie aufgrund des Domainnamens / der IP-Adresse deaktiviert sind. - Skripte wurden in erfordern geändert gültige E-Mail-Adressen beim Abonnement / vor dem Einfügen, dieser Unsinn von 'Sie werden kein Beispiel@ sqldat.com ' Abonnement-Verschmutzung in der Datenbank war einfach nur lächerlich.
- Jetzt hatte ich eine Liste mit E-Mail-Adressen, die das Potenzial hatten, gültig zu sein. Es gibt im Wesentlichen drei Möglichkeiten, ungültige Adressen zu erkennen (denken Sie daran, dass die alle kann temporär sein):
- Sie werden sofort vom Server abgelehnt.
- Der zuvor festgelegte Server hört einfach nicht auf den Datenverkehr.
- Sie werden zurückgesendet, lange nachdem Sie dachten, Sie hätten sie zugestellt.
- Seltsame Sache, die Bounces, für die jeder E-Mail-Server ein anderes Format zu haben scheint und die anfangs höllisch zu analysieren waren, waren am Ende eigentlich ziemlich einfach mit VERP
. Anstatt ganze E-Mails zu parsen, eine dedizierte E-Mail-Adresse (nennen wir es [email protected] ) wurde so konfiguriert, dass sie statt an das Postfach zugestellt, über einen Befehl weitergeleitet und eine E-Mail an [email protected]
, der
Return-Path
wurde für[email protected]
. Einfach beim Empfang geparst, und nach wie vielen Bounces (Postfach konnte nicht existieren, Postfach kann voll sein (ja, immer noch!), etc.) Sie eine E-Mail-Adresse für unbrauchbar erklären, liegt bei Ihnen. - Jetzt die direkte Ablehnung durch den Server. Wahrscheinlich hätten wir einige MTAs richtig konfigurieren und/oder Plugins dafür schreiben können, aber da die E-Mails zeitkritisch waren und wir eine absolute konfigurierbare Kontrolle pro Mailing über die letzte nutzbare Zustellzeit haben mussten (danach war die E-Mail nicht länger von Interesse für den Benutzer), Drosselung pro Empfangsserver und im Allgemeinen alles, würde es ungefähr die gleiche Zeit dauern, einen Mailer in PHP zu schreiben, den wir besser kannten, der das SMTP-Protokoll direkt an Socket 25 auf Empfangsservern verwendet. Mit minimalem Aufwand wurde die Möglichkeit eines anderen Transports als die Standardoptionen in PHPMailer eingebaut. Das SMTP-Protokoll ist eigentlich recht einfach, aber es gibt einige Vorbehalte:
- Viele empfangende Server wenden die graue Liste an:Die meisten Spambots kümmern sich nicht wirklich darum, ob eine bestimmte E-Mail ankommt, sie geben sie einfach aus. Wenn also ein unbekannter/noch nicht vertrauenswürdiger Absender eine E-Mail sendet, wird diese vorübergehend abgelehnt. Fangen Sie das ab (normalerweise Code 451) und platzieren Sie die E-Mail in der Warteschlange, um es später erneut zu versuchen.
- Ein Mailserver, insbesondere von größeren ISPs und kostenlosen Diensten (gmail, hotmail/msn/live, etc.) wird eine Mail-Flut nicht hinnehmen, ohne sich zu wehren:nach den ersten paar hundert / tausend fangen sie an abzulehnen Sie. Dazu später mehr.
Beschleunigung
- Jetzt hatten wir ein Liefersystem, das funktionierte, aber es musste schnell sein . Das Versenden von 10.000 E-Mails in einer Stunde ist in Ordnung, wenn Sie nur 10.000 Adressen zum Senden haben, aber das von uns benötigte Minimum waren etwa 200.000 pro Stunde. Der Anfang war ein dedizierter Server (der tatsächlich ziemlich wenig Leistung haben kann, egal was Sie tun, die meiste Zeit für die Zustellung von E-Mails ist im Netzwerk, nicht auf Ihrem Server).
- Caching von IPs:Erinnern Sie sich an all diese IPs, die wir von Hostnamen in E-Mail-Adressen angefordert haben? Wir haben diese offensichtlich gespeichert, und das wiederholte Nachschlagen ihrer IPs verursacht erhebliche Verzögerungen. IPs können sich jedoch ändern:ein DNS-Eintrag dort, ein anderer MX an einem anderen Ort ... die Daten werden schnell veraltet. Meistens sendet der Server eigentlich gar nichts (Abonnement-Newsletter kommen offensichtlich in Schüben), ein Cronjob mit niedriger Priorität läuft und überprüft alle Hostnamen mit einer veralteten IP (wir haben älter als 1 Tag als veraltet ausgewählt) auf eine IP-Adresse , einschließlich derjenigen, die zuvor keine hatten (Es werden ständig neue Domains registriert, also warum sollte eine Domain nicht am Tag verfügbar werden, nachdem sich jemand bereits begeistert mit seiner brandneuen E-Mail-Adresse angemeldet hat? Oder Serverprobleme mit einer Domain gelöst sind usw.). Das eigentliche Versenden der E-Mails erforderte jetzt keine Domänensuche mehr.
- Wiederverwendung der SMTP-Verbindung:Das Einrichten einer Verbindung zu einem Server nimmt relativ viel Zeit in Anspruch, um eine E-Mail zuzustellen, wenn Sie direkt mit Port 25 sprechen. Sie müssen nicht für jede Verbindung eine neue Verbindung einrichten E-Mail, Sie können die nächste einfach über dieselbe Verbindung senden. Ein bisschen Trail-and-Error hat dazu geführt, dass der Standard hier auf etwa 50 E-Mails pro Verbindung gesetzt wurde (vorausgesetzt, Sie haben so viele oder mehr für die Domain). Bei Ausfall einer E-Mail-Adresse half jedoch manchmal das Schließen und erneute Öffnen der Verbindung für einen erneuten Versuch. Alles in allem ist das wirklich geholfen, die Dinge zu beschleunigen.
- Eine offensichtliche Sache, so offensichtlich, dass ich fast vergessen hätte, sie zu erwähnen:Es wäre eine Verschwendung, den Text der E-Mail an Ort und Stelle erstellen zu müssen:Wenn es sich um eine allgemeine E-Mail handelt, halten Sie den Text bereit (ich habe PHPMailer etwas geändert, um in der Lage sein, eine zwischengespeicherte E-Mail zu verwenden), möglicherweise Tage zuvor (wenn Sie wissen Sie werden am Freitag eine E-Mail versenden und Ihr Server ist im Leerlauf, warum bereiten Sie sie nicht bereits am Mittwoch vor? Wenn es personalisiert ist, könntest du es immer noch vorher zubereiten, wenn du genug Zeit hast, wenn nicht, lass zumindest die nicht personalisierten Portionen warten.
- Mehrere Prozesse. Habe ich erwähnt, dass ein Großteil der Zeit, die für die Zustellung von E-Mails benötigt wird, für das Netzwerk aufgewendet wird? Ein Mailing-Vorgang holt nicht annähernd das Maximum aus Ihrem Mailserver heraus, kaum merkliche Last und die Mails rieseln heraus. Spielen Sie mit einer Reihe von Prozessen herum, die verschiedene Teile der Warteschlange mailen, um zu sehen, was für Ihren Server/Ihre Verbindung richtig ist, aber denken Sie an zwei sehr wichtige Dinge:
- Verschiedene Prozesse machen Sie sehr anfällig für Rennbedingungen:Seien Sie absolut sicher Sie haben ein Fullproof-System, das niemals wird Versenden Sie dieselbe E-Mail zweimal (dreimal oder sogar öfter). Es nervt nicht nur die Benutzer ernsthaft, Ihr Spam-Verhalten steigt noch weiter an.
- Halten Sie Domänen nach Möglichkeit zusammen:Wenn Sie zufällig aus der Warteschlange auswählen, verlieren Sie den Vorteil, eine offene Verbindung zu dem Server aufrechtzuerhalten, der E-Mails für die Domäne empfängt.
Ausschuss vermeiden
- Sie werden eine Menge Post versenden. Das ist genau das, was Spammer tun. Sie wollen aber nicht als Spammer wahrgenommen werden (sind Sie doch nicht, oder)? Es gibt eine Reihe von Mechanismen, die Ihre Vertrauenswürdigkeit gegenüber empfangenden Servern deutlich erhöhen:
- Verwenden Sie ein korrektes Reverse-DNS:Prozesse, die das DNS überprüfen, das zu der IP gehört, die die E-Mail sendet, mögen es sehr viel, wenn die Second-Level-Domains übereinstimmen:Senden Sie E-Mails im Namen von example.com ? Stellen Sie sicher, dass das Reverse-DNS Ihres Servers etwa so lautet:somename.example.com .
- Veröffentlichen Sie SPF-Einträge für Ihre Domain:Geben Sie ausdrücklich an, dass der Computer, der zum Senden Ihrer Massen-E-Mails verwendet wird, E-Mails mit diesen From / Return-Path-Headern senden darf und soll.
- Erinnern Sie sich an Ablehnungen :Server mögen es nicht, Ihnen immer wieder zu sagen, dass es keine verschiedenen E-Mail-Adressen gibt. Entweder haben automatisierte Mechanismen oder sogar menschliche Administratoren unseren Server blockiert, während wir alle nicht validierten E-Mail-Adressen durchgearbeitet haben, die (mehr) existierten. Wir haben erst später ein Double-Opt-In verwendet, also war die Datenbank mit Tippfehlern, Leuten, die IPs und damit E-Mail-Adressen tauschen, Streich-E-Mail-Adressen und so weiter, verseucht. Achten Sie darauf, diese Invaliden zu erfassen, und melden Sie sie ab, wenn genügend oder schwerwiegende Fehler auftreten . Sie tun Ihnen nichts Gutes, sie beanspruchen Ressourcen, und wenn sie Ihre E-Mails wirklich wollen und die Mailbox später verfügbar wird, müssen sie sich einfach neu anmelden.
- DKIM ist ein weiterer Mechanismus, der Ihre Vertrauenswürdigkeit erhöhen kann, aber da wir ihn (noch) nicht implementiert haben, kann ich Ihnen nicht viel darüber sagen.
- MX-Einträge:Einige Server mögen es immer noch, wenn Ihr sendender Server auch der empfangende Server für die Domain ist. Damals hatten wir nur 1 MX, und da der Mailing-Server noch nicht so stark ausgelastet war, nannten wir ihn den Fallback-MX-Server für die Domain. Der normale MX-Server war nicht der Server, der die Abonnements sendet, da es sehr irritierend ist, vorübergehend von einem Server blockiert zu werden, an den Sie versuchen, eine wichtige E-Mail zu senden (Clients usw.), weil Sie bereits eine Menge weniger wichtiger E-Mails gesendet haben. Es hat zwar die höchste Präferenz für den Empfang von MX, aber für den Fall, dass es fehlschlagen sollte, hatten wir den netten Bonus, dass unser Abonnement-Sendeserver immer noch als Fallback für die Zustellung diente, sodass wir in einer Krise immer noch darauf zugreifen konnten, um unangenehme Bounces für Kunden zu verhindern, die es versuchten um uns zu erreichen.
- Erzähl ihnen von dir. Ernsthaft. Viele große Anbieter von kostenlosen E-Mail-Adressen wie live.com bieten Ihnen die Möglichkeit, sich auf irgendeine Weise anzumelden oder einen Ansprechpartner zu haben, an den Sie sich wenden können, um Hilfe und Unterstützung zu erhalten, wenn Ihre E-Mails abgelehnt werden. Wenn Sie einen legitimen Grund haben, so viele E-Mails zu senden, und es ist glaubhaft, dass Sie so viele Abonnenten haben, stehen die Chancen, dass sie die Anzahl der E-Mails, die Sie pro Stunde an ihren Server senden können, ernsthaft erhöhen. Aus mageren 1.000 können irgendwo Zehntausende oder sogar noch mehr werden, wenn Sie überzeugend und ehrlich genug sind. Es kann Verträge geben, Anforderungen, die Sie erfüllen müssen, und Versprechen, die Sie machen (und halten) müssen, um dies zu dürfen. ISPs sind eine Marke für sich, und jeder andere Spieler ist anders. Machen Sie sich normalerweise nicht die Mühe, sie anzurufen, da die einzigen Nummern, die Sie finden können, in 99% der Fälle nur Leute haben, die bereit sind, Probleme mit Ihrer Internetverbindung zu beheben, die sonst wenig verstehen (oder dürfen). Ein
[email protected]
E-Mail-Adresse ist ein guter Anfang, aber sehen Sie, ob Sie irgendwo eine treffendere E-Mail-Adresse finden können. Seien Sie präzise, ehrlich und vollständig:Wie viele Abonnenten von Ihnen haben ungefähr eine E-Mail-Adresse bei diesem ISP, wie oft versuchen Sie, ihnen eine E-Mail zu senden, welche Fehler oder Ablehnungen erhalten Sie, wie ist der Anmelde- und Abmeldeprozess und was ist der Service, den Sie ihren Kunden tatsächlich bieten. Seien Sie auch nett:Wie wichtig das Versenden dieser E-Mails für Ihr Unternehmen sein kann, darüber in Panik zu geraten und schreckliche Verluste geltend zu machen, betrifft sie nicht. Eine höfliche Darlegung von Fakten und Wünschen und Fragen ob sie helfen können, anstatt eine Lösung zu fordern, ist ein sehr langer Weg. - Drosselung:So sehr Sie es auch versucht haben, einige Server akzeptieren nur eine bestimmte Menge an E-Mails pro Stunde und/oder Tag von Ihnen. Lernen Sie diese Zahlen kennen (wir protokollieren sowieso Erfolge und Misserfolge), setzen Sie sie auf einen vernünftigen Standardwert für die normalen Domains, setzen Sie sie auf vereinbarte Limits für größere Spieler.
Vermeiden, als Spam markiert zu werden
- Erste Regel:Kein Spam!
- Zweite Regel:Immer! Kein 'einmaliges', kein 'sie haben kein Abonnement, aber das könnte der Deal ihres Lebens für sie sein', nicht mit den besten Absichten, Leute mussten nach Ihren E-Mails fragen.
- Richten Sie offensichtlich einen korrekten Double-Opt-in-Abonnementmechanismus ein.
- PHPMailer setzt die richtigen Header selbst,
- Richten Sie einen einfachen Abmeldemechanismus per Web ein (fügen Sie in alle einen Link dazu ein mail), ggf. auch email und Kundenservice falls vorhanden. Stellen Sie sicher, dass der Kundendienst kann Personen direkt abbestellen.
- Wie bereits gesagt:Abbestellen (übermäßige) Fehler und Bounces.
- Vermeiden Sie spammige Formulierungen wie "Angebot des Lebens".
- Verwenden Sie URLs in Ihren E-Mails sparsam.
- Vermeiden Sie das Hinzufügen von Links zu Domains, die sich Ihrer Kontrolle entziehen, es sei denn, Sie sind absolut sicher, dass Sie ihnen vertrauen können nicht zu spammen, wenn auch dann...
- Bietet dem Benutzer einen Mehrwert:Durch Benutzerinteraktion in Google/Yahoo/Live-Webmail-Clients als Spam markiert zu werden, schadet zukünftigen Erfolgen ernsthaft (eine Anmerkung zur Website:Wenn Sie sich dafür anmelden, wird Live/MSN/Hotmail alle weiterleiten E-Mail an Sie, die von Ihrer Domain gesendet wird und von Benutzern als Spam markiert wird. Lernen Sie sie zu lieben, und wie immer:Abbestellen, sie wollen Ihr Einkaufszentrum eindeutig nicht und schaden Ihrer Spam-Bewertung).
- Überwachen Sie schwarze Listen für Ihre IP. Wenn Sie auf einem davon erscheinen, heißt es tschüss, also handeln Sie sofort, indem Sie Ihren Namen und reinwaschen Ermittlung des Falls erforderlich.
Erfolgsrate messen
- Da Sie den gesamten Prozess unter Ihrer Kontrolle haben, sind Sie ziemlich sicher, dass die E-Mail irgendwo gelandet ist (obwohl es der Bitbucket des MX oder ein Spam-Ordner sein könnte), oder Sie haben einen Fehler und den Grund dafür protokolliert. Das kümmert sich um die 'tatsächlich gelieferten' Zahlen.
- Einige Leute werden versuchen, Sie davon zu überzeugen, Ihren E-Mails Links zu Online-Bildern hinzuzufügen (entweder echte oder das berühmte transparente 1x1-GIF), um zu messen, wie viele Personen Ihre E-Mail tatsächlich lesen. Da ein hoher Prozentsatz diese Bilder blockiert, sind diese Zahlen bestenfalls wackelig, und wir glauben, dass wir uns einfach nicht um sie kümmern sollten, ihre Zahlen sind absolut unzuverlässig.
- Am besten lässt sich die tatsächliche Erfolgsquote messen, wenn Sie möchten, dass die Benutzer etwas tun. Fügen Sie den Links in der E-Mail Parameter hinzu, damit Sie messen können, wie viele Benutzer auf die von Ihnen verlinkte Seite gelangen und ob sie die gewünschten Aktionen ausgeführt haben (ein Video angesehen, einen Kommentar hinterlassen, Waren gekauft haben).
Alles in allem, mit all dem Logging, der Benutzeroberfläche, konfigurierbaren Einstellungen pro Domain / E-Mail / Benutzer usw. Wir haben ungefähr 1,5 Mannmonate gebraucht, um die Macken aufzubauen und auszubügeln. Das kann im Vergleich zum Outsourcing der E-Mails eine ziemliche Investition sein, vielleicht auch nicht, es hängt alles vom Volumen und Geschäft selbst ab.
Lassen Sie nun die Flamme beginnen, dass ich ein Dummkopf war, einen MTA in PHP zu schreiben, ich jedenfalls habe es sehr genossen (was einer der Gründe ist, warum ich diese riesige Menge an Text geschrieben habe) und die extrem vielseitigen Protokollierungs- und Einstellungsmöglichkeiten pro Host Warnungen basierend auf dem Fehlerprozentsatz usw. machen das Leben so einfach;)