14. december 2005 - 19:22Der 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"
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
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 :-)
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?
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" !
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?
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"
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')")
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)
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..
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.
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 :-)
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.