Avatar billede lone_a_p Praktikant
20. oktober 2006 - 10:59 Der er 14 kommentarer og
1 løsning

Udsending af mails

Jeg har et site, hvor jeg gerne vil have sendt mails ud til alle oprettede brugere (knap 3000 stk)

Hvordan gør jeg dette bedst, for jeg har vist tidligere hørt tale om, at dette kan give problemer.

Jeg har tænkt, at jeg kunne lave et felt i databasen, der hedder "mail sendt" og så lave en php-løkke noget i retningen af:

hvis "mail sendt" == false
så send mail og set "mail sendt" = true

Jeg går ud fra, at denne while-løkke på et tidspunkt vil gå i "hårknude" men så ved jeg jo, hvem der har fået tilsendt mail, og jeg kan blot starte forfra.

Er der en bedre løsning?

Mvh Lone
Avatar billede loevgaard Praktikant
20. oktober 2006 - 13:24 #1
Der er sikkert en masse klasser til det på nettet. Den her er gammel, og ved ikke om den virker: http://pear.php.net/package/Mail_Queue
Avatar billede lone_a_p Praktikant
21. oktober 2006 - 11:37 #2
Andre forslag?
Avatar billede webudvikleren Nybegynder
21. oktober 2006 - 14:01 #3
Bruger du mail()-funktionen?

Så kan du noget i stil med:

<?php
if ( mail("fra@dig.dk","subject","besked") )
{
      /** indsæt til mysql, fordi nu er den true, og ER sendt **/
} else {
      /** indsæt til mysql, fordi nu er den false, og IKKE sendt **/
}
?>
Avatar billede lone_a_p Praktikant
21. oktober 2006 - 14:17 #4
webudvikleren> ja, jeg benytter mail-funktionen (eller har i al fald tænkt mig at gøre det).

Hvor mange mails kan man sende ud af gangen? Jeg synes at have læst et eller andet sted, at det kan give problemer, hvis der er for mange.

Og er det ok bare at benytte en "while 'der stadig er brugere der ikke har fået tilsendt mail' then 'send mail'"

Mvh lone
Avatar billede webudvikleren Nybegynder
21. oktober 2006 - 15:51 #5
Jeg plejer normalt, at bruge sleep funktionen, så den holder en lille pause, hver gang den sender. Det virker i hvert fald fint her, også selvom den skal sende til 1500 brugere - det tager bare et stykke tid, da den laver sleep-funktionen. Men what ever, hos mig virker det ganske godt, du kan vel selv prøve? :-)

Eksempel:

<?php
$hent = mysql_query("SELECT email FROM brugere"); /** henter e-mails fra tabel **/
while ( $row = mysql_fetch_assoc ( $hent ) )  /** udskriver dem alle **/
{
if ( mail($row['email'],$subject,$besked) )
{
      /** indsæt til mysql, fordi nu er den true, og ER sendt **/
      flush();
      sleep(1); /** venter 1 sekundt, før den går videre **/
      flush();
      echo $row['email'] . " blev sendt <strong>korrekt</strong><br />\r\n";
} else {
      /** indsæt til mysql, fordi nu er den false, og IKKE sendt **/
      flush();
      sleep(1); /** venter 1 sekundt, før den går videre **/
      flush();
      echo $row['email'] . " blev sendt <strong>ukorrekt</strong><br />\r\n";
}
?>
-- www.php.net/flush
---- www.php.net/sleep


Normalt, ved det eksempel jeg lige har givet dig, så siger vi "var8" er "webudvikleren@gmail.com"

if ( mail(var8,"test subject","besked") ) {

Hvis "mailen var8 ( webudvikleren@gmail.com )" er sendt, så skal den
{
    /** noget **/
}


Hvis den ikke sender, så kan det skyldes en ukorrekt e-mail adresse.
Avatar billede webudvikleren Nybegynder
21. oktober 2006 - 15:51 #6
-- også manglede jeg lige at afslutte while'en
Avatar billede michaeltryl Seniormester
21. oktober 2006 - 16:18 #7
jeg har fulgt med på sidelinien og vil lige høre om det er her selve beskeden skal indsættes

<?php
//her hentes beskeden fra en formular eller database og gemmes i variablerne
$subjekt og $besked

$hent = mysql_query("SELECT email FROM brugere"); /** henter e-mails fra tabel **/
while ( $row = mysql_fetch_assoc ( $hent ) )  /** udskriver dem alle **/
{
Avatar billede webudvikleren Nybegynder
21. oktober 2006 - 16:39 #8
Ja, jeg glemte lige at udskrive subject og besked variablen, men du har fat på noget.. Dette skulle klare det:

//her hentes beskeden fra en formular eller database og gemmes i variablerne
(String) $subject = "Du har modtaget en e-mail fra mig";
(String) $besked = "Hejsa, hvad går du rundt og laver!?";

$hent = mysql_query("SELECT email FROM brugere"); /** henter e-mails fra tabel **/
while ( $row = mysql_fetch_assoc ( $hent ) )  /** udskriver dem alle **/
{
Avatar billede michaeltryl Seniormester
21. oktober 2006 - 17:03 #9
tænkte det nok.
men jeg er ikke med på hvad den flush() gør og dette
/** indsæt til mysql, fordi nu er den true, og ER sendt **/
hvad og hvor skal det indsættes?
Avatar billede lone_a_p Praktikant
21. oktober 2006 - 17:29 #10
michaeltryl> så vidt jeg kan læse mig til gør flush det, at den skriver på skærmen imens den kører scriptet ... så kan man se, hvor langt man er nået, hvis man laver en echo inde i while'en. (men er ikke sikker, for jeg har ikke benyttet funktionen før.

/** indsæt til mysql, fordi nu er den true, og ER sendt **/
betyder at man har et field/kolonne i en brugertabel, som f.eks. hedder "mail_sendt". Når mailen er sendt til den pågældende bruger/række opdateres denne bruger/række til mail_sendt = true, hvor den før var mail_sendt = false.

På den måde er man sikker på, hvor langt man er nået med brugerne hvis noget skulle gå galt undervejs.
Avatar billede michaeltryl Seniormester
21. oktober 2006 - 17:45 #11
okay og til slut på siden skal man så have en der updater alle til false igen ellers står alle jo som true næste gang det skal sendes
Avatar billede lone_a_p Praktikant
21. oktober 2006 - 18:19 #12
nej, jeg ville ikke opdatere til false i samme script

det ville jeg gøre manuelt efter jeg har fjernet scriptet, så jeg ikke kommer til at køre det igen og alle får to mails (eller flere :-O)
Avatar billede michaeltryl Seniormester
21. oktober 2006 - 18:29 #13
det kan jeg godt følge. jeg må prøve det af en gang i nærmeste fremtid
Avatar billede lone_a_p Praktikant
21. oktober 2006 - 19:06 #14
også her :)

webudvikler> vil du lægge et svar?, så får du point
Avatar billede webudvikleren Nybegynder
23. oktober 2006 - 00:38 #15
Kommer her ! :-)
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