Avatar billede riishoj Nybegynder
14. december 2005 - 19:22 Der er 20 kommentarer og
2 løsninger

Response.Redirect efter afvikling af JMail script

Nedenstående script skal bruges til udsendelse af et ugebrev. Meningen er, at scriptet skal afvikles på en lokal server på et givet tidspunkt én gang om ugen. Problemet er, at jeg gerne på min egen pc vil kunne se, at scriptet er afviklet og at der er sendt til alle mailadresserne, ganske som response.write i bunden af scriptet gør, men hvis jeg åbner scriptet på min egen pc, så afvikles scriptet jo én gang til.
Jeg har forestillet mig, at man må kunne redirecte til en anden side et sted nede i scriptet, og på denne side få afviklet response.write, altså af meddelelsen er korrekt afsendt.
Jeg har prøvet forskellige ting, men uden den store succes

<!--#include virtual="/skoleweb/conn.asp"-->

    <%
   


    StrSQL = "Select * from mailliste"
set rs = Conn.execute(strSQL)

Dato1 = date()
minus = "7"


SQL = "SELECT tekst,startdato,id,meddeler FROM ugebrev WHERE startdato<=DATE() AND startdato>=DATE()-"&minus&" ORDER BY prioritet"

Set rs2 = Conn.Execute(SQL)

  ugenr = 1 + DatePart("ww",Now(),vbMonday,vbFirstFourDays)
    strBesked=replace(strBesked,vbcrlf,"<BR>")
   
    strBesked = strBesked & " <p><img border='0' src=http://ebberupskole.riishojwebsoft.dk/skoleweb/images/banner.jpg width='398' height='45'></p>"
    strBesked = strBesked & "<b><font face='verdana' size='6' color='#FF0000'>Ugebrevet&nbsp&nbsp</b>"
      strBesked = strBesked & "<font face='verdana' size='4' color='#000000'>Ebberup Skole</font> <font face='verdana' size='2' color='#000000'>"& date() &" <b>UGE "& ugenr &"</b></font> "
    strBesked = strBesked & " <hr> "
 
    Do While Not (rs2.Eof)
    tekst = rs2("tekst")
    tekst=Replace(tekst,"","<b>")
    tekst=Replace(tekst,"
","</b>")
   
    tekst=replace(tekst,"","<i>")
    tekst=replace(tekst,"
","</i>")
   
    tekst=replace(tekst,"","<u>")
    tekst=replace(tekst,"
","</u>")
   
    tekst=replace(tekst,"[oversk]","<font size='3'>")
  tekst=replace(tekst,"[/oversk]","</font>")
   
    tekst=replace(tekst,"[li]","<li>")
    tekst=replace(tekst,"[/li]","</li>")
   
    tekst=replace(tekst,vbcrlf,"<BR>")
   
    strBesked = strBesked & "<font face='verdana' size='2' color='#000000'>"
    strBesked = strBesked & " <br><b><u>" & rs2("meddeler") &"</b></u><br><br>"& tekst &" "
  strBesked = strBesked & " <br> "
  strBesked = strBesked & " <hr> "
    rs2.MoveNext
Loop

Do While Not (rs.Eof)
  Set JMail = Server.CreateObject("JMail.SMTPMail")
  JMail.ContentType = ""
  JMail.ServerAddress = "xxx.dk"
  JMail.Sender = "xxx@xxx.dk"
  JMail.Subject = "Ugebrev - UGE "& ugenr &" "
  JMail.Body = "Du skal understøtte html mails for at læse denne mail"
  JMail.HTMLBody = strbesked

  JMail.AddRecipientEx "" & rs("email") & "", "" & rs("email") & ""
  JMail.Execute
  Set JMail = Nothing
 
  response.write "" & rs("Email") & " - Afsendt korrekt<br>"
  rs.MoveNext
Loop

response.write "<br><br><b>Alle beskeder blev afsendt korrekt.</b>"

Conn.Close
%>
Avatar billede ossian Nybegynder
14. december 2005 - 22:44 #1
Hmm - jeg ville gemme tidspunkt og status på afsendelse i en database hver gang scriptet blev kørt.

Nu ved jeg ikke hvilken database du kører på, men dette burde virke med Access, dog er der lidt ændringer hvis det er mySQL i forhold til dato. Sig til hvis det er relevant.
-----------Opret en tabel i din database-----------
Tabelnavn: log_afsendelse
Felter: log_afsendelse_id(Primær nøgle og Autonummer), tidspunkt(tid/dato), resultat(text)

-----------Tilføjes til din kode før Conn.Close-----------
set opretResultat = Conn.Execute("INSERT INTO log_afsendelse (tidspunkt,resultat) VALUES (#" & now & "#,'OK')")
response.redirect "log_status.asp"

-----------Opret ny fil (log_status.asp)-----------

<!--#include virtual="/skoleweb/conn.asp"-->
<html>
<body>
Tidspunkt | Resultat
<%
set visResultater = Conn.Execute("SELECT * FROM log_afsendelse ORDER BY tidspunkt DESC")
Do until visResultater.EOF
%>
<%=visResultater("tidspunkt")%> | <%=visResultater("resultat")%>
<%
visResultater.MoveNext
Loop

Conn.Close
%>

Har ikke testet det, men det burde virke. Håber du kan bruge det :-)
Avatar billede riishoj Nybegynder
15. december 2005 - 07:07 #2
Ja, det er noget i den stil, jeg har bakset med. Prøver dit forslag i aften.
Avatar billede riishoj Nybegynder
15. december 2005 - 07:10 #3
Ved et hurtigt morgenkig på dit script, kunne jeg forestille mig, at det vil give problemer at få indsat alle de 60 mailadresser i 'resultat', som scriptet sender til? Eller hvad?
Avatar billede ossian Nybegynder
15. december 2005 - 09:04 #4
set opretResultat = Conn.Execute("INSERT INTO log_afsendelse (tidspunkt,resultat) VALUES (#" & now & "#,'OK')")
response.redirect "log_status.asp"

Ovenstående tilføjes efter Loop, derfor er det kun resultatet af hele afsendelsen der skrives ind i databasen. Altså 1 post pr. hele kørsel.
Avatar billede thesurfer Nybegynder
15. december 2005 - 11:53 #5
hvis man bruger "set variabelnavn = noget", skal man også bruge "set variabelnavn = nothing".

Ellers opretter man en forbindelse, men fjerner den ikke igen. Det tager ressourcer.

Og Det skal ske FØR man redirecter.

/theSurfer
Avatar billede thesurfer Nybegynder
15. december 2005 - 11:58 #6
..og du skal også huske at lukke for conn!

/theSurfer
Avatar billede riishoj Nybegynder
15. december 2005 - 16:53 #7
the Surfer> hvis man bruger "set variabelnavn = noget", skal man også bruge "set variabelnavn = nothing".

Jeg forstår ikke helt hvad du mener.
Avatar billede riishoj Nybegynder
15. december 2005 - 20:33 #8
ossian> Øv, min server er nede, så jeg kan ikke teste dit forslag! Må vente til Enavn for snøvlet sig sammen til at fixe problemet.
Avatar billede thesurfer Nybegynder
16. december 2005 - 10:00 #9
Du opretter en objektvariabel, når du bruger "set noget = andet". Det tager ressourcer på serveren. Derfor skal du frigøre denne variabel, når du ikke bruger den mere.
Det gør du med "set noget = nothing".

Du bruger objektvariabelen til at oprette en forbindelse til databasen. Hvis du ikke lukker disse forbindelse, vil du komme til at bruge samtlige forbindelsen, og så vil du få en fejl, når du prøver på at oprette forbindelse.
Det er sikkert denne fejl at du får nu :-)

Dvs:

Hver gang du bruger "set noget = andet" SKAL du bruge "set noget = nothing" !

Og det skal gøres, før siden forlades!

/theSurfer
Avatar billede ossian Nybegynder
16. december 2005 - 17:21 #10
Jeg giver thesurfer helt ret. Det er dårlig kodeskik ikke at afslutte sin objektvariabel.. Forglemmelse og dovenskab fra min side :-)
Avatar billede riishoj Nybegynder
18. december 2005 - 10:26 #11
ossian> Undskyld. Har haft travlt et par dage, men nu er jeg i gang med at afprøve dit forslag. Hvis jeg gør det her

