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
9 svar · 328 visningar · startad av Ankman
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
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
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.
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. ;)
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.
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
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?
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). ;)
:bire
Tack för tipsen. Skall kolla dokumentationen till Dundas Mailer ang. kö.
Happy to help :bire