webForumDet fria alternativet

Har jag tänkt rätt? (Mailinglista)

ASP

9 svar · 328 visningar · startad av Ankman

Medlem sedan juni 2002116 inlägg
Frågan#1

Håller på att göra en mailinglista och har tänkt skicka 50 mail i taget så att det inte blir timeout på scriptet om det är många adresser i databasen. Har ingen möjlighet att testa med många adresser och vore därför tacksam för synpunkter på koden. Kommer detta att funka?

Set objMailer = Server.CreateObject("Dundas.Mailer")
objMailer.TOs.Add "newsletter@domän.se"
objMailer.FromAddress = "info@domän.se"
objMailer.FromName = "Newsletter"
objMailer.Subject = Request.Form("subject")
objMailer.Body = Request.Form("body")
Set rs = getRs("SELECT email FROM email_newsletter")
Dim i 
i = 0
Do While Not rs.EOF

   Do While i < 50
      objMailer.BCCs.Add rs("email")
      rs.MoveNext
      i = i + 1
      If rs.EOF Then Exit Do
   Loop
   
   objMailer.SendMail
   i = 0
Loop
Medlem sedan dec. 19998 577 inlägg
#2

Du måste på något sätt markera att du skickat till en viss adress också om du skall skicka i flera omgångar, lägg till ett fält (eller en korstabell) som inhåller olika värden beroende på om man skickat till adressen eller inte.

Mvh, Vide

Medlem sedan juni 2002116 inlägg
#3

Vide skrev:

Du måste på något sätt markera att du skickat till en viss adress också om du skall skicka i flera omgångar, lägg till ett fält (eller en korstabell) som inhåller olika värden beroende på om man skickat till adressen eller inte.

Mvh, Vide

Förstår inte riktigt hur du menar (flera omgångar?).
Tanken är att den lägger till de 50 första adresserna i objMail.BCCs och skickar mailet. Sedan nollställs räknaren och lägger till nästa 50 poster från där den slutade i förra varvet tills rs.EOF.

En tanke: måste jag tömma objMail.BCCs mellan varven i loopen eller töms den iom .SendMail? Skall kolla dokumentationen.

Medlem sedan dec. 19998 577 inlägg
#4

Exakt, när du gå in i den andra omgången (som din kod ser ut nu så måste du köra samma kod igen) så måste du ju på något sätt vet vilka du redan skickat till så att du inte skickar till dom igen. ;)

Medlem sedan juni 2002116 inlägg
#5

Jag förstår vad du menar men jag tror att jag har rätt ändå. ;)
När jag har loopat in de första 50 posterna i mailobjektet så skickas mailet till dessa 50 mottagare. RecSet-pekaren (kan man säga så?) står nu på post 49. När loopen fortsätter med nästa 50 mottagare så loopas det från post 50 till 99 i Recsetet. Jag gör ju ingen rs.MoveFirst.

Är jag ute och cyklar?

Edit/ Läste ditt inlägg igen. Menar du att loopen i detta utförande inte loopar igenom hela recsetet? Meningen är ju att det skall skickas till alla adresser i tabellen i omgångar om 50.

Medlem sedan dec. 19998 577 inlägg
#6

Jo, ditt script gör precis som du säger. :)

Missförstod dig lite i början, men:

Men min erfarenhet säger att man ändå bör göra en kontroll av om mailet har skickats till ju den unika emailadressen när man skickar. Anledningen är att problem kan uppstå i utskickssammanhang, och om inte hela scriptet körs (om du får scripttimeout i loopen t.ex) så kommer ju vissa adresser inte heller att ha fått sitt mail, därav måste du skicka igen, och har du inte satt ett värde om du har skickat eller inte så är du illa ute, och måste antingen skicka till alla igen, eller skita i det.

Jag har råkat ut för detta, därav vill jag dela med mig av min erfarenhet. ;)

Mvh, Vide

Medlem sedan juni 2002116 inlägg
#7

Vide skrev:

Jag har råkat ut för detta, därav vill jag dela med mig av min erfarenhet. ;)

Tackar ödmjukast.

Hur bör jag då göra detta? Skall jag på varje varv i den "yttre" loopen göra en update i en temptabell med den senaste adressen och sedan börja nästa varv på det stället?

Har du några andra tips angående en mailfunktion som denna? Har haft tankar på att skicka varje mail för sig (dvs med adressaten i to-fältet, inte som nu en massa BCCs) men jag misstänker att det tar rätt mycket prestanda av servern, blir lätt timeout etc. Finns det något bra sätt?

Medlem sedan dec. 19998 577 inlägg
#8

Det absolut säkraste är nog att skicka det ett och ett, och uppdatera så fort du skickat ett mail. Detta medför en längre tid som scriptet körs. Nu vet jag inte hur Dundas komponent fungerar, men i dom flesta seriösa mailkomponenterna har du ett program för att köa mail, du skickar alltså mailen till kösystemet och ASP-sidan slipper att vänta på att varje mail skall skickas iväg fören den försöker sig på nästa.

Men om du i ditt fall inte vill ändra så mycket så är det nog bara att höja server.scripttimeout till någon hög siffra (beroende på hur många mail du skall skicka). Sedan gör du som du säger att du uppdaterar de poster som påverkats när du kommit ut till den yttre loopen efter du skickat mailet.

Men som sagt, det bästa är om du kan använda ett kösystem (que). ;)

Medlem sedan juni 2002116 inlägg
#9

:bire
Tack för tipsen. Skall kolla dokumentationen till Dundas Mailer ang. kö.

Medlem sedan dec. 19998 577 inlägg
#10

Happy to help :bire

260 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)