-----------Tilføjes til din kode før Conn.Close-----------
set opretResultat = Conn.Execute("INSERT INTO log_afsendelse (tidspunkt,resultat) VALUES (#" & now & "#,'OK')")
response.redirect "log_status.asp"

får jeg så lukket min conn.,når jeg redirecter inden conn.close?
Avatar billede riishoj Nybegynder
18. december 2005 - 10:28 #12
Hvis det er rigtig nok, skal jeg så have sætte 'set opretResultat=nothing' her?

-----------Tilføjes til din kode før Conn.Close-----------
set opretResultat = Conn.Execute("INSERT INTO log_afsendelse (tidspunkt,resultat) VALUES (#" & now & "#,'OK')")
set opretResultat=nothing
response.redirect "log_status.asp"
Avatar billede thesurfer Nybegynder
18. december 2005 - 12:34 #13
For at du kan bruge Conn.Excute, har du brugt "set conn = ..." ! :-)

Så, hvad tror du at der skal stå efter "set opretResultat=nothing" og før "response.redirect"...? :-)

PS:
Når I nu ikke bruger opretResultat til noget som helst, kan I springe "set opretResultat = Con.."-leddet over:

Conn.Execute("INSERT INTO log_afsendels ........ ")

Når I ikke bruger "set opretResultat = noget", kan I heller ikke bruge "set opretResultat = nothing" (da den så ikke eksisterer)..

