[PHP] Bulk e-mail versturen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • VR46
  • Registratie: Januari 2005
  • Laatst online: 13-06 07:21
Hallo,

Ik ben bezig met een PHP script waarvan de taak is om een e-mail te sturen naar een hele mailinglist die nu zo'n 100 adressen telt (op een nette manier verkregen ;) ). Hiervoor maak ik gebruik van de XPertMailer-class.

Ik heb nog weinig ervaring met het sturen van een groot aantal e-mails middels een PHP script, en tot nu toe wil het nog niet goed lukken. Als ik het script de opdracht geef om aan alle ~100 adressen een mail te sturen (ik doe dit nu in een testomgeving die ze allemaal naar één testadres stuurt), komen er vaak maar een stuk of 50 aan. Ik heb de execution time (set_time_limit();) reeds op 0 gezet zodat het script niet afgekapt wordt.

De manier waarop mijn script werkt, is dat het eerst een mysql-query doet voor de adressen waar de mail naar verstuurd moet worden, en vervolgens per adres een mail verstuurt middels een while-loop.
Ter illustratie, dat ziet er even kort door de bocht zo uit:
PHP:
1
2
3
4
5
6
while($row = $result->fetch_assoc() {
 $m = new MAIL;
 //etc. etc. etc.
 $m = //smtp accountgegevens
 $m = send($smtp);
}

Nu is mijn eerste vraag: is PHP hier wel geschikt voor, of kan ik beter ergens anders naar kijken?
De tweede vraag: is het verstandig om de mail middels een while-loop te versturen? Zoniet, hoe kan dit anders als ik elke mail wil voorzien van persoonlijke gegevens als de naam van de ontvanger en een unieke url?

Het gebruik van een apart script of een 3rd party oplossing lijkt me niet handig, aangezien ik zoals ik zij in elk mailtje persoonlijke details moet verwerken die in onze mysql database staan...

Graag hoor ik jullie advies! :)

Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
PHP kan prima bulk versturen. Gebruik daarvoor een soort wachtrij-constructie. Zoals bijvoorbeeld Pear Mailque. Te verzenden mails komen dan in een tabel te staan, en deze wordt in batches van 10/20/30/instelbaar verzonden.

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Het is inderdaad "jammer" dat je geen bulk kan versturen waarbij je alle 100 adressen in het BCC veld zet. Met een smtp connectie moet dat namelijk nog wel lukken. Is het niet aankomen van de emails echt een php issue (dus geen bounces, geen verkeerde headers etc)? En zo ja, komt dat echt door de execution time?

Wat verder gebruikelijk is bij mailinglisten met heel veel subscribers, is het in een queue plaatsen. De queue maak je door elke keer een gedeelte uit te lezen en daarvan de mails te versturen. Vervolgens pak je het volgende stuk. Dit kan bijv. gemakkelijk met een cron geregeld worden.

[ Voor 17% gewijzigd door mithras op 31-08-2009 17:30 ]


Acties:
  • 0 Henk 'm!

  • VR46
  • Registratie: Januari 2005
  • Laatst online: 13-06 07:21
Noork schreef op maandag 31 augustus 2009 @ 17:28:
PHP kan prima bulk versturen. Gebruik daarvoor een soort wachtrij-constructie. Zoals bijvoorbeeld Pear Mailque. Te verzenden mails komen dan in een tabel te staan, en deze wordt in batches van 10/20/30/instelbaar verzonden.
Dus dan zou ik die hele XPertMailer-class niet meer moeten gebruiken, begrijp ik dat goed? En is het noodzakelijk dat mail queue geinstalleerd staat op de host-server? Ik vrees dat dat bij mijndomein.nl immers niet het geval zal zijn :? (?)
mithras schreef op maandag 31 augustus 2009 @ 17:30:
Het is inderdaad "jammer" dat je geen bulk kan versturen waarbij je alle 100 adressen in het BCC veld zet. Met een smtp connectie moet dat namelijk nog wel lukken. Is het niet aankomen van de emails echt een php issue (dus geen bounces, geen verkeerde headers etc)? En zo ja, komt dat echt door de execution time?
Nee het lijkt me aan PHP te liggen want de mails zijn stuk voor stuk identiek (headers etc.) op twee variabelen na... Ik gebruik immers een html template waarin twee woorden worden vervangen door een variabele uit de database. De execution time lijkt me ook in orde, die staat gewoon op set_time_limit(0);... Als ik bij wijze van test slechts 25 mails stuur komen ze bovendien wel allemaal aan, lijkt het. Pas als ik de limiet opschroef naar ~100 mails gaat het mis.

[ Voor 43% gewijzigd door VR46 op 31-08-2009 17:34 ]


Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
cbernardini schreef op maandag 31 augustus 2009 @ 17:31:
[...]

Dus dan zou ik die hele XPertMailer-class niet meer moeten gebruiken, begrijp ik dat goed? En is het noodzakelijk dat mail queue geinstalleerd staat op de host-server? Ik vrees dat dat bij mijndomein.nl immers niet het geval zal zijn :? (?)
Sorry ik ken jouw gebruikte class niet. En ik zeg ook niet dat je over moet stappen. Maar je moet aan een soort wachtrij-constructie denken. Overigens is dat niet al te moeilijk te maken. Gewoon mailtjes naar een tabel schrijven, en met een cronjob mails ophalen uit de tabel en wellicht met XPertMailer de mails verzenden.

Acties:
  • 0 Henk 'm!

  • VR46
  • Registratie: Januari 2005
  • Laatst online: 13-06 07:21
Noork schreef op maandag 31 augustus 2009 @ 17:33:
[...]

Sorry ik ken jouw gebruikte class niet. En ik zeg ook niet dat je over moet stappen. Maar je moet aan een soort wachtrij-constructie denken. Overigens is dat niet al te moeilijk te maken. Gewoon mailtjes naar een tabel schrijven, en met een cronjob mails ophalen uit de tabel en wellicht met XPertMailer de mails verzenden.
Cronjobs en queues zat ik ook al aan te denken maar:
  • Het lijkt erop dat cronjob niet beschikbaar is bij de hosting van mn opdrachtgever 8)7
  • Ik weet nog niet hoe ik het beste een wachtrij kan opbouwen zonder te veel extensies te hoeven gebruiken (bijv. PEAR)
Trouwens, ik heb nog nooit eerder met ob_start() gewerkt, en heb nog niet helemaal begrepen hoe deze functie werkt, maar kan die nog van enig nut zijn?

Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Dat is vervelend. Dan weet ik het ook niet. Misschien gewoon niet alle 100 tegelijk sturen. Misschien kun je nog iets als de max execution time verhogen in je htaccess o.i.d. (al gedaan zie ik)

ob_start is output buffering. Dan spaar je alle echo's op en kun je ze in 1x uitspugen. Denk niet dat dat hier iets mee te maken heeft.

[ Voor 3% gewijzigd door Noork op 31-08-2009 17:40 ]


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Heb je nog een andere host? Je kan een cron starten die wget naar je huidige server. Die gaat dan die queue afhandelen :)

Acties:
  • 0 Henk 'm!

  • --MeAngry--
  • Registratie: September 2002
  • Laatst online: 20-06 16:10

--MeAngry--

aka Qonstrukt

Cronjobs zijn voor zo'n hoeveelheden mails nog niet eens nodig, als je de beschikking hebt over een SMTP server (van je host bijvoorbeeld) kun je alle mails gewoon daarheen gooien.

Daarnaast ben je nu voor elke mail een nieuw Mail object aan het maken, kan dat niet efficiënter? Ik zou de documenten van die Mailer class eens goed doornemen. En anders iets beters zoeken, want als je Mailer class niet eens het versturen van meerdere mails ondersteunt wordt het tijd voor een die meer aan je wensen voldoet. :)

Tesla Model Y RWD (2024)


Acties:
  • 0 Henk 'm!

  • VR46
  • Registratie: Januari 2005
  • Laatst online: 13-06 07:21
