Avatar billede matfri Nybegynder
25. november 2009 - 16:21 Der er 18 kommentarer og
1 løsning

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?
Avatar billede repox Seniormester
25. november 2009 - 18:08 #1
Hvorfor tror du at du har en begrænsning? Og nej, at sende 5000 mails til sig selv er ikke løsningen.
Avatar billede matfri Nybegynder
25. november 2009 - 18:15 #2
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?
Avatar billede leif Seniormester
25. november 2009 - 18:44 #3
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.
Avatar billede leif Seniormester
25. november 2009 - 18:45 #4
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.
Avatar billede matfri Nybegynder
25. november 2009 - 19:07 #5
@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.
Avatar billede repox Seniormester
25. november 2009 - 19:13 #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/wiki/KISS_principle ). 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.
Avatar billede matfri Nybegynder
25. november 2009 - 20:36 #7
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.
Avatar billede repox Seniormester
25. november 2009 - 20:50 #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?
Avatar billede matfri Nybegynder
25. november 2009 - 21:01 #9
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?
Avatar billede leif Seniormester
25. november 2009 - 21:09 #10
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.
Avatar billede repox Seniormester
25. november 2009 - 21:12 #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.
Avatar billede matfri Nybegynder
25. november 2009 - 21:26 #12
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?
Avatar billede repox Seniormester
25. november 2009 - 21:31 #13
Det er via cronjobs.
Avatar billede matfri Nybegynder
26. november 2009 - 11:41 #14
@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?
Avatar billede repox Seniormester
26. november 2009 - 11:56 #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...
Avatar billede matfri Nybegynder
26. november 2009 - 12:10 #16
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ø).
Avatar billede repox Seniormester
26. november 2009 - 12:30 #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.
Avatar billede matfri Nybegynder
26. november 2009 - 12:45 #18
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?
Avatar billede repox Seniormester
26. november 2009 - 13:10 #19
Det gik du 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