/theSurfer
Avatar billede riishoj Nybegynder
18. december 2005 - 13:16 #14
Svaret på din "gåde" er vel conn=nothing. Jeg er noget rundforvirret nu. Vil det sige, at jeg bare skal afslutte mit oprindelige script med response.redirect "log_status.asp" - altså efter conn.close? og undlade Tilføjes til din kode før Conn.Close-----------
set opretResultat = Conn.Execute("INSERT INTO log_afsendelse (tidspunkt,resultat) VALUES (#" & now & "#,'OK')")
Avatar billede thesurfer Nybegynder
18. december 2005 - 13:29 #15
1) Når man bruger "set VariabelNavnet = noget", skal man også bruge "Set VariabelNavnet = nothing".

2) Men hvis man ikke har sat den til noget, kan man ikke sætte den til "nothing".

3) For at oprette forbindelsen, bruger man "conn", via "set conn". Derfor skal denne afsluttes med "set conn = nothing".

4) I din kode bruger du "conn" til noget, men hvis du ikke behøver recordset'et (f.eks. rs("noget her"), eller opretResultat("noget her")), kan du bare bruge:
conn.execute(...)

i stedet for:

set opretResultat=conn.execute(...)


Struktur:

start_conn
  start_rs
    noget kode her
  slut_rs
slut_conn

"rs" er afhængigt af "conn". Derfor må man ikke lukke "conn" før "rs".
Lukke-proceduren er modsat åbne-proceduren

Eksempel:

Åben: 1,2,3,4,5
Luk : 5,4,3,2,1


Din kode:

Conn.Execute("INSERT INTO log_afsendelse (tidspunkt,resultat) VALUES (#" & now & "#,'OK')")
Conn.close
Set Conn = nothing
response.redirect "log_status.asp"

Du har ikke brugt recordset'et ("opretResultat"), så den kan du ikke lukke (fordi den ikke eksisterer)

/theSurfer
Avatar billede thesurfer Nybegynder
18. december 2005 - 13:37 #16
Dengang jeg startede med ASP, lærte jeg det via http://www.html.dk/tutorials/asp/
Jeg læste alle deres tutorials, hvilket jeg er glad for.. det kan jeg anbefale.

html.dk er et fint sted at start.. når man så bliver bedre, eller har brug for mere avanceret kode, søger man videre på nettet..

Det skal lige siges, at html.dk ikke nævner noget om, at man også skal lukke recordset'et (typisk "rs") med "set rs = nothing".. men det plejer man at gøre..

/theSurfer
Avatar billede riishoj Nybegynder
18. december 2005 - 14:14 #17
Tak for din gode og uddybende forklaring. Jeg har været igennem http://www.html.dk/tutorials/asp/, men er nok desværre ikke kommet videre. Ikke for at det skal lyde som en dårlig undskyldning, men ossians måde ligner ikke det jeg plejer at gøre. Det er naturligvis fordi jeg ikke helt kan gennemskue tingene og bliver forvirret, når syntaksen ikke er helt som jeg plejer at gøre.
Avatar billede thesurfer Nybegynder
18. december 2005 - 15:59 #18
riishoj> Hvad er problemet lige nu?

/theSurfer
Avatar billede riishoj Nybegynder
18. december 2005 - 16:18 #19
Der er ikke noget problem nu. Jeg har jo bare gjort som ossian og du har vist. Mit sidste indlæg var som bare en forklaring (undskyldning) på at jeg ikke helt kunne gennemskue ossians måde at kode på, men det fik du jo sat på plads. JMail scriptet fungerer ok, der bliver redirectet til en anden side, som viser resultat og status, så jeg har sådan set fået klaret mit lille problem. Hvis I begge sender et svar, så skal jeg generøst dele de 30 point i mellem jer :-)

En stor tak til jer begge for hjælpen
/riishoj
Avatar billede thesurfer Nybegynder
18. december 2005 - 16:19 #20
Så lægger jeg bare et svar :-)

/theSurfer
Avatar billede ossian Nybegynder
18. december 2005 - 20:44 #21
Samme her - og selv tak :-)
Avatar billede ossian Nybegynder
18. december 2005 - 20:45 #22
Samme her - og selv tak :-)
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