mithras schreef op maandag 31 augustus 2009 @ 17:41:
Heb je nog een andere host? Je kan een cron starten die wget naar je huidige server. Die gaat dan die queue afhandelen :)
Dat is misschien wel de moeite waard om uit te proberen. Nog nooit met wget gewerkt, moet ik zeggen, maar dat zal vast niet al te lastig zijn. Dacht dat webreus (heb daar een aantal hosts) cronjobs wel ondersteund (?). Anders ga ik mn opdrachtgever een schop onder de kont geven om zsm te verhuizen :+

Acties:
  • 0 Henk 'm!

  • VR46
  • Registratie: Januari 2005
  • Laatst online: 13-06 07:21
--MeAngry-- schreef op maandag 31 augustus 2009 @ 17:45:
Cronjobs zijn voor zo'n hoeveelheden mails nog niet eens nodig, als je de beschikking hebt over een SMTP server (van je host bijvoorbeeld) kun je alle mails gewoon daarheen gooien.

Daarnaast ben je nu voor elke mail een nieuw Mail object aan het maken, kan dat niet efficiënter? Ik zou de documenten van die Mailer class eens goed doornemen. En anders iets beters zoeken, want als je Mailer class niet eens het versturen van meerdere mails ondersteunt wordt het tijd voor een die meer aan je wensen voldoet. :)
Ja dat kan natuurlijk wel, doormiddel van bijvoorbeeld:
PHP:
1
$m ->AddTo('recepient1@test.nl','recepient2@test.nl','recepient3@test.nl'); // etc..

Alleen dan verstuurt hij dus één en dezelfde mail naar alle ontvangers. Het probleem is dat ik dus in elke mail de naam van de geadresseerde moet verwerken en een unieke url. Dat gaat zo niet (voor zover ik weet).

//Edit: sorry voor de twee posts :/

Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 20-06 16:41
Even een korte blik op de documentatie geworpen via de link uit de TS; je kunt gewoon oude adres(sen) wissen, nieuwe toevoegen en nieuwe body e.d. instellen. Dus gewoon één keer een MAIL-object maken en SMTP-sessie starten voor je while-lus. Kijk eens of het dan wel lukt.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 23:56

Creepy

Tactical Espionage Splatterer

cbernardini: Er zijn steeds meer mail servers die een limit stellen op het aantal mensen in de to, cc of bcc (en terecht). En zoals je zelf al zegt is dat geen opties als je mails wilt personaliseren. Dit soort zaken op een shared hosting account is leuk maar als je flink wat meer adressen hebt dan wil je gewoon zelf je mailqueue kunnen beheren zodat je die in 1 keer kan vol knallen met mails en de MTA de scheduling verder voor je doet. Hoef je ook geen fratsen uit te halen door alle mails in een database te zetten en elke aanroep van je script er steeds een X aantal te verwerken.

Als je code echt is zoals je nu laat zien (in een for loop een nieuwe mail aanmaken en los versturen) en er verdwijnen mails dan moet je je eens controleren of de MTA de mail wel aanneemt. Als je zelf niet de controle over je MTA hebt dan zul je waarschijnlijk bij je hoster moeten zijn. Daarnaast zul je moeten controleren of de e-mail wel daadwerkelijk direct wordt aangenomen. Aangezien je nu alles naar hetzelfde adres stuurt zou het best wel eens kunnen zijn dat je mailserver die de mail moet aannemen connecties weigert zodat er mails in een retry scheme terecht komen. Dan komen je mails ineens deels met vertraging binnen. Zeker bij de kleinere ISP's en bedrijven mails loop je snel tegen dirt soort limieten aan (max 4 connecties tegelijk, max X aantal mails per minuut per IP etc.)

[ Voor 22% gewijzigd door Creepy op 31-08-2009 20:25 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Tweaker36
  • Registratie: Juni 2007
  • Laatst online: 12-06 18:02
Waarom zelf maken, als je voor weinig eentje kan kopen... ;)

Bulk Mailer X is een uitgebreid nieuwsbrief systeem, multifunctioneel en kost $25.
Niet veel, voor zo'n leuk script.

