2012-03-18 78 views
3
Protected Sub btnLocalSubmit_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnLocalSubmit.Click 

      Dim logic = New connections 
      logic.emailsToSend(User.Identity.Name, getURL, reportedBy) 
      SendAsync() 
      Response.Redirect(getRedirectionPath, False) 
     Catch ex As Exception 
      Response.Write(ex.Message) 
     Finally 
      _con.Close() 
      _con.Dispose() 
      _sqlComm.Dispose() 

     End Try 
    End Sub 

    Sub SendAsync() 

     Dim _con As New SqlConnection(ConfigurationManager.ConnectionStrings("CitizenJDBConnectionString").ConnectionString) 
     Dim _sqlDataAdapter As New SqlDataAdapter("SELECT * FROM EmailSender", _con) 
     Dim _table As New System.Data.DataTable 

     Try 
      _con.Open() 
      _sqlDataAdapter.Fill(_table) 
      _con.Close() 

      For i As Integer = 0 To _table.Rows.Count - 1 


       Dim AppPath As String = Request.PhysicalApplicationPath 

       Dim sr As New StreamReader(AppPath & "EmailTemplates/NewReport.txt") 
       Dim message As New MailMessage() 

       message.IsBodyHtml = True 

       message.From = New MailAddress("[email protected]") 

       message.To.Add(New MailAddress(_table.Rows(i).Item(1))) 


       message.Subject = "New User registration !" 

       message.Body = sr.ReadToEnd() 

       sr.Close() 

       message.Body = message.Body.Replace("<%ReporterName%>", _table.Rows(i).Item(3)) 

       message.Body = message.Body.Replace("<%ReportURL%>", _table.Rows(i).Item(2)) 

       Dim client As New SmtpClient() 
       client.Host = "smtp.xxxxx.com" 
       'smtp.gmail.com 
       client.Port = 25 
       client.UseDefaultCredentials = True 
       client.Credentials = New System.Net.NetworkCredential("[email protected]", "123456") 
       'client.EnableSsl = True 
       Dim userState As Object = message 

       'wire up the event for when the Async send is completed 
       AddHandler client.SendCompleted, AddressOf SmtpClient_OnCompleted 

       client.SendAsync(message, userState) 

      Next 

     Catch ex As Exception 
      Response.Write(ex.Message) 
     End Try 


    End Sub 'SendAsync 

    Public Sub SmtpClient_OnCompleted(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs) 
     'Get the Original MailMessage object 
     Dim message As MailMessage = CType(e.UserState, MailMessage) 

     'write out the subject 
     Dim subject As String = message.Subject 

     If e.Cancelled Then 
      Console.WriteLine("Send canceled for mail with subject [{0}].", subject) 
     End If 
     If Not (e.Error Is Nothing) Then 
      Console.WriteLine("Error {1} occurred when sending mail [{0}] ", subject, e.Error.ToString()) 
     Else 
      Console.WriteLine("Message [{0}] sent.", subject) 
     End If 
    End Sub 'SmtpClient_OnCompleted 

我正在使用smtp客戶端SendAsync()函數異步發送電子郵件......但此功能不起作用......爲什麼?我沒有收到任何電子郵件..當我發送同步...我收到電子郵件,這意味着我的設置是正確的...所以SendAsync()方法有什麼問題?smtp客戶端`SendAsync()`方法

+0

您是否嘗試過同步發送並檢查錯誤? – 2012-03-18 06:23:28

+0

你做了...並且工作正常 – user1150440 2012-03-18 06:27:35

+0

你應該附加到['SendCompleted'](http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.sendcompleted.aspx )事件,並看到是有例外返回給你。 – casperOne 2012-03-18 06:58:27

回答

0

我做這一切的時候,經過多年這樣做的,我建議一(2)倍的解決你的問題:

  1. 重構實際發送電子郵件代碼(System.Net東西)到一個WCF服務或單獨的.dll(我更喜歡這個服務)。
  2. 繼續使用您的ASP.NET頁面中的異步委託調用,但是這樣做的方式是以「即忘即忘」方式進行連接,而不會連接任何回調。

你可能會說你需要知道發送郵件是否出錯。讓發送電子郵件的WCF服務處理這個問題。在服務中進行任何日誌記錄。畢竟,這些都是你實際上正在做的事。如果您的電子郵件發生故障時需要使用工作流程,您可以通過多種方式標記您的ASP.NET,但我認爲您會發現,一旦發送電子郵件的服務穩定下來,您就會遇到很少問題。

事實上,我多年來一直在使用ASP.NET調用的服務發送電子郵件,併發送了數以千計的不同電子郵件,並且從來沒有遇到任何問題。

最後,通過設置頁面Async=True使頁面總體上同步最終通過阻塞主線程,直到完成所有異步過程。這可能會導致頁面加載速度非常慢,通常不需要。