2016-06-30 54 views
7

我使用下面的代碼來生成電子郵件。出於某種原因,它會隨機發送重複的電子郵件。它不會一直髮生,只是一個月幾次。你有看到我的代碼可能會導致這種情況嗎?當用戶點擊頁面上的提交按鈕時會觸發它。有什麼我可以添加到此以防止這種情況發生? TIASystem.Net.Mail新的MailMessage隨機發送重複的電子郵件?

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 

圖片按鈕代碼:

<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

只是猜測,如果用戶按下瀏覽器的按鈕或刷新頁面(郵件發送後),這是否會再次觸發回發? –

+0

它也可以是會話。當您設置Session [「EmailAddress」]時,是否有用戶的電子郵件被添加多次? – Kramb

+0

我認爲如果頁面被刷新,它會觸發另一個帖子。如果不是回發,那我會添加嗎? – user1342164

回答

3

我以前經歷過同樣的問題,所以我想我可能會分享我的解決方案:

這是我的加價代碼爲按鈕,以避免重新再次單擊它:

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

通知OnClientClick="this.disabled = true; this.value = 'Sending...'

它會禁用您的按鈕,並點擊它後更改其文本。

另外,爲了避免數據的重複存儲/重新提交/重新發送的頁面被刷新時,我只是記得我的形式:

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

我添加了上面修改了建議的圖像按鈕代碼,現在當我點擊它時什麼也沒有發生。任何想法? – user1342164

+1

我建議你使用'setTimeout'異步禁用按鈕,你可以在我的回覆這篇文章中看到:http://stackoverflow.com/questions/37955604/disabled-button-doesnt-submit-postback-in-的UpdatePanel/37955693#37955693。否則,回發將不會執行。 – ConnorsFan

+1

我認爲它不工作,因爲它是一個'ImageButton'。糾正我,如果我錯了,但正如我記得我無法使用'LinkBut​​ton'工作,所以我訴諸使用正常的按鈕。 –

2

首先,您使用的是幾個對象應該是.Dispose ()'當你完成它們時(我更喜歡使用自己的塊) - 並不是說​​這是重複發送的原因,但最好將它作爲可能性消除,這是最佳實踐。 Here是一個關於使用和替代策略的方便文章,您可能會覺得有用。

其次,您是否有權訪問用於發送消息的服務器的SMTP日誌?這可能值得期待。如果您在短時間內看到2條消息,那麼您可以打賭這是一個雙擊按鈕。當點擊按鈕時,擊碎聖代按鈕的方法應該可以解決這個問題,但是您可以在檢查按鈕的OnClientClick屬性的文檔時找到一些值(here)。

相關問題