Toegegeven, het origineel ziet er ronduit walgelijk uit qua 'opmaak' (of: het gebrek eraan):

Afbeeldingslocatie: http://tweakers.net/ext/f/WXUgQ4xf2H613KQAjlLyrHRw/thumb.png

Maar het werkt wel prima.

Met een beetje goede wil, en enkele uurtjes vrij, maak je 'r zelf iets heel moois van. Mijn versie:

Afbeeldingslocatie: http://tweakers.net/ext/f/U3u0otSg5VxYSDiqBBPPzDp1/thumb.png

Het script is verkrijgbaar @ http://www.webx.net/bmx/ :)

Edit:

Ohja, over:
Het gebruik van een apart script of een 3rd party oplossing lijkt me niet handig, aangezien ik zoals ik zij zei :+ in elk mailtje persoonlijke details moet verwerken die in onze mysql database staan...
Het script dat ik noem, kan importeren uit een db. Als je het correct doet, kan je vervolgens 'persoonlijke' mails maken, door bvb {name}, {email}, etc in je mails te gebruiken. Dit wordt dan vervangen door de gegevens overeenstemmend met dat contact...

[ Voor 24% gewijzigd door Tweaker36 op 31-08-2009 20:47 ]


Acties:
  • 0 Henk 'm!

  • Tjark
  • Registratie: Juni 2000
  • Laatst online: 19-06 21:51

Tjark

DON'T PANIC

Wat ik zelf heb meegemaakt, is dat de mailserver via ik 't relay, maar een x aantal mail per y aantal seconden wilde accepteren. Uiteindelijk moest ik een sleep van 10-11 seconden tussendoor doen en bleef hij dan wel mailen. Was bij mij geen probleem omdat het om max 20-30 mails ging. Maar 20-30 snel achter elkaar pikte de mail relay server gewoon niet.

*insert signature here


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Wat ik een keer heb gedaan voor ~2500 mails: zet alles in een tabel in je db en maak dan een pagina die een xhr-call doet naar je server. Die call laadt een script in die een x-aantal mails verstuurd en ze dan flagt dat ze gemaild zijn. Je zet die xhr-call in een timer en zo kun je zelf instellen hoeveel mails je in welke periode verstuurt. Heel basic maar werkte in mijn geval prima. Omdat mn mails werden samengesteld uit complexe berekeningen had ik de mailbody's alvast berekend en in de tabel in de row gezet. Op deze manier kom je dan niet met je max_execution_time in de knoei :)

edit: als je ook bounces ed. moet bijhouden, is het dan geen idee om eens te kijken naar partijen die dit aanbieden zoals Tripolis of Clang?

[ Voor 15% gewijzigd door Cartman! op 31-08-2009 22:05 ]


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 23:26

MueR

Admin Tweakers Discord

is niet lief

cbernardini schreef op maandag 31 augustus 2009 @ 17:47:
Ja dat kan natuurlijk wel, doormiddel van bijvoorbeeld:
PHP:
1
$m ->AddTo('recepient1@test.nl','recepient2@test.nl','recepient3@test.nl'); // etc..
Oh gaaf, dus als ik een mailtje krijg van die nieuwsbrief, heb ik meteen 99 adressen om viagra spam naar toe te gooien? :+

Gebruik de BCC, zet de verzender in de to. Nooit alle geaddresseerden in de to gooien.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • _Gekkie_
  • Registratie: Oktober 2000
  • Laatst online: 08-04 15:47

_Gekkie_

And the cow said: Helloooooow?

Kijk anders eens naar de decorator plugin voor Swift... (Swiftmailer.org) Kan je prima 10.000 e-mails mee eruit gooien in runs van 100 of 1000... 1 mail instellen en vervolgens 10.000 rijen uit een array of database trekken... De klasse zoekt wel uit wanneer welke rij aan de beurt is en vervangt alles in de ene template door jou variabelen... Super simpel... (en kan je rustig aanzetten en gaan met die .... mailing :))

Gekkie is a proud member of TheBenny!

Pagina: 1