Avatar billede karto Nybegynder
25. februar 2004 - 14:38 Der er 18 kommentarer

Erfaring med masseudsendelse af e-mails

Hejsa Alle sammen

Er der nogen af jer der har erfaringer med programmering af systemer til masseudsendelse af e-mails?

Jeg skal til at programmere et system der kan håndtere at sende omkring 100k e-mails, med forskellig indhold.
Systemet skal erstatte den nyhedsbrevs funktion jeg allerede har programmeret, da den bliver for langsom når man sender mere en 40k mails (> 60 sek. pr. mail når man kommer over et vist antal).
Nyhedsbrevs funktionen er kodet i PHP, og bruger PHP’s mail funktion til at sende hver mail.

Jeg gik og overvejede om det ville være hurtigere hvis jeg sendte mailsne direkte til smtp serveren, dvs. ved at åbne en socket til den.

Er der nogen af jer der har nogle ideer? Det er lige meget hvilket programmeringssprog der danner grundlag for dine erfaringer.


Jeg vil også gerne vide, hvor mange e-mailadresser er det muligt at sætte i en BCC? Tror i 1000 er for mange?
Avatar billede kgp43 Nybegynder
25. februar 2004 - 15:09 #1
100k mails?
damn, nu snakker vi vel ikke om spam?
Avatar billede muddi Praktikant
25. februar 2004 - 15:19 #2
Måske kan du bruge PHPMailer. Jeg har ikke selv afprøvet det endnu, men er ved at bygge en side, hvor jeg anvender PHPMailer.
Her er det muligt at anvende sockets: http://phpmailer.sourceforge.net/
Avatar billede fangel Nybegynder
25. februar 2004 - 15:40 #3
jeg har haft leget med mail afsendelse via sockets - og det er faktisk ikke _SÅ_ svært at det gør noget... det kan sagtens lade sig gøre

kender du SMTP protokollen, ellers kan jeg godt smide nogle ex.

pseudo kode følger på forløb
åben socket $sock
while(flere mails)
  send mail ved brug af socket $sock
luk socket $sock

tid brugt i en socket tæller ikke med i ekseverings tid, så med lidt held kan du lade være med at fuske med set_time_limie()...

MEN, ved 100k mails vil det nok være smartes at lave en side der fx sender 1000, reloader sig selv, sender de næste 1000 osv så man har en ide om hvor langt den er kommet...

---

hvis du kender meget til advanceret PHP (jeg har fx aldrig leget med det - det er ret "mærkligt") kan du undersøge brugen af "ticks" til at lave noget multi-process afsendelse af mails når du har åbnet socketen, dette vil nok vinde lidt tid da den ville kunne kørere flere processer der uploader mail og venter på svar fra mail server...

---

kender ikke lige til grænser for BCC, men tror ikke det kan være sundt at smide fx 1000 i BCC (prøv at læs RFCen om SMTP og se om du kan finde et svar)

Morten
Avatar billede karto Nybegynder
25. februar 2004 - 16:27 #4
Hmmm, PHPMailer, det var en mulighed, den kan sprede det ud over flere servere.
I deres FAQ, der skriver de at det hurtigste er at bruge PHP’s mail funktion.

Der står ikke noget i SMTP’s RFC om max antal adresser i to, cc eller bcc. Desværre… Det er noget man kan sætte op i nogle mailservere. Men hvor mange acceptere de forskellige mailservers?


Hvorfor vil du have at siden skal reloade… lige nu er der bare en proces bar, der viser, både med en graf, og med tal, hvor langt den er kommet.

Man kunne godt bruge ticks, men så er det en bedre teknisk løsning at åbne for f.eks. 10 sockets, og så bruge socket_select(). Så kan man sende / arbejde med alle 10 på en gang…


Tak for svarne
/karto
Avatar billede muddi Praktikant
25. februar 2004 - 16:36 #5
Jeg er ikke sikker på om jeg har ret, men jeg mener at PHPMailer kun er hurtigst ved at bruge php's egen mail-funktion, hvis scriptet afvikles på en UNIX. På en windows maskine sættes mail() jo til at brugen en SMTP, og derfor er det hurtigere at bruge sockets, som kan holdes åbne indtil al mail er sendt.

/Morten
Avatar billede fangel Nybegynder
25. februar 2004 - 16:49 #6
karto ->
1) hvordan kan du vise progress uden at reloade (med implicit-flush og JS?)
2) kender ikke lige omtalte funktion - men kunne man nok... (så du var nok (også) ret god til PHP - hæhæ)

muddi -> kan du nok have ret i, lydder meget plausibelt (spl?) ;)

