Avatar billede totalpc Seniormester
13. marts 2008 - 12:53 Der er 16 kommentarer og
1 løsning

Hjælp til at afsende automatisk mail til opretter og kommentar

Database

Tabel    Bruger
Felt        brugernavn
Felt        email
Felt        send_email Ja/Nej

Tabel    Blog   
Felt        forfatter
Felt        overskrift
Felt        tekst
Felt        blogid

Tabel    Kommentar
Felt        forfatter
Felt        tekst
Felt        blogid


Når en bruger laver et nyt indlæg på bloggen sender jeg en email til samtlige brugere der har JA i send_email.
Det er ok nemt.

Men når en bruger indtaster en kommentar til et blog indlæg, vil jeg gerne sende en besked til brugeren der har oprettet blogindlægget og samtlige andre brugere der har lavet en kommentar til samme blog. Hvordan klarer jeg lige den?
Desuden skal den jo ikke sende 2 mails hvis det er blogindlæg opretteren der skriver en kommentar til sin egen blog.
Kan nogle hjælpe?

Jeg har tidligere lavet noget via 2 asp sider hvor den først sendte til opretter og derefter til alle kommentardeltagere, men der gemte jeg email adressen for hver bruger i hvert kommentarindlæg og det gør jeg jo ikke her. Og det er vel også spildt?

Kernen må være det her der sender mailen...hvad skal jeg så gøre omkring det for at opfylde ovenstående?


          while not rs.eof
          if rs("email") <> "" then
        Set JMail = Server.CreateObject("JMail.SMTPMail")
        JMail.ServerAddress = "localhost"
                JMail.ContentType = "text/html"
        JMail.Charset = "iso-8859-1"
        JMail.ContentTransferEncoding = "8bit"
        JMail.Sender = "robot@xxxx.dk"
        JMail.Subject = "Der er oprettet en nyhed på xxx.dk"
        JMail.AddRecipient rs("email")
        JMail.HTMLBody = "Hej"
        JMail.Priority = 3
        JMail.Execute
      End if
          set JMail = nothing
          else
          End If
          rs.MoveNext
          Wend
Avatar billede softspot Forsker
13. marts 2008 - 13:05 #1
Umiddelbart ville jeg nok lave en SELECT DISTINCT på alle de deltagere som har noget med det aktuelle blogindlæg at gøre og som ønsker email. På den måde får hver bruger kun én email og kun hvis de ønsker det.

Noget i stil med dette:

SELECT DISTINCT u.email
FROM blog b
INNER JOIN bruger u ON u.brugernavn = b.forfatter
INNER JOIN kommentar k ON k.blogid = b.blogid
WHERE b.blogid = @aktuelleblogid


Nu ved jeg ikke lige hvilken database der er tale om, men dette burde fungere på en SQL Server. I en Access database skal du nok have lidt paranteser omkring en af JOIN-sektionerne. F.eks. således:

SELECT DISTINCT u.email
FROM (blog b
INNER JOIN bruger u ON u.brugernavn = b.forfatter)
INNER JOIN kommentar k ON k.blogid = b.blogid
WHERE b.blogid = @aktuelleblogid
Avatar billede totalpc Seniormester
13. marts 2008 - 13:48 #2
Hey softspot

Det er access.
Vil du prøve at forklare mig hvad det er du gør? Sådan lidt psoudu agtig. Kan ikke helt gennemskue det!


<!--#include file="db.inc"-->
<%

ID = Request.QueryString("id")

strSQL = "SELECT DISTINCT u.email
FROM (blog b
INNER JOIN bruger u ON u.brugernavn = b.forfatter)
INNER JOIN kommentar k ON k.blogid = b.blogid
WHERE b.blogid = @aktuelleblogid"

set rs = Conn.Execute(strSQL)

          while not rs.eof
          if rs("email") <> "" then
        Set JMail = Server.CreateObject("JMail.SMTPMail")
        JMail.ServerAddress = "localhost"
                JMail.ContentType = "text/html"
        JMail.Charset = "iso-8859-1"
        JMail.ContentTransferEncoding = "8bit"
        JMail.Sender = "xx@xxx.dk"
        JMail.Subject = "Der er oprettet en nyhed på xxx.dk"
        JMail.AddRecipient rs("email")
        JMail.HTMLBody = "Hej"
        JMail.Priority = 3
        JMail.Execute
      End if
            set JMail = nothing
          else
          End If
          rs.MoveNext
          Wend
         
'Reset server objects
Conn.Close
Set Conn = Nothing
Set rs  = Nothing
Set rs1  = Nothing

%>
Avatar billede softspot Forsker
13. marts 2008 - 13:58 #3
Denne her:

SELECT DISTINCT u.email
FROM (blog b
INNER JOIN bruger u ON u.brugernavn = b.forfatter)
INNER JOIN kommentar k ON k.blogid = b.blogid
WHERE b.blogid = @aktuelleblogid


