2016-06-30 58 views
7

Sto usando il codice qui sotto per generare un email. Per qualche motivo, a caso invierà un'e-mail duplicata. Non succede sempre, solo un paio di volte al mese. Vedi qualcosa con il mio codice che potrebbe causare questo? Viene attivato quando l'utente fa clic su un pulsante di invio sulla pagina. C'è qualcosa che posso aggiungere a questo per evitare che ciò accada? TIASystem.Net.Mail New MailMessage invia in modo casuale e-mail duplicate?

Try 
    Dim Attachment As String 
    Attachment = path + myUniqueFileName 

    Dim mailMessage As MailMessage = New MailMessage 
    mailMessage.From = New MailAddress("[email protected]") 
    mailMessage.Subject = "Report " + " " + myUniqueFileName 
    mailMessage.IsBodyHtml = True 
    mailMessage.To.Add(New MailAddress(Session("EmailAddress"))) 
    mailMessage.Attachments.Add(New Attachment(Attachment)) 
    mailMessage.Body = "Attached is your report" 

    Dim smtp As SmtpClient = New SmtpClient 

    smtp.Host = "mail.net" 

    Dim NetworkCred As System.Net.NetworkCredential = New System.Net.NetworkCredential 

    smtp.Credentials = New NetworkCredential("test", "test") 
    smtp.UseDefaultCredentials = False 
    smtp.Send(mailMessage) 

Catch ex As Exception 

    Dim message As String = ex.ToString 
    Dim sb As New System.Text.StringBuilder() 
    sb.Append("<script type = 'text/javascript'>") 
    sb.Append("window.onload=function(){") 
    sb.Append("alert('") 
    sb.Append(message) 
    sb.Append("\n") 
    sb.Append(String.Format("{0:f2}", Convert.ToDouble(TotalAmount))) 
    sb.Append("')};") 
    sb.Append("</script>") 
    ClientScript.RegisterClientScriptBlock(Me.GetType(), "alert", sb.ToString()) 

End Try 

immagine Codice Button:

<asp:ImageButton ID="cmdFinish" runat="server" Height="38px" ImageUrl="~/Images/Finish.png" Width="99px" UseSubmitBehavior="false" OnClientClick="this.disabled = true; this.value = 'Sending...';" Text="Send" /> 
+2

Un'ipotesi, se l'utente preme il pulsante Indietro del browser o aggiorna la pagina (dopo l'invio della posta), attiva nuovamente il postback? –

+0

Potrebbe anche essere la sessione. Quando si imposta 'Session [" EmailAddress "]', c'è comunque che l'e-mail dell'utente sia stata aggiunta più di una volta? – Kramb

+0

Penso che attiverà un altro post se la pagina viene aggiornata. È quello dove aggiungerei se non è un postback? – user1342164

risposta

3

ho sperimentato lo stesso problema prima, quindi penso che potrei condividere la mia soluzione:

Questo è il mio codice di mark-up per la per evitare di ri-cliccarlo di nuovo:

<asp:Button ID="btnSend" runat="server" CssClass="btn btn-primary" Width="150px" UseSubmitBehavior="false" OnClientClick="this.disabled = true; this.value = 'Sending...';" Text="Send" /> 

Avviso OnClientClick="this.disabled = true; this.value = 'Sending...'.

Disabilita il pulsante e cambia il suo testo dopo aver fatto clic su di esso.

Inoltre, per evitare di ri-risparmio/ripresentazione/reinvio dei dati quando la pagina viene aggiornata, ho appena ricordato la mia forma:

Response.Redirect("~/yourForm.aspx") 
+0

Ho aggiunto il mio codice pulsante immagine sopra modificato con i suggerimenti e ora quando clicco su di esso non succede nulla. Qualche idea? – user1342164

+1

Ti suggerisco di usare 'setTimeout' per disabilitare il pulsante in modo asincrono, come puoi vedere nella mia risposta a questo post: http://stackoverflow.com/questions/37955604/disabled-button-doesnt-submit-postback-in- UpdatePanel/37955693 # 37955693. In caso contrario, il postback non verrà eseguito. – ConnorsFan

+1

Penso che non funzioni perché è un "ImageButton". Correggimi se ho torto ma, come ricordo, non sono riuscito a farlo funzionare anche usando un 'LinkButton', quindi ho fatto ricorso a un normale pulsante. –

2

In primo luogo, si sta utilizzando alcuni oggetti che dovrebbero essere .Dispose() Quando hai finito con loro (preferisco usare i blocchi da solo) - non dire che questa è la causa delle ripetute mandate, ma potrebbe essere meglio eliminarle come possibilità ed è la migliore pratica. Here è un comodo articolo su Usi e strategie alternative che potresti trovare utili.

In secondo luogo, si ha accesso ai registri SMTP per il server che viene utilizzato per inviare il messaggio? Potrebbe valere la pena cercarlo. Se vedi 2 messaggi in un breve lasso di tempo, allora puoi scommettere che è un doppio clic del pulsante. Il metodo Crush Sundae per disabilitare il pulsante quando viene cliccato dovrebbe davvero affrontare questo problema, ma potresti trovare un certo valore nell'esaminare la documentazione per la proprietà OnClientClick del pulsante (here).