/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Sende mail til mange på én gang
Fra : Torben Heikel Vinthe~


Dato : 09-03-03 13:13

Hejsa

Jeg er ved at lave en nyhedsbrev-funktion, hvor jeg bl.a. gerne vil kunne
sende en nyhedsmail til alle som har tilmeldt sig listen. Jeg har lavet en
test, som i og for sig virker efter hensigten, men jeg kunne godt tænke mig
at få et par gode råd mht. sikkerhed, effektivitet mv. i forbindelse med at
sende mails ud til mange på én gang.

Mit script (der altså virker) ser pt. såldes ud:

if (isset($handling) && ($handling=="send"))
{
$query = mysql_query("SELECT email FROM mailliste", $mysql_link);
while($row = mysql_fetch_array($query))
{
mail($row[email], "Test", "Test af mailliste", "FROM: Afsender
<min@mail.dk>\nX-Mailer: PHP/" . phpversion());
}
print "Alle mails blev sendt";
}

Hvordan skal man forholde sig til en evt. timeout, når der cykles igennem
tabellen med e-mails og sendes mails ud? Ovenstående virkede fint med 100
mails, men hvad når der skal sendes til flere hundrede...eller tusinde?
Og hvad skal man gøre for at få en meddelelse om, hvor mange mails der er
blevet sendt afsted?

Jeg håber der er nogen, der kan gøre mig lidt klogere på ovenstående. Jeg
plejer i hvert fald altid at få fantastisk god hjælp her på listen, og
tusind tak for det

Venlig hilsen
Torben Heikel Vinther



 
 
Niels Andersen (09-03-2003)
Kommentar
Fra : Niels Andersen


Dato : 09-03-03 13:35

Torben Heikel Vinther wrote in
<hgGaa.116329$Hl6.10638678@news010.worldonline.dk>:
> Hvordan skal man forholde sig til en evt. timeout, når der cykles igennem
> tabellen med e-mails og sendes mails ud?

Jeg sender jævnligt nogle tusinde mails ud med et script jeg selv har lavet.
Ligesom hos dig bliver email-adresserne hevet ud fra databasen.
Jeg har den ekstra finte, at jeg gerne vil have scriptet til at køre flere
gange på samme tid (multi-tråds-agtigt).

I hvert række har jeg et ekstra felt af typen "int". Den sætter jeg til 0
hos alle der skal have en mail, og -1 hos dem der ikke skal.

I SQL-sætningen henter jeg så kun dem, med status "1". Hver gang en adresse
hives ud gør jeg noget i stil med:
UPDATE tabel SET status=1 WHERE email='...' AND status=0
Så tjekker jeg hvor mange rækker det påvirkede, det vil være nul eller én.
Hvis det er nul, så er der allerede ved at blive sendt en mail, løkken
afbrydes ("continue", ikke "break"), og der prøves igen med en ny adresse.

Når en mail er sendt sættes status til "2".

Når alle scripts er færdige sætte jeg status til nul på alle, der har én, og
starter et script igen. Det er nemlig dem hvor der er gået noget helt galt.
Dette kan gøres smartere (automatisk), men det har jeg ikke gidet lave. :)

Under hele processen har jeg så et andet script, der løbende viser hvor
mange der er, med hver status.

--
Mvh.
Niels Andersen
http://myplace.dk/articles/getpost/?lang=da

Jonas Voss (09-03-2003)
Kommentar
Fra : Jonas Voss


Dato : 09-03-03 13:51

In dk.edb.internet.webdesign.serverside.php, Torben Heikel Vinther wrote:

> Jeg er ved at lave en nyhedsbrev-funktion, hvor jeg bl.a. gerne vil kunne
> sende en nyhedsmail til alle som har tilmeldt sig listen. Jeg har lavet en
> test, som i og for sig virker efter hensigten, men jeg kunne godt tænke mig
> at få et par gode råd mht. sikkerhed, effektivitet mv. i forbindelse med at
> sende mails ud til mange på én gang.

[...kode...]

