11. april 2011 - 16:05Der er
18 kommentarer og 1 løsning
Send mail via koden
Hej, Jeg sidder med et problem som er ved at drive mig til vanvid. Det drejer sig om at jeg er ved at lave en funktion på en hjemmeside til afsendelse af nyhedsbreve til en forening jeg er med i. Det hele virker sådan set fint nok, bortset fra at alle mails bliver sendt 2 gange. Der er kun et sted i koden hvor jeg kalder min send funktion, men den sender alligevel samme mail til samme afsender 2 gange. Det er kodet i VB Nøjagtig samme kode bliver brugt til vores kontaktside, men der sendes jo så kun en gang til modtageren. Er der nogen der måske har prøvet noget tilsvarende? Mvh
Det er heldigvis ikke en fejl i frameworket så fejlen må skyldes uheldig kode - uden noget kode er det umuligt for os at gætte, men du kunne evt også prøve at køre siden med debugging, sætte et par breakpoints de vigtige steder i dit nyhedsbrevflow og på den måde ret let finde ud af hvad der går galt.
Tak for dit svar. Jeg sætter koden ind nedenfor med lidt forklaring: Først har jeg min gridview liste med en checkbox som afkrydses for dem der skal have sendt en mail. Denne funktion trickes af en knap ----------------------------------------- For Each row As GridViewRow In GridView1.Rows ' find checkboksen Dim cb As CheckBox = row.FindControl("renewCheckBox") If cb IsNot Nothing AndAlso cb.Checked Then Dim uID As String = GridView1.DataKeys(row.RowIndex).Value Try sendAll(uID)'Modtager modtagerens id Catch ex As Exception messageLabel.Text = messageLabel.Text & "<br ><b>FEJL: </b>" & ex.Message End Try End If Next ---------------------------------------- sendAll funktionen: Dim mMailServer As String = "mail.mailserver.dk" Dim mFrom As String = "admin@xxxxx.dk" Dim mPassword As String = "Password" Try Dim UserRealName As String = "" UserRealName = webhelper.getUserName(uid) username = webhelper.getUserNamefromProviderKey(uid) mTo = Membership.GetUser(username).Email mSubject = "Besked fra foreningen" mMsg = "mail indhold" Dim message As New MailMessage(mFrom, mTo, mSubject, mMsg) Dim mySmtpClient As New SmtpClient(mMailServer) mySmtpClient.UseDefaultCredentials = False mySmtpClient.Credentials = New NetworkCredential(mFrom, mPassword) message.IsBodyHtml = True Dim membershipResp As String = adminHelper.getMemberResponsibleEmail mySmtpClient.Send(message) message.Dispose() ------------------------------------------------
Jeg glemte at skrive at jeg bhar prøvet at få returneret mail adresse som der sendes til lige efter at jeg har kørt sætningen med send. Og den returnere også kun en som den skal.
nu kan jeg ikke helt se hvilken event det køres i - men hvis du udkommenterer selve mail-koden og sætter et breakpoint i sendAll(uID) giver det så nogen forklaring på problemet?
Det sættes igang med et onclick event på en knap. Så gennemgås listen og dem der er krydset af får tilsendt en mail. jeg har prøvet at sætte en retur tekst på. og der returneres kun en tekst pr. bruger, hvilket er rigtigt nok. men der sendes 2 mails til samme bruger. Og den tekst der returnes fra sendAll returneres lige efter at message.send er kaldt. Så hvis det var koden der fejlede, ville jeg så ikke få returneret 2 gange tekst? Jeg undrer mig godt nok, eller også har jeg bare stirret mig blind på koden. men så meget kode er der jo heller ikke.
Jeg ved ikke hvor meget man skal lægge i det, men der er så også forskel på den rækkefølge de dukker op i min indbakke. Nogen gange komme mailen til den samme bruger lige efter hinanden, og andre gange kommer de blandet.
Jeg vil stadig foreslå at du benytter debugging-værktøjet i Visual Studio, at udskrive tekst på en side som debugging var noget man kunne gøre i klassisk ASP for alt afhængig af events osv kan du ikke være sikker på at den tekst der udskrives svarer til hvad der reelt set når at ske.
Burde jeg kunne finde ud af noget ved at bruge trace? Jeg kan ikke rigtig bruge debuggeren, da websitet kører på en webserver og databasen har jeg ikke adgang til fra andre maskiner end serveren.
Der er ingenting der slår rigtig debugging da du kan få mange flere informationer gennem den end med noget andet - skulle der fx ske en redirect vil du ikke opdage den ved at udskrive værdier til skærm eller til trace men du kan da i hvert fald forsøge med tracen.
Alternativt må du i din sendAll skriv til en logfil.
Nu har jeg prøvet med trace. Og det er jo et dejligt stykke værktøj. Jeg sidder lidt med en fornemmelse af at have fundet en guldåre. he he.... Nå men ihvertfald, så har jeg sat nogle trace'es ind og jeg kan se at mit gridviev bliver løbet igennem 2 gange. Men hvorfor kan jeg ikke lige se. Der er en løkke som gennemgår alle rækker. Og hvis en checkbox i en række er afkrydset, så skal den sende. Men hvorfor går den igennem listen 2 gange?
Hvis du synes at trace er en guldåre så vent til du kommer i gang med rigtig debugging...
Vi kan ikke ud fra de oplysninger du har givet sige hvorfor listen gennemgås to gange - så prøv at sætte lidt flere trace-mærker i dine events, check hvor mange gange du databinder osv.
Jeg ville gerne have rigtig debugging. Men det er vist pt. ikke muligt. Men hvad mener du med databinder? Jeg har min liste som bliver sat ved page_load. Den viser jo rigtigt med dem der skal være på listen. Men jeg kan selvfølgelig godt lige sætte lidt mere trace ind.
Nu har jeg forsøgt med list ekstra trace. Og det ser dælme ud som om min knap event bliver kørt 2 gange. Jeg har sat min trace liste ind nedenfor. I den har jeg indsat et trace lige efter at knappen er blevet trykket. Jeg ved ikke om det giver mening. Men hvorfor hulen bliver koden i knap event kørt 2 gange?
Begin Raise PostBackEvent 0,0191071770294828 0,000016 Her der lige blevet trykket på knappen. Det er før listen bliver gennemløbet 0,0293934005578921 0,010286 Før for løkke....... 0,0298607783950195 0,000467 Inden i hver række:e6cf4ec8-893a-4ea2-9041-6eb64b5f3702 0,0299683339642329 0,000108 Inden i hver række hvis checkbox er afkrydset: før sendAll: e6cf4ec8-893a-4ea2-9041-6eb64b5f3702 0,030001299047784 0,000033 ---------------------------- 0,0300180609546744 0,000017 Før send 0,0443019992764444 0,014284 Efter send 0,0531176448403359 0,008816 Inden i hver række hvis checkbox er afkrydset: efter sendAll: e6cf4ec8-893a-4ea2-9041-6eb64b5f3702 0,0531866480237013 0,000069 ---------------------------- 0,0532115115189221 0,000025 Inden i hver række:944fea2e-06c6-407b-9ae2-9a76782a2599 0,0532349781885687 0,000023 Inden i hver række:a2cae684-d361-4902-b766-85cd9ff72701 0,0532592829535597 0,000024 Inden i hver række:1eec1647-b512-49fd-a7dc-b44b3b52fb64 0,0532799559720579 0,000021 Her der lige blevet trykket på knappen. Det er før listen bliver gennemløbet 0,0533073337533122 0,000027 Før for løkke....... 0,053326889311351 0,000020 Inden i hver række:e6cf4ec8-893a-4ea2-9041-6eb64b5f3702 0,0533453274089305 0,000018 Inden i hver række hvis checkbox er afkrydset: før sendAll: e6cf4ec8-893a-4ea2-9041-6eb64b5f3702 0,0533634861413951 0,000018 ---------------------------- 0,0533799686831706 0,000016 Før send 0,0567678294308355 0,003388 Efter send 0,0645048462863297 0,007737 Inden i hver række hvis checkbox er afkrydset: efter sendAll: e6cf4ec8-893a-4ea2-9041-6eb64b5f3702 0,0645598812139532 0,000055 ---------------------------- 0,0645780399464178 0,000018 Inden i hver række:944fea2e-06c6-407b-9ae2-9a76782a2599 0,0645992716951456 0,000021 Inden i hver række:a2cae684-d361-4902-b766-85cd9ff72701 0,0646202240787586 0,000021 Inden i hver række:1eec1647-b512-49fd-a7dc-b44b3b52fb64 0,0646392209065677 0,000019 aspx.page End Raise PostBackEvent
Så fandt jeg fejlen. Det er næsten lidt pinligt. Jeg har lavet siden om fra at have kode i samme fil til at have koden i en code behind fil. Og der har jeg ikke fået fjernet den onclick der er lavet på knappen. Så når jeg klikkede var der både en onclick der kørte koden men også en handles sendButton.click. Så derfor bliver koden inden i knap eventen kørt 2 gange. Det er jo latterligt. Den burde jeg have set. Det er testet og virker fint nu. Sender du mig et svar, keysersoze? Så for du point. Om ikke andet så fik jeg øjnene op for trace istedet for at bruge den gamle metode med at skrive til et tekstfelt.
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.