03. december 2004 - 08:58Der er
17 kommentarer og 1 løsning
Kan Loop laves på anden måde
jeg har en tæller som jeg forsøger at få til at sende 2 mails af gangen og derefter reloade siden og fortsætte med de næste 2 mails indtil alle mails er sendt - men det virker ikke - pls help me...
jeg tror det er de der loops der er noget galt med, men jeg kan ikke se hvordan det kan laves smartere.
<%@LANGUAGE="VBSCRIPT"%> <%Server.Scripttimeout=3600%> <!--#include file="../../Connections/scandlines.asp" --> <% Dim rsNyhedsbrev Dim rsNyhedsbrev_numRows Set rsNyhedsbrev = Server.CreateObject("ADODB.Recordset") rsNyhedsbrev.ActiveConnection = MM_scandlines_STRING rsNyhedsbrev.Source = "SELECT * FROM BorderShopNyhedsbrev ORDER BY IDnyhedsbreve DESC" rsNyhedsbrev.CursorType = 0 rsNyhedsbrev.CursorLocation = 2 rsNyhedsbrev.LockType = 1 rsNyhedsbrev.Open() rsNyhedsbrev_numRows = 0
Overskrift = (rsNyhedsbrev.Fields.Item("Overskrift").Value) Tekst = (rsNyhedsbrev.Fields.Item("Tekst").Value)
Dim rsEmails Dim rsEmails_numRows Set rsEmails = Server.CreateObject("ADODB.Recordset") rsEmails.ActiveConnection = MM_scandlines_STRING rsEmails.Source = "SELECT * FROM test" rsEmails.CursorType = 0 rsEmails.CursorLocation = 2 rsEmails.LockType = 1 rsEmails.Open() rsEmails_numRows = 0
Dim rsAntalModtagere Dim rsAntalModtagere_numRows Set rsAntalModtagere = Server.CreateObject("ADODB.Recordset") rsAntalModtagere.ActiveConnection = MM_scandlines_STRING rsAntalModtagere.Source = "SELECT Count(*) AS AntalMails FROM test" rsAntalModtagere.CursorType = 0 rsAntalModtagere.CursorLocation = 2 rsAntalModtagere.LockType = 1 rsAntalModtagere.Open() rsAntalModtagere_numRows = 0
' Denne tæller har en total på det antal modtagere der er i databasen AntalMailAdresser = (rsAntalModtagere.Fields.Item("AntalMails").Value) ' Sætter Taeller til 0 Taeller = 0 ' Henter Antal fra QueryString Antal = Request.QueryString("Antal")
' Kode efter Obi-Duck Do While cint(Antal) <= cint(AntalMailAdresser) Do While Taeller <= 2
' Denne kode er med så man hele tiden kan følge med i hvor langt den er kommet i forhold til modtagerne Response.write "E-mail sendt til " & strEmail & " " & strNavn & "<br>"
' Tællerne skal tælle op Taeller = Taeller + 1 Antal = Antal + 1
JMail.Execute Set JMail = Nothing rsEmails.MoveNext Loop Loop
' Når Do While Taeller <= 10 ikke længere er opfyldt skal den: Response.Redirect("newscript_nyhedsbrev.asp?Antal=" & Antal) Loop
'Når du har sendt til alle modtagerne skal du gå til denne fil 'If rsEmails.EOF Then Response.Redirect("oversigt_nyhedsbrev.asp") %> <html> <head> <title>Test</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> Loading bar: <img src="../../images/admin/precent.gif" width="<%=AntalMailAdresser%>/<%=Request.QueryString("Antal")%>*100" height="10" border="1"> <br> Antal modtagere: <%=AntalMailAdresser%> <br> Hvor langt scriptet er kommet: <%=Request.QueryString("Antal")%> </body> </html> <% rsEmails.close Set rsEmails = Nothing
rsNyhedsbrev.Close() Set rsNyhedsbrev = Nothing
rsAntalModtagere.Close() Set rsAntalModtagere = Nothing %>
okay - den der "on error resume next" er sat ind hvis en af modtagerne har angivet en forkert email - så springer den den bare over og fortsætter fra den næste email.
burde jeg ikke kunne lave en funktion der automatisk sender den videre til sammen side når den har sendt X antal emails ? eksempel: send 10 mails og reload derefter siden og send mails 11-20 og reload igen...
'finde ud at hvor den nåede til: dim LastID LastID = Request.Querystring("LastID") if LastID = "" then LastID = 0
'og senere, åbne de to første, hvor IDnyhedsbreve > LastID:
rsNyhedsbrev.Source = "SELECT top 2 * FROM BorderShopNyhedsbrev WHERE IDnyhedsbreve > " & LastID & " ORDER BY IDnyhedsbreve ASC"
'Så bliver loopet sådan if rsNyhedsbrev.BOF then Response.Write ("Slut") 'Her skal du lukke databaseforbindelsen osv. Response.End else do while not rsNyhedsbrev.EOF 'send mail til kunden her
LastID = rsNyhedsbrev("IDnyhedsbreve") rsNyhedsbrev.Movenext loop end if
og endelig kører du videre:
<script language=Javascript> function myOnLoad(){ t = window.setTimeout("window.location = 'newscript_nyhedsbrev.asp?LastID=<%=LastID%>', 1000); }
<%@LANGUAGE="VBSCRIPT"%> <%Server.Scripttimeout=3600%> <!--#include file="../../Connections/scandlines.asp" --> <% 'finde ud at hvor den nåede til: dim LastID LastID = Request.Querystring("LastID") if LastID = "" then LastID = 0
Dim rsNyhedsbrev Dim rsNyhedsbrev_numRows Set rsNyhedsbrev = Server.CreateObject("ADODB.Recordset") rsNyhedsbrev.ActiveConnection = MM_scandlines_STRING rsNyhedsbrev.Source = "SELECT * FROM BorderShopNyhedsbrev ORDER BY IDnyhedsbreve DESC" rsNyhedsbrev.CursorType = 0 rsNyhedsbrev.CursorLocation = 2 rsNyhedsbrev.LockType = 1 rsNyhedsbrev.Open() rsNyhedsbrev_numRows = 0
Overskrift = (rsNyhedsbrev.Fields.Item("Overskrift").Value) Tekst = (rsNyhedsbrev.Fields.Item("Tekst").Value)
Dim rsEmails Dim rsEmails_numRows Set rsEmails = Server.CreateObject("ADODB.Recordset") rsEmails.ActiveConnection = MM_scandlines_STRING rsEmails.Source = "SELECT top 2 * FROM test WHERE IDbordershop > " & LastID & " ORDER BY IDbordershop ASC" rsEmails.CursorType = 0 rsEmails.CursorLocation = 2 rsEmails.LockType = 1 rsEmails.Open() rsEmails_numRows = 0
Dim rsAntalModtagere Dim rsAntalModtagere_numRows Set rsAntalModtagere = Server.CreateObject("ADODB.Recordset") rsAntalModtagere.ActiveConnection = MM_scandlines_STRING rsAntalModtagere.Source = "SELECT Count(*) AS AntalMails FROM test" rsAntalModtagere.CursorType = 0 rsAntalModtagere.CursorLocation = 2 rsAntalModtagere.LockType = 1 rsAntalModtagere.Open() rsAntalModtagere_numRows = 0
' Denne tæller har en total på det antal modtagere der er i databasen AntalMailAdresser = (rsAntalModtagere.Fields.Item("AntalMails").Value) ' Sætter Taeller til 0 Taeller = 0
'Så bliver loopet sådan if rsNyhedsbrev.BOF then Response.Write ("Slut") 'Her skal du lukke databaseforbindelsen osv.
rsEmails.close Set rsEmails = Nothing
rsNyhedsbrev.Close() Set rsNyhedsbrev = Nothing
rsAntalModtagere.Close() Set rsAntalModtagere = Nothing
Response.End else ' on error resume next do while not rsEmails.EOF 'send mail til kunden her
' Denne kode er med så man hele tiden kan følge med i hvor langt den er kommet i forhold til modtagerne Response.write "E-mail sendt til " & strEmail & " " & strNavn & "<br>"
' Tællerne skal tælle op Taeller = Taeller + 1 LastID = LastID + 1
JMail.Execute Set JMail = Nothing
LastID = rsEmails("IDbordershop") rsNyhedsbrev.Movenext loop end if
' Når Do While Taeller <= 10 ikke længere er opfyldt skal den: Response.Redirect("newscript_nyhedsbrev.asp?LastID=" & LastID) Loop
'Når du har sendt til alle modtagerne skal du gå til denne fil 'If rsEmails.EOF Then Response.Redirect("oversigt_nyhedsbrev.asp") %> <html> <head> <title>Test</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> Loading bar: <img src="../../images/admin/precent.gif" width="<%=AntalMailAdresser%>/<%=Request.QueryString("LastID")%>*100" height="10" border="1"> <br> Antal modtagere: <%=AntalMailAdresser%> <br> Hvor langt scriptet er kommet: <%=Request.QueryString("LastID")%> </body> </html>
prøv og check linket - men der meget lang tid om at loade siden. det højeste IDbordershop er 12
koden ser nu sådan ud: <%@LANGUAGE="VBSCRIPT"%> <%Server.Scripttimeout=3600%> <!--#include file="../../Connections/scandlines.asp" --> <% 'finde ud at hvor den nåede til: dim LastID LastID = Request.Querystring("LastID") if LastID = "" then LastID = 0
Dim rsNyhedsbrev Dim rsNyhedsbrev_numRows Set rsNyhedsbrev = Server.CreateObject("ADODB.Recordset") rsNyhedsbrev.ActiveConnection = MM_scandlines_STRING rsNyhedsbrev.Source = "SELECT * FROM BorderShopNyhedsbrev ORDER BY IDnyhedsbreve DESC" rsNyhedsbrev.CursorType = 0 rsNyhedsbrev.CursorLocation = 2 rsNyhedsbrev.LockType = 1 rsNyhedsbrev.Open() rsNyhedsbrev_numRows = 0
Overskrift = (rsNyhedsbrev.Fields.Item("Overskrift").Value) Tekst = (rsNyhedsbrev.Fields.Item("Tekst").Value)
Dim rsEmails Dim rsEmails_numRows Set rsEmails = Server.CreateObject("ADODB.Recordset") rsEmails.ActiveConnection = MM_scandlines_STRING rsEmails.Source = "SELECT * FROM test WHERE IDbordershop > " & LastID & " ORDER BY IDbordershop ASC LIMIT 0, 2" rsEmails.CursorType = 0 rsEmails.CursorLocation = 2 rsEmails.LockType = 1 rsEmails.Open() rsEmails_numRows = 0
Dim rsAntalModtagere Dim rsAntalModtagere_numRows Set rsAntalModtagere = Server.CreateObject("ADODB.Recordset") rsAntalModtagere.ActiveConnection = MM_scandlines_STRING rsAntalModtagere.Source = "SELECT Count(*) AS AntalMails FROM test" rsAntalModtagere.CursorType = 0 rsAntalModtagere.CursorLocation = 2 rsAntalModtagere.LockType = 1 rsAntalModtagere.Open() rsAntalModtagere_numRows = 0
' Denne tæller har en total på det antal modtagere der er i databasen AntalMailAdresser = (rsAntalModtagere.Fields.Item("AntalMails").Value)
'Så bliver loopet sådan if rsNyhedsbrev.BOF then Response.Write ("Slut") 'Her skal du lukke databaseforbindelsen osv. rsEmails.close Set rsEmails = Nothing
rsNyhedsbrev.Close() Set rsNyhedsbrev = Nothing
rsAntalModtagere.Close() Set rsAntalModtagere = Nothing
Response.End else ' on error resume next Do While Not rsEmails.EOF 'send mail til kunden her
' Denne kode er med så man hele tiden kan følge med i hvor langt den er kommet i forhold til modtagerne Response.write "E-mail sendt til " & strEmail & " " & strNavn & "<br>"
JMail.Execute Set JMail = Nothing
LastID = rsEmails("IDbordershop") rsEmails.Movenext Loop End if
' Når Do While Taeller <= 10 ikke længere er opfyldt skal den: Response.Redirect("newscript_nyhedsbrev.asp?LastID=" & LastID)
'Når du har sendt til alle modtagerne skal du gå til denne fil 'If rsEmails.EOF Then Response.Redirect("oversigt_nyhedsbrev.asp") %> <html> <head> <title>Test</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> Loading bar: <img src="../../images/admin/precent.gif" width="<%=AntalMailAdresser%>/<%=Request.QueryString("LastID")%>*100" height="10" border="1"> <br> Antal modtagere: <%=AntalMailAdresser%> <br> Hvor langt scriptet er kommet: <%=Request.QueryString("LastID")%> </body> </html>
<%@LANGUAGE="VBSCRIPT"%> <%Server.Scripttimeout=3600%> <!--#include file="../../Connections/scandlines.asp" --> <% 'finde ud at hvor den nåede til: dim LastID LastID = Request.Querystring("LastID") if LastID = "" then LastID = 0 response.buffer = true
Dim rsNyhedsbrev Dim rsNyhedsbrev_numRows Set rsNyhedsbrev = Server.CreateObject("ADODB.Recordset") rsNyhedsbrev.ActiveConnection = MM_scandlines_STRING rsNyhedsbrev.Source = "SELECT * FROM BorderShopNyhedsbrev ORDER BY IDnyhedsbreve DESC" rsNyhedsbrev.CursorType = 0 rsNyhedsbrev.CursorLocation = 2 rsNyhedsbrev.LockType = 1 rsNyhedsbrev.Open() rsNyhedsbrev_numRows = 0
Overskrift = (rsNyhedsbrev.Fields.Item("Overskrift").Value) Tekst = (rsNyhedsbrev.Fields.Item("Tekst").Value)
Dim rsEmails Dim rsEmails_numRows Set rsEmails = Server.CreateObject("ADODB.Recordset") rsEmails.ActiveConnection = MM_scandlines_STRING rsEmails.Source = "SELECT * FROM test WHERE IDbordershop > " & LastID & " ORDER BY IDbordershop ASC LIMIT 0, 2" rsEmails.CursorType = 0 rsEmails.CursorLocation = 2 rsEmails.LockType = 1 rsEmails.Open() rsEmails_numRows = 0
Dim rsAntalModtagere Dim rsAntalModtagere_numRows Set rsAntalModtagere = Server.CreateObject("ADODB.Recordset") rsAntalModtagere.ActiveConnection = MM_scandlines_STRING rsAntalModtagere.Source = "SELECT Count(*) AS AntalMails FROM test" rsAntalModtagere.CursorType = 0 rsAntalModtagere.CursorLocation = 2 rsAntalModtagere.LockType = 1 rsAntalModtagere.Open() rsAntalModtagere_numRows = 0
' Denne tæller har en total på det antal modtagere der er i databasen AntalMailAdresser = (rsAntalModtagere.Fields.Item("AntalMails").Value)
'Så bliver loopet sådan if (rsEmails.BOF or rsEmails.EOF) then
Response.Write ("Slut") rsEmails.close Set rsEmails = Nothing
rsNyhedsbrev.Close() Set rsNyhedsbrev = Nothing
rsAntalModtagere.Close() Set rsAntalModtagere = Nothing Response.End
' Denne kode er med så man hele tiden kan følge med i hvor langt den er kommet i forhold til modtagerne Response.write "E-mail sendt til " & strEmail & " " & strNavn & "<br>" LastID = rsEmails("IDbordershop")
rsEmails.Movenext Loop
' Når Do While Taeller <= 10 ikke længere er opfyldt skal den: Response.Redirect("newscript_nyhedsbrev.asp?LastID=" & LastID) End if %>
Næ, pyt med det, det lykkedes jo heller ikke rigtigt.
Men du siger at det spiller, men du kan da ikke "... hele tiden kan følge med i hvor langt den er kommet i forhold til ..."
Jeg er lidt i tvivl om hvad der sker hvis du skal sende mange tusinde mails. Jeg har selv lavet en løsning der ligner din, hvor jeg sender 10 eller 20 ad gangen, og så har mulighed for at lægge en pause ind inden jeg fortsætter (derfor windows.setTimeout), for ellers kan man godt lægge serveren end med det.
Synes godt om
Ny brugerNybegynder
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.