Dit topic is niet echt een concrete vraag, maar meer een controle om te kijken of ik mijn probleem op een goede manier heb opgelost.
Ik heb voor iemand een mailing-systeem gemaakt in PHP. Het is allemaal niet heel erg ingewikkeld, maar het gaat om een redelijk grote groep mensen (op dit moment ongeveer 3000 abonnees). Omdat een simpele send-knop met een while-loopje erachter mij hier niet echt een optie leek ben ik wat leeswerk gaan verrichten. Ik heb het een en ander geleerd over verschillende mailer-classes (Swift-mailer en PHPMailer, waarvan de eerste de netste is volgens mij) en over de globale opzet (hier op GoT kwam o.a. chris met wat goede tips).
Al met al denk ik dat ik tot een goede oplossing ben gekomen, maar ik ben benieuwd naar jullie mening. Even 3000 mails sturen als test is niet echt een optie, dus ik moet het vooral van de theorie hebben met het opzetten.
Dit is hoe ik het nu doe:
Een nieuwsbrief wordt opgemaakt en opgeslagen. Zodra hij wordt aangemerkt als "klaar om te versturen" wordt de database-tabel "mailqueue" gevuld. Hierin staan de volgende velden:
Vervolgens het versturen. Op de server draait een cronjob die iedere 5 minuten mailer.php aanroept. Mailer.php kijkt of er records in de tabel mailqueue staan. Zo ja: dan pakt hij de eerste 100 records en voert hij een foreach-loopje uit. Voor ieder record in de mailqueue voert het script de PHP mail()-funtie uit met de gegevens die hij uit de mailqueue-tabel heeft gehaald. De headers worden boven de foreach-loop al gedefinieerd, omdat die niet per mail uniek zijn.
Zodra de mail verstuurd is wordt het betreffende record uit de mailqueue verwijderd. Daarna wordt er een record aangemaakt in de tabel "mailhistory" met daarin de ID van de newsletter, de ID van de subscriber, het mailadres van de subscriber en de verzenddatum.
Nu heb ik er bewust voor gekozen om geen class als Swift-mailer te gebruiken, omdat volgens mij 100x de mail()-functie per 5 minuten uitvoeren voor een beetje server geen probleem hoeft te zijn. Ik zie dus ook niet echt de noodzaak om via een aparte SMTP-server te versturen.
Ik ben erg benieuwd naar jullie gedachten hierover. Pak ik dit handig aan? Zijn er zaken die veel slimmer kunnen? Ik hoor het graag! Er ontstaat dan natuurlijk direct een mooie tutorial voor anderen die hier tegenaan lopen.
Noot: ik heb bewust geen stukken code gepost, omdat het hier meer over de theorie dan de daadwerkelijke code gaat. Mocht iemand dit toch willen zien dan kan dat natuurlijk.
Ik heb voor iemand een mailing-systeem gemaakt in PHP. Het is allemaal niet heel erg ingewikkeld, maar het gaat om een redelijk grote groep mensen (op dit moment ongeveer 3000 abonnees). Omdat een simpele send-knop met een while-loopje erachter mij hier niet echt een optie leek ben ik wat leeswerk gaan verrichten. Ik heb het een en ander geleerd over verschillende mailer-classes (Swift-mailer en PHPMailer, waarvan de eerste de netste is volgens mij) en over de globale opzet (hier op GoT kwam o.a. chris met wat goede tips).
Al met al denk ik dat ik tot een goede oplossing ben gekomen, maar ik ben benieuwd naar jullie mening. Even 3000 mails sturen als test is niet echt een optie, dus ik moet het vooral van de theorie hebben met het opzetten.
Dit is hoe ik het nu doe:
Een nieuwsbrief wordt opgemaakt en opgeslagen. Zodra hij wordt aangemerkt als "klaar om te versturen" wordt de database-tabel "mailqueue" gevuld. Hierin staan de volgende velden:
- newsletter_id
- subscriber_id
- subscriber_email
- newsletter_title
- newsletter_content
Vervolgens het versturen. Op de server draait een cronjob die iedere 5 minuten mailer.php aanroept. Mailer.php kijkt of er records in de tabel mailqueue staan. Zo ja: dan pakt hij de eerste 100 records en voert hij een foreach-loopje uit. Voor ieder record in de mailqueue voert het script de PHP mail()-funtie uit met de gegevens die hij uit de mailqueue-tabel heeft gehaald. De headers worden boven de foreach-loop al gedefinieerd, omdat die niet per mail uniek zijn.
Zodra de mail verstuurd is wordt het betreffende record uit de mailqueue verwijderd. Daarna wordt er een record aangemaakt in de tabel "mailhistory" met daarin de ID van de newsletter, de ID van de subscriber, het mailadres van de subscriber en de verzenddatum.
Nu heb ik er bewust voor gekozen om geen class als Swift-mailer te gebruiken, omdat volgens mij 100x de mail()-functie per 5 minuten uitvoeren voor een beetje server geen probleem hoeft te zijn. Ik zie dus ook niet echt de noodzaak om via een aparte SMTP-server te versturen.
Ik ben erg benieuwd naar jullie gedachten hierover. Pak ik dit handig aan? Zijn er zaken die veel slimmer kunnen? Ik hoor het graag! Er ontstaat dan natuurlijk direct een mooie tutorial voor anderen die hier tegenaan lopen.
Noot: ik heb bewust geen stukken code gepost, omdat het hier meer over de theorie dan de daadwerkelijke code gaat. Mocht iemand dit toch willen zien dan kan dat natuurlijk.