gør det, at den samler alle blogindlæg og henter brugeroplysninger om dem der har lavet indlægene. Derefter samler den alle kommentarer til de blogindlæg og ud af denne mængde, tager den fat i de rækker som omhandler det blog-indlæg du skal sende mail om ændringer i (altså det der er identificeret ved ID).

Du mangler, i din kode, at udskifte @aktuelleblogid i SQL-sætningen, med det blogid der faktisk er tale om og det gøres simplest ved at sammensætte det med SQL-strengen, således:

strSQL = "SELECT DISTINCT u.email " & _
    "FROM (blog b " & _
    "INNER JOIN bruger u ON u.brugernavn = b.forfatter) " & _
    "INNER JOIN kommentar k ON k.blogid = b.blogid " & _
    "WHERE b.blogid = " & ID & " " & _
    "AND u.send_email = true"

Jeg har lige tilføjet en betingelse i SQL-sætningen, da det jo kun er de brugere som ønsker at modtage email som skal medtages i udtrækket... :)
Avatar billede totalpc Seniormester
13. marts 2008 - 14:02 #4
Det vil jeg lige prøve. Kan du imellem tiden måske hurtigt prøve at forklare dine u on u.brugernavn ? Hvor kommer u og ON fra :)
Avatar billede softspot Forsker
13. marts 2008 - 14:20 #5
"ON" er en SQL syntaks der bruges for at angive hvilke felter fra de to tabeller man "smelter sammen" der skal matche for at "sammensmeltningen" kan godtages.

Hvis vi antager at du har to tabeller som indeholder flg. data:

blog:
id  forfatter  tekst
1    test1      tekst1
2    test2      tekst2
3    test1      tekst4

bruger:
brugernavn  email
test1        test1@en-mail.dk
test2        test2@en-anden-mail.dk

og vi så kalder flg. SQL:

SELECT *
FROM blog b
INNER JOIN bruger u ON u.brugernavn = b.forfatter

så skulle vi gerne ende med flg. resultat:

id  forfatter  tekst    brugernavn  email
1    test1      tekst1    test1        test1@en-mail.dk
2    test2      tekst2    test2        test2@en-anden-mail.dk
3    test1      tekst4    test1        test1@en-mail.dk

Som du kan se er alle felter fra både blog og bruger kommet med i resultatet. Du kan i princippet betragte overstående som en nye tabel, hvor du kan foretage yderligere opslag (hvilket så er det jeg gør ved at udføre endnu en INNER JOIN på en tabel mere og derefter filtrere på nogle felter med WHERE).

Når jeg skriver "bruger u" betyder det bare at jeg giver tabelnavnet "bruger" et alias som kan bruges til at referere felter i den tabel. I dette tilfælde vælger jeg at det skal være "u". Det betyder igen at "u.brugernavn" er det samme som at skrive "bruger.brugernavn". Det er dels en dovenskabsfeature, men jeg synes selve det er med til at gøre SQL-sætningen mere overskuelig, at det ikke er det fulde tabelnavn som skal bruges hver gang man skal referere et felt fra en given tabel.

SQL er en større omgang, så det tror jeg du er nød til at finde en bog om, hvis du vil have indblik i hvordan det virker (eller kigge i Access-hjælpen).
Avatar billede totalpc Seniormester
13. marts 2008 - 14:38 #6
jeg får en fejl

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'b.blogid = AND u.send_email = true'.

/kommentar_send_email.asp, line 17


en response.write strsql giver :

SELECT DISTINCT u.email FROM (blog b INNER JOIN bruger u ON u.brugernavn = b.forfatter) INNER JOIN kommentar k ON k.blogid = b.blogid WHERE b.blogid = AND u.send_email = true

Kan du hjælpe?

Jeg er glad for din forklaring. Jeg har faktisk været på advanced sql kursus engang, men har ikke brugt det i mange år...så glemmer man jo ;)
Det sidste jeg bare ikke helt er med på er hvorfor du skriver

"FROM (blog b " & _

jeg er med på at du sætter linien sammen men hvorfor ikke bare & hvor er underscore med? & _ ??
Avatar billede totalpc Seniormester
13. marts 2008 - 14:38 #7
hov der står ik noget i id jo... tjekker lige
Avatar billede totalpc Seniormester
13. marts 2008 - 14:41 #8
SELECT DISTINCT u.email FROM (blog b INNER JOIN bruger u ON u.brugernavn = b.forfatter) INNER JOIN kommentar k ON k.blogid = b.blogid WHERE b.blogid = 23 AND u.send_email = true
Microsoft OLE DB Provider for ODBC Drivers error '80040e10'