Morten
Avatar billede muddi Praktikant
25. februar 2004 - 16:55 #7
dea_pg >> Hvad betyder spl? :o)
Avatar billede fangel Nybegynder
25. februar 2004 - 16:57 #8
spelling -> stavning (var usikker på hvordan det staves)
Avatar billede muddi Praktikant
25. februar 2004 - 17:03 #9
og jeg er usikker på hvad det betyder...
Avatar billede fangel Nybegynder
25. februar 2004 - 18:08 #10
plausibelt - noget man kan tro på (eller noget i den dur)

(og så kunne man lære ikke at stryge om sig med fremmeord - hæhæ)
Avatar billede karto Nybegynder
25. februar 2004 - 18:09 #11
dea_pg >

Det med en progress bar, det er nemt. Du kan lige så en copy 'n' paste af det kode jeg lige har fixet til det:


*** Før en loop:
print '<div style="border: 1px solid black; height: 25px; width: 500px; position: relative;">';
print '<div style="width: 0%; background-color: white; position: absolute; height: 23px;" id="progressBarBar"></div>';
print '<div style="text-align: center; position: absolute; width: 100%;" id="progressBarText">Henter e-mail adresser...</div>';
print '</div>'."\n";

*** <SQL der henter e-mail adresserne ud (tager nogle sekunder)>

*** Før en loop:
print '<script type="text/javascript">document.getElementById(\'progressBarText\').innerText = \'0 / '.$qry->rows.'\';</script>'."\n"; flush();

*** Inde i loopen:
print '<script type="text/javascript">';
print 'document.getElementById(\'progressBarText\').innerText = \''.$qry->row.' / '.$qry->rows.' - Pr email: '.((time() - $startDhtmlTime) / $dhtmlUpdateNum).' sek.\';';
print 'document.getElementById(\'progressBarBar\').style.width = \''. round(($qry->row / $qry->rows) * 100) .'%\';';
print '</script>'."\n";

*** Efter din loop:
print '<script type="text/javascript">';
print 'document.getElementById(\'progressBarText\').innerText = \''.$qry->row.' / '.$qry->rows.' - Pr email: '.(($endTime - $startTime) / $qry->rows).' sek.\';';
print 'document.getElementById(\'progressBarBar\').style.width = \''. round(($qry->row / $qry->rows) * 100) .'%\';';
print '</script>'."\n";


Så har du det at kigge på. :-)

God aften
/Karto
Avatar billede karto Nybegynder
25. februar 2004 - 18:09 #12
Lige en ting mere... du skal selvfølgelig have en flush() efter hver del.
Avatar billede fangel Nybegynder
25. februar 2004 - 18:16 #13
karto -> OK, så det var JS (og _næsten_ implicit flush hæhæ)...

Det var en meget fin løsning... laver nok noget lignene til det nyhedsbrevs-udsendelse jeg skal lave i løbet af ugen...

hvis jeg kommer på en god ide til at takle afsendelsen af mange mails så vender jeg tilbage når jeg har løst det !

Morten
Avatar billede fangel Nybegynder
25. februar 2004 - 18:19 #14
by-the-way... det er hurtigere at lave et kald til echo ud over flere linier end at lave en echo på hver linie (har haft kørt tidskørlser på det engang)...

altså

echo 'flere
liniers
tekst';

VS
echo 'flere';
echo ' liniers';
echo ' tekst';

bare hvis du vil presse lidt mere ud af PHP

Morten
Avatar billede halnet Nybegynder
26. februar 2004 - 16:49 #15
karto -> er du sikker på at det din server der bliver sløv efter 40k e-mails... og ikke din computer, efter alle de udregninger du har sat den til :D

Som jeg umidlbart læser din kode, så ender du op md at have over 100.000 liniers kode på din progressbar-side...

Ville i øvrigt være en god idé at dele scriptet ud over en længere periode... lav det over et cron-job, så du kan sende 5.000 e-mails afsted hvert kvarter...
Avatar billede fangel Nybegynder
26. februar 2004 - 17:44 #16
halnet -> godt spottet... udsendelsen af de mange data (og beregningen på dataen på klienten, som jo oftest er en og samme computer under tests) vil sænke processen utroeligt...

jeg ville nok lave noget tjek på hvor mange mails der pt er i databasen og så ud fra det afgøre hvor ofte jeg vil sende data til klientet (fx hvert 10. mail / hver 50. mail eller hver 100. mail så datamængden bliver væsenlig mindre !)

Morten
Avatar billede karto Nybegynder
26. februar 2004 - 20:04 #17
Den har jeg tænkt på. Den opdatere 10 gange under udsendelsen.
Avatar billede fangel Nybegynder
26. februar 2004 - 20:48 #18
karto -> OK... (men måske lidt mere end 10 gange ved 100k mails ville være rart... (gad personligt ikke vente 10k mails på at få en ca. tid på hvor lang tid det tager ;))
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester