WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Göra massutskick av e-mail med PHP (https://www.wn.se/forum/showthread.php?t=23188)

superhaga 2007-08-27 23:27

Hur gör man för att skicka nyhetsmail till alla sina 1000 kunder?

Det lär väl knappast gå genom att göra så här:

Kod:


$mailsubject = "Nyhetsbrev";
$mailbody = "Hej, kom och köp";

$mailadresser[] = (en väldig massa mailadresser);

foreach ($mailadresser AS $dummy => $mailadress)
{
  mail($mailadress,$mailsubject,$mailbody);
}


grazzy 2007-08-27 23:34

Det går.. beroende på din timeout i php.

Du kan som alternativ lägga till en LIMIT i din SQL och skicka med ett offset till sidan som skickar email. Då kan du köra iväg 30 stycken email och sedan uppdatera sidan med nytt offset. På det sättet kan du även starta om från valfri punkt (glöm inte markera vilka emails du har skickat till i databasen bara).

superhaga 2007-08-27 23:56

Å tusan... Men hur mycket tål mailservern innan den brakar ihop? Om det nu skulle vara så att man har ett par hundra kunder som skall få mail, så blir väl den väldigt belastad av detta.

grazzy 2007-08-28 00:22

Mailservern är gjord för att klara riktigt mycket stryk. Den köar bara snällt upp alla mailen.

hnn 2007-08-28 01:11

grazzy vet... Han är WNs största spammare :)

Skämt åsido, det är precis som grazzy skriver...
Bara ös på med mail till servern. Tänk dock på att kontrollera med hotellet att det är OK att skicka ut nyhetsbrev, så dom inte stänger av dig.

superhaga 2007-08-28 19:12

Ok, jag testar mig blå.... Tack för svaren!

haavi 2007-08-28 23:19

Hej superhaga,
enligt PHP.net så tar mail-funktionens första parameter en sträng som bland annat kan se ut så här: "[email protected], [email protected]" eller så här: User <[email protected]>, Another User <[email protected]>.

Jag skulle därför ha skrivit din kod så här förmodligen:

Kod:

$email = "";
foreach ($mailadresser as $mailadress) {
        $email .= $mailadress . ", ";
}

$to = $email;

if (@mail($to, $subject, $message, $headers)) {
        $strSuccess = 'Ditt mail har nu skickats!';
        } else {
        $strError = 'Kunde inte skicka mailet';
}

På det här sättet behöver du bara anropa mail-funktionen en gång vilket jag skulle tro är mycket bättre prestandamässigt både mot webbservern och mailservern. Hämtar du e-postadresserna från en databas så se också till att du använder DISTINCT i dina SQL-anrop, exempelvis så här:

Kod:

$sql = "SELECT DISTINCT mail FROM anvandare";
$result = mysql_query($sql) or die(mysql_error());

$email = "";

while($row = mysql_fetch_assoc($result)) {
        $email .= $row['mail'] . ", ";
}

På så sätt ser du till att du inte skickar ut samma mail flera gånger till någon om det skulle hända att det finns dubletter av samma e-postadresser i din databas (vilket du borde se till att det inte gör förresten) :)

grazzy 2007-08-28 23:21

Nej, det är ingen bra ide. Då kommer alla users att se alla andra users. Superhaga vill garanterat inte distribuera sin kunddatabas (eller sin kunds).

Det man skall använda i så fall är BCC (blind carbon copy - googla det) men många många mailmottagare triggar spamfilter på att ett mail kommer via BCC. Det är således inte alls att rekommendera.

haavi 2007-08-28 23:38

Ok grazzy, det tänkte jag faktiskt inte på men du har ju förstås rätt. Med tanke på vilken valuta e-postadresser har blivit så ska du inte följa mitt exempel superhaga.

Ett mail()-anrop för varje enskild e-postadress är väl den optimalaste lösning ändå antar jag.

Ta även en titt på klassen http://phpmailer.sourceforge.net/. Förenklar mailutskick betydligt i min mening och är lätt att lära sig!

stakes 2007-08-30 11:51

Ta även en titt på.

http://swiftmailer.org

Dödar inte din server lika mycket ;)


Alla tider är GMT +2. Klockan är nu 07:12.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson