Oprettet ons. d. 25. november 2009 kl. 16:21:29

matfri
matfri (17.321 point. Point ude: 435)

Kapacitet af mailinglist

Hej,

jeg er i gang med at skabe et system som indeholder nogle oplysninger heriblandt e-mailadresser. Jeg vil gerne være i stand til at sende mails til adresserne i databasen. Jeg har fundet en måde hvorpå jeg kan sende mails ud, men jeg ved ikke hvornår jeg når grænsen for hvor mange mails jeg kan udsende. Så mit spørgsmål lyder på,
-hvordan tester jeg mit system, så jeg ved hvor grænsen går for hvor mange mails jeg kan udsende ad gangen?

Skal jeg bare prøve at sende 5000 mail til mig selv?

Skrevet ons. d. 25. november 2009 kl. 18:08:39| #1

Hvorfor tror du at du har en begrænsning? Og nej, at sende 5000 mails til sig selv er ikke løsningen.

Skrevet ons. d. 25. november 2009 kl. 18:15:29| #2

matfri
matfri (17.321 point)
Jeg har søgt og læst lidt på nettet, og som jeg kan forstå, så er der nogle som har problemer med at sende "mange" mails ad gangen.

Før jeg udbyder mit system, vil jeg jo gerne vide hvor mange mails det kan håndter. Jeg pt anvender PHPmailer med SMTP og en opensocket funktion. Jeg kan bare ikke vurdere om PHPmailer med SMTP kan håndter f.eks. 5000 mails?

Skrevet ons. d. 25. november 2009 kl. 18:44:42| #3

leif
leif (72.490 point)
Der er lidt delte meninger om hvordan man kan løse sådanne problemstillinger.

Jeg personligt gør det at når jeg har større jobs med fx. mange mails eller sms, så gemmer i en database at det skal sendes, så sender jeg dem og updatere min database så hvis mit script fejler ved jeg præcist hvem jeg allerede har sendt den pågældende mail eller sms til.

Skrevet ons. d. 25. november 2009 kl. 18:45:27| #4

leif
leif (72.490 point)
Og så anbefaler jeg ikke at man køre selve afsendelsen af mange mails eller smser via en browser men lader et script køre direkte på serveren til det.

Skrevet ons. d. 25. november 2009 kl. 19:07:06| #5

matfri
matfri (17.321 point)
@leif: jeg skal lige forstå dig rigtigt, når du skriver at jeg skal lade serveren håndtere sendingen, mener du så med cron jobs eller hvad?

Jeg har også tænkt mig at have en logfil, så jeg ved hvem den har sendt til hvis det hele fejler.

Skrevet ons. d. 25. november 2009 kl. 19:13:35| #6

Problematikken ligger ikke i en begrænsning - det er en teknisk udfordring at få sådan noget til at fungere hensigtsmæssigt korrekt.

Problemet med at køre et sådan script gennem browseren er risikoen for at forbindelsen afbrydes eller en connection timeout hvilket vil medføre at din udsendelse afbrydes. Det løses primært ved at lade serveren gennemføre udsendelsen. Det kan gøres på forskellige måder, men den mest almindelige er dog et cronjob. Her skal der igen lægges vægt på at de selvsamme problemer som nævnt tidligere også vil være et problem når du bruger eksterne tjenester som cronjob.de til at udføre disse.

Du skal også overveje hvordan dit script som udsender disse mails skal agere. Det er vigtigt at håndtere fejl og reagere ud fra disse end at reagere på fejlene.

En typisk ting som de fleste udviklere - af uransagelige årsager - smider i deres scripts er linier som disse:


<?php
  $sql = "SELECT * FROM table";
  $res = mysql_query($sql) or die(mysql_error());
?>



Scriptet vil herefter blot dø og du kan ikke komme videre. Det er oftest ikke ønskeligt.

En bedre løsning:


<?php
  $sql = "SELECT * FROM table";
  $res = mysql_query($sql);

  if(!$res)
    file_put_contents("error.log", "MySQL fejlede i ".__FILE__." på linie ".__LINE__.": ".mysql_error()."\n", FILE_APPEND);

?>



På den måde har du registreret fejlen og kan yderligere enten fortsætte med scriptet eller stoppe det - f.eks hvis resten af scriptet er afhængig af at denne forespørgsel gik godt.

Vigtigst af alt er KISS princippet ( http://en.wikipedia.org/ (...) ). Jo mere kompliceret du gør ting som disse, jo større risiko er der for fejl.
Jeg har set adskillige eksempler på scripts til at sende mails og sms'er ud, hvor der - for hver enkelt mail eller sms der blev afsendt - blev en eller flere MySQL forespørgsler. Det vil i princippet sige at du - med en database på 5000 modtagere - har 5000 muligheder for at MySQL fejler (intet svar, ugyldige tegn eller den bare hænger). Start med at hente alle nødvendige oplysninger frem, klargør det der skal sendes og hvis alt er klart, så send det.

Håber du fik lidt at arbejde ud fra.

Skrevet ons. d. 25. november 2009 kl. 20:36:10| #7

matfri
matfri (17.321 point)
Kanon indlæg.

Ang. fejl/løsning af fejl under sendingen, havde jeg også tænkt på flere løsninger således at jeg var sikker på at alle modtog mailen.

Det jeg mangler at få bekræftet/afkræftet er om det er en god idé at bruge PHPmailer til at udsende disse mails, eller det ikke kan håndter det? Selvfølgelig under forudsætning af at der ikke opstår fejl i kommunikationen mellem siden og databasen.

Skrevet ons. d. 25. november 2009 kl. 20:50:14| #8

PHPMailer er udmærket til formålet - igen, det handler om at optimere og simplificere.

Nu ved jeg ikke hvordan du har planlagt at administrere listen over modtagere, men du skal gøre det som sparer den enkelte udsendelse flest ressourcer.
Du kunne eventuelt fortælle om dine tænkte løsninger, så man kan kommentere på dem?

Skrevet ons. d. 25. november 2009 kl. 21:01:12| #9

matfri
matfri (17.321 point)
Jeg har fundet et eksempel i PHPmailer, hvor der udsendes en mail pr. bruger i databasen, altså:

åben smtp
while(mysql...){
sendmail(til, emne, indholder osv)
}
luk smtp

Dette vil jeg selv mene er en lidt skidt løsning, da den sender en mail af gangen.

Alternativt vil jeg sende 50-200 mails ad gangen, vil at tilføje adresserne til BCC, så kan jeg nøjes med at hente data ud af databasen "få" gange i håb om at undgå fejl. Derudover mener jeg selv at jeg aflaster serveren og lader smtp serveren overtage noget af arbejdet.

Har du eller nogen forslag?

Skrevet ons. d. 25. november 2009 kl. 21:09:41| #10

leif
leif (72.490 point)
matfri -> Det er jo afhængig af så mange ting om det er en dårlig idé at sende 1 stk. mail pr. connection.



Jeg har set en løsning hvor man lige netop sendte 1 mail af gangen for at have blandt andet en unik Return-Path for på den måde at automatisk håndtere fejl adresser.

Skrevet ons. d. 25. november 2009 kl. 21:12:11| #11

Dit argument for at det er en skidt idé giver ikke så meget mening for mig.
For mig er det ikke vigtigt om jeg 50 eller 200 eller 15.000 mails.
For mig er det vigtigt hvilke muligheder jeg har ud fra de udsendelser jeg laver.
Jeg har en mailudsendelse med 17300 modtagere som jeg sender ud hver fredag. Hver især får de en personlig mail, med personlige links til framelding af nyhedsbrev eller ændring af profiloplysninger.
De sendes naturligvis en ad gangen, for at gøre mailen personlig.
Det tager mig ca. et kvarter at sende dem allesammen.

Når min mailudsender ikke sender det retur jeg forventer, tilføjer mailadressen til en logfil der knytter sig til den udsendelse som jeg så kan gennemgå hvis alting ikke gik som forventet.

Skrevet ons. d. 25. november 2009 kl. 21:26:30| #12

matfri
matfri (17.321 point)
Er det via din browser du sender disse mails, eller ved hjælp af cron jobs? For hvis du sender dem via din browser, løber du så ikke ind i en timeout?

Skrevet ons. d. 25. november 2009 kl. 21:31:33| #13


Skrevet tor. d. 26. november 2009 kl. 11:41:40| #14

matfri
matfri (17.321 point)
@repox: Hvordan virker din mail sending så?
Fungerer det på den måde at når du har skrevet en mail og trykker send, så opretter du en "kø", hvor et cron job tjekker, lad os sige hvert kvarter, om der er noget indhold i køen? Eller hvordan har du struktureret det?

Skrevet tor. d. 26. november 2009 kl. 11:56:09| #15

Jeg har et cronjob, der hvert minut står og kontrollerer om der skal sendes et nyhedsbrev ud.
Hvis det er tilfældet henter jeg modtagerne ud i et array, opdaterer udsendelsen (så den ikke starter igen om et minut), looper igennem modtager-arrayet og sender en mail til hver enkelte modtager.
Hvis min mailfunktion ikke returnerer det forventede, gemmer jeg det i en logfil og går videre, så jeg kan analysere fejlene senere (om nødvendigt).
Køen ligger som sådan allerede i din SMTP server, du skal bare sørge for at skubbe dem ud i køen...

Skrevet tor. d. 26. november 2009 kl. 12:10:19| #16

matfri
matfri (17.321 point)
Så begynder vi at bevæge os ud på et plan hvor jeg ikke har så meget erfaring:)

Jeg er helt med på hvordan du hiver data ud af databasen og ind i et array. Men hvordan juster du dit cronjob til ikke at starte igen?

Det sidste du skriver med at "køen ligger som sådan allerede i din SMTP server.." der ved jeg ikke helt hvad du mener???

Jeg ville nok lave en tabel i databasen, som så indeholder køen, og cronjobbet tjekker så om der noget i tabellen(altså om der er en kø).

Skrevet tor. d. 26. november 2009 kl. 12:30:43| #17

Mit cronjob gør ikke andet end at starte hvert minut.

Koden i cronjobbet sørger så for at kontrollere om der er noget at sende ud og sørger for at næste cronjob ikke henter den igen.

Et forsimplet eksempel på hvad kan ske i den forbindelse:


<?php

  $sql = "SELECT sendId FROM mailSends WHERE sActive='true'";
  $res = mysql_query($sql);
  if(mysql_num_rows($res) == 0)
    exit; // der er ikke noget at sende ud

  $sends = array();

  while($row = mysql_fetch_assoc($res))
    $sends[] = $row["sendId"];

  // I denne foreach() sikrer vi os at næste cronjob
  // ikke starter en allerede aktiv udsendelse.
  foreach($sends as $sendId)
  {
    $sql = "UPDATE mailSends SET sActive='false' WHERE sendId=".$sendId." LIMIT 1";
    mysql_query($sql);
  }

  /**
  * Herefter hentes modtagere og mails sendes
  * ud til de mennesker som skal modtage dem.
  */


?>



SMTP serveren har  i forvejen en indbygget kø, til de mails der skal sendes ud. Dvs at den selv sørger for at sætte de 5000 mails du sender til den i kø og skubbe dem ud. Du skal bare sørge for at give SMTP serveren dine mails.

Skrevet tor. d. 26. november 2009 kl. 12:45:23| #18

matfri
matfri (17.321 point)
Super så kan jeg forstå det.  Så fungerer det jo på næsten samme måde som jeg havde udtænkt at det skulle virke...

Men hvis det er som du siger, at du kan udsende 17.000 mails "på en gang" så burde det nok også kunne udsende mine sølle 5000;)

Tak for hjælpen repox. Vil du ikke lige svare på tråden?

Skrevet tor. d. 26. november 2009 kl. 13:10:48| #19


Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

php problem få en kode fra en anden side

Oprettet den 11. februar 2012 kl. 23.53
jesperkaae95 giver 30 point for svar | Giv et svar »

Udtræk af enkelte felter fra bestemte kolonner i mysql

Oprettet den 11. februar 2012 kl. 19.27
hrole giver 30 point for svar | Giv et svar »

Procentregning

Oprettet den 11. februar 2012 kl. 11.26
sevinding giver 60 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Her er fem sjove danske websider du skal kende

Trænger dine lattermuskler til en omgang fitness på dansk? Vi viser vej til fem websider fyldt med humor og vanvittig satire.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Nu kan du snart hente Windows 8

Den nye offentlige betaversion af Windows 8 er klar i denne måned.


Nyheder fra Computerworld

Teaser billede

Måske snart slut med Androids helt store problem

Android-platformen har længe været plaget af et særligt problem. Men måske er problemet nu ved at være elimineret.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger