Avatar billede mvk Nybegynder
03. december 2004 - 08:58 Der 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

  on error resume next
  Do While Not rsEmails.EOF

  strEmail = (rsEmails.Fields.Item("Email").Value)
  strNavn  = (rsEmails.Fields.Item("Fornavn").Value)
 
  Set JMail              = Server.CreateObject("JMail.SMTPMail")
  JMail.ServerAddress     = "websmtp.border-wines.dk;websmtp.border-wines.dk;mailrelay.andersenit.dk"
  JMail.Sender            = "admin@border-wines.dk"
  JMail.SenderName          = "Border Shop"
  JMail.ContentType      = "text/html"
  JMail.Subject          = Overskrift
  JMail.AddRecipientBCC    strEmail
  JMail.Priority          = 3
  JMail.AddHeader      "Originating-IP", Request.ServerVariables("REMOTE_ADDR")
  Jmail.Body              = replace(Tekst, "ModtagerensNavn", strNavn)
 
  ' 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
%>
Avatar billede ldanielsen Nybegynder
03. december 2004 - 09:21 #1
Først og fremmest: Fjern den der "on error resume next". Hvis der er en fejl kan man jo ikke se det.

Dernæst kan jeg se at siden ikke bliver sendt til browseren, for du laver en Response.Redirect. Det du skal gøre er at sige:

<body onLoad="t = window.setTimeout('newscript_nyhedsbrev.asp?Antal=<%=Antal%>';">

eller noget i den stil
Avatar billede ldanielsen Nybegynder
03. december 2004 - 09:24 #2
Sorry:
<script language=Javascript>
function myOnLoad(){
  t = window.setTimeout("window.location = 'newscript_nyhedsbrev.asp?Antal=<%=Antal%>', 1000);
  }

</script>

og:
<body onLoad="myOnLoad();">

Så vil siden blive stående i 1 sek før den går videre
Avatar billede mvk Nybegynder
03. december 2004 - 09:26 #3
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.

hvad gør den der onload setTimeout ?
Avatar billede mvk Nybegynder
03. december 2004 - 09:27 #4
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...
Avatar billede mvk Nybegynder
03. december 2004 - 09:29 #5
+ jeg er ikke sikker på at mine 2 loops er rigtige ?

Do While cint(Antal) <= cint(AntalMailAdresser)
Do While Taeller <= 2

her prøver jeg bare at sætte den til at skulle reloade siden efter at have sendt 2 mails
Avatar billede ldanielsen Nybegynder
03. december 2004 - 09:45 #6
Jeg ville gøre sådan:

'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);
  }

</script>

og:
<body onLoad="myOnLoad();">
Avatar billede ldanielsen Nybegynder
03. december 2004 - 09:46 #7
Dette er jo kun uddrag, men jeg håber at du kan se fidusen?

Der bliver kun et loop, og du skal kun åbne et recordset.
Avatar billede mvk Nybegynder
03. december 2004 - 11:07 #8
så kommer scriptet til at se 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 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

  strEmail = (rsEmails.Fields.Item("Email").Value)
  strNavn  = (rsEmails.Fields.Item("Fornavn").Value)
 
  Set JMail              = Server.CreateObject("JMail.SMTPMail")
  JMail.ServerAddress     = "websmtp.border-wines.dk;websmtp.border-wines.dk;mailrelay.andersenit.dk"
  JMail.Sender            = "admin@border-wines.dk"
  JMail.SenderName          = "Border Shop"
  JMail.ContentType      = "text/html"
  JMail.Subject          = Overskrift
  JMail.AddRecipientBCC    strEmail
  JMail.Priority          = 3
  JMail.AddHeader      "Originating-IP", Request.ServerVariables("REMOTE_ADDR")
  Jmail.Body              = replace(Tekst, "ModtagerensNavn", strNavn)
 
  ' 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>
Avatar billede mvk Nybegynder
03. december 2004 - 11:20 #9
Avatar billede mvk Nybegynder
03. december 2004 - 11:41 #10
har lige fjernet et loop og tester igen
Avatar billede mvk Nybegynder
03. december 2004 - 12:10 #11
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

  strEmail = (rsEmails.Fields.Item("Email").Value)
  strNavn  = (rsEmails.Fields.Item("Fornavn").Value)
 
  Set JMail              = Server.CreateObject("JMail.SMTPMail")
  JMail.ServerAddress     = "websmtp.border-wines.dk;websmtp.border-wines.dk;mailrelay.andersenit.dk"
  JMail.Sender            = "admin@border-wines.dk"
  JMail.SenderName          = "Border Shop"
  JMail.ContentType      = "text/html"
  JMail.Subject          = Overskrift
  JMail.AddRecipientBCC    strEmail
  JMail.Priority          = 3
  JMail.AddHeader      "Originating-IP", Request.ServerVariables("REMOTE_ADDR")
  Jmail.Body              = replace(Tekst, "ModtagerensNavn", strNavn)
 
  ' 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>
Avatar billede ldanielsen Nybegynder
03. december 2004 - 12:20 #12
Der står stadig Response.Redirect, drop det
Avatar billede and_ Nybegynder
03. december 2004 - 13:00 #13
<%@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

else

'  on error resume next
  Do While Not rsEmails.EOF

      strEmail = (rsEmails.Fields.Item("Email").Value)
      strNavn  = (rsEmails.Fields.Item("Fornavn").Value)
      Set JMail              = Server.CreateObject("JMail.SMTPMail")
      JMail.ServerAddress     = "websmtp.border-wines.dk;websmtp.border-wines.dk;mailrelay.andersenit.dk"
      JMail.Sender            = "admin@border-wines.dk"
      JMail.SenderName          = "Border Shop"
      JMail.ContentType      = "text/html"
      JMail.Subject          = Overskrift
      JMail.AddRecipientBCC    strEmail
      JMail.Priority          = 3
      JMail.AddHeader      "Originating-IP", Request.ServerVariables("REMOTE_ADDR")
      Jmail.Body              = replace(Tekst, "ModtagerensNavn", strNavn)
      JMail.Execute
      Set JMail = Nothing

      ' 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
%>
Avatar billede ldanielsen Nybegynder
03. december 2004 - 13:15 #14
Hvilken database er det?
Avatar billede mvk Nybegynder
03. december 2004 - 13:19 #15
det spiller - TUSINDE TAK and
Avatar billede mvk Nybegynder
03. december 2004 - 13:20 #16
jeg smider gerne 15 point din vej ldanielsen - sig til så opretter jeg nyt ?
Avatar billede and_ Nybegynder
03. december 2004 - 13:21 #17
takker for point, men er 150 ikke lige i overkanten....?
Avatar billede ldanielsen Nybegynder
03. december 2004 - 14:15 #18
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.
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
Kurser inden for grundlæggende programmering

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