[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.

/kommentar_send_email.asp, line 17
Avatar billede softspot Forsker
13. marts 2008 - 14:58 #9
Underscore er en såkaldt linecontinuation-karakter i VBScript, så det er for at SQL-strengen kan deles over flere linier uden at du skal lave et nyt statement for hver linie SQL du vil sammensætte.

jeg er lidt i tvivl om hvorvidt feltet i bruger rent faktisk hedder "send_email Ja/Nej" eller om ja/nej bare er for at angive feltets type (boolsk)?

Fejlen betyder i det mindste (oftest), at man har stavet et feltnavn forkert eller angivet et feltnavn som ikke eksisterer i nogen af de tabeller man forespørger i. Hvis feltet hedder "send_email ja/nej", så skal SQL-sætningen se således ud:

strSQL = "SELECT DISTINCT u.email " & _
    "FROM (blog b " & _
    "INNER JOIN bruger u ON u.brugernavn = b.forfatter) " & _
    "INNER JOIN kommentar k ON k.blogid = b.blogid " & _
    "WHERE b.blogid = " & ID & " " & _
    "AND u.[send_email ja/nej] = true"

men jeg vil til hver en tid fraråde at navngive felter på denne måde. Jo simplere (og tættere på det amerikanske tegnsæt) du kan navngive dine felter, desto færre problemer render du ind i. Jeg holder mig ALTID til at bruge a-z og 0-9 hverken mellemrum, danske eller andre bogstaver... på et eller andet tidpunkt giver det problemer hvis man gør. :)
Avatar billede totalpc Seniormester
13. marts 2008 - 15:04 #10
Nu har jeg ingen fejl.
strsql siger:

SELECT DISTINCT u.email FROM (blog b INNER JOIN bruger u ON u.brugernavn = b.forfatter) INNER JOIN kommentar k ON k.blogid = b.id WHERE b.id = 24 AND u.send_email = true

Men ...
jeg har lavet en response.write jmail.htmlbody og forventede jo at den skriver noget der.. Men intet. Jeg har prøvet at lave kommentarer med forskellige brugere osv men stadig ingen ting...


<!--#include file="db.inc"-->
<%

aktiv="nej"

ID = Request.QueryString("id")

strSQL = "SELECT DISTINCT u.email " & _
    "FROM (blog b " & _
    "INNER JOIN bruger u ON u.brugernavn = b.forfatter) " & _
    "INNER JOIN kommentar k ON k.blogid = b.id " & _
    "WHERE b.id = " & ID & " " & _
    "AND u.send_email = true"

response.write strsql

set rs = Conn.Execute(strSQL)

    while not rs.eof
    if rs("email") <> "" then
        Set JMail = Server.CreateObject("JMail.SMTPMail")
                JMail.ServerAddress = "localhost"
        JMail.ContentType = "text/html"
                JMail.Charset = "iso-8859-1"
                JMail.ContentTransferEncoding = "8bit"
                JMail.Sender = "robot@xxxx.dk"
                JMail.Subject = "Der er oprettet en nyhed på xxx.dk"
                JMail.AddRecipient rs("email")
                JMail.HTMLBody = "Hej "& tilbrugernavn & "<br><br>Der er oprettet en nyhed af <b><i>"& rs1("forfatter") & "</i></b> med overskriften <b><i>"& rs1("overskrift") & "</i></b><br>Log på <a href=""http://v0011cvc/default.asp?sitepage=blogview_indlag&id="&id&""">http://www.xxxx.dk</a> og læs nyheden.<br><br>Mvh Kristian"
                response.write jmail.htmlbody
                JMail.Priority = 3
                If aktiv="ja" then
                JMail.Execute
              End if
              set JMail = nothing
    else
    End If
          rs.MoveNext
          Wend
         
'Reset server objects
Conn.Close
Set Conn = Nothing
Set rs  = Nothing


'Response.Redirect "default.asp?sitepage=blogview_indlag&id=" & id


%>
Avatar billede totalpc Seniormester
13. marts 2008 - 15:07 #11
Okay..så er jeg helt med på forklaringerne. Mange tak ;)
Nej feltet hedder blot send_email og er et Ja/Nej felt type i access.
Jeg havde lavet en lille fejl omkring id. Det hedder kun id i tabellen blog.
Det er rettet, men som du kan se på ovenstående får jeg ikke rigtig nogle "hits"!
Avatar billede softspot Forsker
13. marts 2008 - 15:10 #12
Så finder den vel ikke nogen emails der matcher eller alle emails er tomme eller ingen brugere har lyst til at modtage emails...

Hvad er dit datagrundlag?
Avatar billede totalpc Seniormester
13. marts 2008 - 15:23 #13
Det må du sg. undskylde...det er lidt indviklet for min hjerne haha..
Men du har ret.. Jeg gjorde det lige slavisk nu og fandt en hvor det skulle virke og det gør det. Det kræver nok lige lidt mere test før jeg er helt sikker på at det opfører sig som tiltænk.
Jeg siger mange tak for hjælpen. Det var en fornøjelse :)
Smid et svar!
Avatar billede softspot Forsker
13. marts 2008 - 15:24 #14
Velbekomme :)
Avatar billede softspot Forsker
13. marts 2008 - 15:32 #15
Tak for point :)
Avatar billede totalpc Seniormester
13. marts 2008 - 15:34 #16
det er mig der takker....vender frygteligt tilbage hvis det ikke virker som tiltænkt ;) hehe
Avatar billede softspot Forsker
13. marts 2008 - 15:39 #17
:)
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