> Hvordan skal man forholde sig til en evt. timeout, når der cykles igennem
> tabellen med e-mails og sendes mails ud? Ovenstående virkede fint med 100
> mails, men hvad når der skal sendes til flere hundrede...eller tusinde?
> Og hvad skal man gøre for at få en meddelelse om, hvor mange mails der er
> blevet sendt afsted?

Når du skal sende mails ud til mange (jeg ville mene alt over et par
hundrede) vil det mest sikre, effektive og bedste være at bruge SMTP
via en socketforbindelse på serveren. Mail() er fint nok til mindre
mængder emails, men problemet med mail() er, at funktionen starter een
proces på serveren pr. emailadresse. Har du f.eks. 800 emails der skal
sendes ud starter du 800 processer på serveren på samme tid, og det
kan godt give problemer, worst-case værende at serveren går ned på
grund af de 800 simultane processer.

Med en socketforbindelse til SMTP-serveren på værtsmaskinen sender du
alle emailadresser til serveren på en gang, hvorefter SMTP står for at
sende dem ud. På den måde starter du kun een proces, der varer i den
tid det tager at sende listen af emailadresser til SMTP hvorefter SMTP
står for at afsende emailene. Du kan læse om fsockopen() på:

<http://dk.php.net/fsockopen>

For at få vist hvor mange der er blevet sendt ud til kan du bruge
mysql_num_rows(). F.eks.:

if (!$recipients_total = mysql_num_rows($query)) {
print "<p>Der opstod en fejl relateret til databasen,";
print " nyhedsbrevet blev ikke sendt ud til abonnenterne.</p>";
} else {
print "<p>Nyhedsbrevet blev sendt ud til".$recipients_total."
abonnenter.</p>";
}

Håber det kan bruges.

--
| Jonas @ 55.75, 12.42 | <http://verture.net/> |

   "Only by counting could humans demonstrate
   their independence of computers."

Ukendt (09-03-2003)
Kommentar
Fra : Ukendt


Dato : 09-03-03 15:34

"Jonas Voss" <voss@null.dk> skrev i en meddelelse
news:iuprj-t1r.ln1@zaphod.local...
> In dk.edb.internet.webdesign.serverside.php, Torben Heikel Vinther wrote:
>
> Når du skal sende mails ud til mange (jeg ville mene alt over et par
> hundrede) vil det mest sikre, effektive og bedste være at bruge SMTP
> via en socketforbindelse på serveren. Mail() er fint nok til mindre
> mængder emails, men problemet med mail() er, at funktionen starter een
> proces på serveren pr. emailadresse. Har du f.eks. 800 emails der skal
> sendes ud starter du 800 processer på serveren på samme tid, og det
> kan godt give problemer, worst-case værende at serveren går ned på
> grund af de 800 simultane processer.
>
> Med en socketforbindelse til SMTP-serveren på værtsmaskinen sender du
> alle emailadresser til serveren på en gang, hvorefter SMTP står for at
> sende dem ud. På den måde starter du kun een proces, der varer i den
> tid det tager at sende listen af emailadresser til SMTP hvorefter SMTP
> står for at afsende emailene. Du kan læse om fsockopen() på:

Er det også en fordel at bruge SMTP når alle mails er forskellige? Altså
f.eks. 800 forskellige emails til 800 forskellige modtagere.

Claus



Jonas Voss (09-03-2003)
Kommentar
Fra : Jonas Voss


Dato : 09-03-03 15:57

In dk.edb.internet.webdesign.serverside.php, Claus Nygaard-Pedersen wrote:

> Er det også en fordel at bruge SMTP når alle mails er forskellige? Altså
> f.eks. 800 forskellige emails til 800 forskellige modtagere.

Der må jeg være dig svar skyldig. Desværre.

--
| Jonas @ 55.75, 12.42 | <http://verture.net/> |

   AHHH. Donuts. . . What can't they do. -- H. Simpson

Søg
Reklame
Statistik
Spørgsmål : 177503
Tips : 31968
Nyheder : 719565
Indlæg : 6408541
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste