Avatar billede shubijam Nybegynder
05. april 2006 - 13:45 Der er 8 kommentarer og
1 løsning

PHP mail - Meget lang mailingliste

Hej

Jeg anvender php-funktionen mail() til at udsende nyhedsbreve. Min liste af modtagere er gemt i en database, og når jeg udsender brevet looper jeg bare igennem alle tilmeldte mail-adresser og udfører noget, der minder om følgende:

$htmlheader = "From: $row_info[Navn] <$row_kontakt[Email]>\n";
$htmlheader .= "Reply-To: $row_kontakt[Email] <$row_kontakt[Email]>\n";
$htmlheader .= "Content-Type: text/html";
   
DO{
  mail($to, $subject, $message, $htmlheader);
}WHILE($row_email = mysql_fetch_assoc($result_email));

Mit spørgsmål er så - er det den mest korrekte måde at gøre det på, eller findes der smartere tilgange? Jeg forudser problemer, hvis jeg pludselig står med en mailingliste med 1000 adresser, hvor det vel ikke kan være super smart at loope sig igennem dem alle - eller hvad?

Håber på et godt bud...
Avatar billede net-base.dk Nybegynder
05. april 2006 - 14:02 #1
JEg ville lave et cronjob som hentes f.eks 50 email adresser og sendte mail til dem hvert 2. min f.eks. så skal den selv lige sætte et hak i databasen så dit script kan se at den ikke skal sende mail til den på gældende bruger igen...
Avatar billede pvtsommer Nybegynder
05. april 2006 - 15:25 #2
Jeg har til mine sider gjort ala det du gør.

Lidt i stil med (hurtigt skrevet):

$dump = mysql_query("SELECT user_name, user_email FROM users");
while($viewdata = mysql_fetch_assoc($dump)) {

@mail([info goes here]);

}

Det tog 15 minutter at udsende til 21.000 brugere. Om det er "smart" ved jeg ikke. Siden kørte fint nok imens, og jeg ved at mailserveren automatisk stillede dem i en slags kø! Men det virkede perfekt!
Avatar billede smirnoff Nybegynder
05. april 2006 - 19:43 #3
Mailservere er specielt designet til det de skal lave .. at sende og modtage mails ... jeg ville personligt ikke have problemer med at sende mailserveren 10 - 20.000 mails på een gang, da den rigtig nok ville lægge dem i en kø - hvornår den vælger at afsende dem afgør den jo selv.

Find ud af hvilken mailserver den kører og se om du kan finde noget info på den vedr. stresstest el. lign .. jeg har ikke selv testet nok til at vide om det er et issue med mails >10000 f.eks ... men alt er relativt i forhold til hvilken mailserver du kører, om den i forvejen under hårdt press osv... er du i tvivl er net-base.dk's ide jo også ok ... men så vil det også ta mindst 40 min at sende 1000 mails i forhold til 21000 mails på 15 ikke sandt
Avatar billede pvtsommer Nybegynder
05. april 2006 - 19:45 #4
Hvis man kombinere hvad jeg skrev med en værdi i databasen (fx at hver bruger har nyhedsbrev=0 til at starte med, som så opdaterer til nyhedsbrev=1 ved første nyhedsbrev, og 2 ved andet m.v., så HVIS der skulle gå noget galt, overspammer man ikke brugerne. Den bruger jeg på min :)
Avatar billede net-base.dk Nybegynder
05. april 2006 - 23:45 #5
Pytsommer -> hvad så hvis du har brugere som kommer til efter at andre bruger har fået til sendt mail vil de så starte med nyhedsbrev=0 eller vil de starte hvor de andre er? for ellers kan man jo ikke se hvem der har fået mail hvis mail afsendingen skulle gå ned imens den sender...
Avatar billede shubijam Nybegynder
06. april 2006 - 09:21 #6
Hej igen. Tak for de mange kommentarer - det er fedt! Dog føler jeg mig stadig lidt usikker. Det pågældende system ligger på Azero.dk, og jeg kan ikke finde noget om stresstest af mailserveren.

Det lyder super, at I har gode erfaringer med udsendelse af mange mails - men vil man (afhængigt af serveren) ikke få en slags "http-timeout", hvis man bare går i gang med et 15-minutters job?

Iøvrigt en god idé med værdien i db'en, som kan sættes til nyhedsbrevets id, når der sendes. Jeg plejer ikke at udsende nyhedsbrev med det samme, når en ny bruger tilmelder sig. Vedkommende vil få værdien 0 og dermed modtage det næstkommende nyhedsbrev. Har vedkommende stadig 0 herefter, skyldes det en fejl i udsendelsen.
Avatar billede pvtsommer Nybegynder
06. april 2006 - 16:44 #7
shubijam: Heldigvis fungerer det ikke sådan, at det "låser" serveren. Det sker ikke. Jeg gør gerne det at jeg laver en counter, som først optæller det antal man sender til:

$dump = mysql_query("detdunuengangskalbruge");
$checkSum = mysql_num_rows($dump);

echo 'Nyhedsbrevet forsøges udsendt til: '.$checkSum.' brugere.<br><br>';

$i = 0;
while($viewList = mysql_fetch_assoc($ditSQLDump)) {
  // Smider 1 oveni.
  $i++;

  echo '#'.$i.' - Afsender til '.$viewList[email].' - ';
  if(mail(duvedhvadduskalhaveher)) {
    echo 'fuldført';
    mysql_query("UPDATE!!");
  } else {
    echo '<font color="red"><b>IKKE AFSENDT!</b></font>';
  }

echo '<br>';

}

echo '<br><br>Nyhedsbrevet blev afsendt til '.$i.' ud af '.$checkSum.'';

Det er kun et eksempel, og kan faktisk ikke huske om jeg bruger if(mail()) eller noget andet smart.

:)
Avatar billede shubijam Nybegynder
06. april 2006 - 16:52 #8
Jeg siger mange tak - jeg føler mig bedre informeret nu ;-) Nu bliver det spændende at se, hvordan det kommer til at gå i praksis...
Tak!
Avatar billede pvtsommer Nybegynder
06. april 2006 - 16:54 #9
Så lidt. Med noget microtime kan du jo snildt tage tiden på hvor længe det tager m.v.. men det kan jo udbygges i uendeligheder :D
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