2009-09-20 11 views
0

我使用的VB.net代碼和SQL Server 2005如何存儲錯誤在SQL表或日誌文件如果在發送電子郵件

我havng下面的代碼在我的vb.net發送電子郵件錯誤碼。

Protected Sub ibtnSendInvites_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ibtnSendInvites.Click 
     Try 
      Dim emailList As New List(Of String) 
      For Each curRow As GridViewRow In GridView1.Rows 
       Dim chkSelect As CheckBox = CType(curRow.Cells(1).FindControl("chkSelect"), CheckBox) 
       Dim emailLabel As Label = CType(curRow.Cells(1).FindControl("lblEmailAddress"), Label) 
       If chkSelect.Checked Then 
        emailList.Add(emailLabel.Text) 
       End If 
      Next 
      For Each email As String In emailList 
       Dim SelectDelegateMessage As String = "Please confirm your booking for this course" 
       Dim SelectDelegateSubject As String = "User-Point Course Booking Invitation Email" 
       Dim SelectDelegateFrom As String = WebConfigurationManager.AppSettings("UserPointEmailFromAddress").ToString() 
       SendEmail.SendMessage(SelectDelegateSubject, SelectDelegateMessage, SelectDelegateFrom, email, "") 
      Next 
      GridView1.DataBind() 
     Catch ex As Exception 
      'Throw New Exception("Cannot Insert Duplicate Record", ex) 
     End Try 

    End Sub 

現在我的問題是,有些時候,如果emailaddress無效或SMTP服務器響應我的應用程序得到掛起。我想將我的SMTP服務器生成的錯誤記錄在表或任何日誌文件中,如果我可以通過發送錯誤的詳細信息發回給管理員的電子郵件,那將會很好。

請建議!

謝謝。

最好的問候, MS

回答

0

之前發送郵件時發生的錯誤可以被記錄下來,或者之前管理員可以收到這樣的錯誤通知,他們需要被檢測到!

白白在網上找的這個詳細描述後.NET SendMail.SendMessage()方法,我想這可能只是爲快速實施自己發送郵件法的版本,也許是無恥複製此one from CodeProject

所以,除非你知道得更好,並且可以訪問一個可以告訴你關於你現在使用的SendMessage()方法的返回碼(如果有的話)的文檔,你首先需要切換到一個你可以信賴的。

一旦此方法到位,您將需要測試返回值。我預計你可以有一個數字返回代碼,加上明確的文本細節(「無效的電子郵件地址」,「SMTP沒有響應......」)。

當返回值指示錯誤條件時,您將 - 將此日誌記錄到文本文件或將 記錄到數據庫表中。 細節可以在特定表變化的基礎,但通過ADO的方式或其他一些數據庫連接你發送一個查詢像這樣:

"INSERT INTO dbLogs.dbo.tblEmailErrors 
    (EventTime, EmailAddr, ErrorCode, ErrorMessage) 
    VALUES ('<some date from say method Now()', '<the email addr>', 
    <the error code>, '<the error clear text message>' " 

那麼你也就會通知管理員,對於更嚴重的情況下,只是,我認爲(不需要打擾他們僞造電子郵件地址的情況下)。這可能是一個兩難的情況下,你可能無法發送電子郵件[給管理員]使用相同的渠道...這可能意味着你會使用另一臺smtp服務器,如果可能的話在服務器上您正在運行程序的地方,以限制依賴關係,或者使用其他通信系統altogher(直接撥打尋呼機...,Tweeter消息...)。

-

0

我會建議記錄不僅是這些錯誤,但在程序拋出的所有錯誤。這是你調試工具的關鍵武器。我通常會記錄時間,堆棧跟蹤,錯誤消息,錯誤類型(即IOException,SQLException等),還有一個列可以記錄錯誤發生時應用程序的詳細信息(例如,SMTP服務器名稱你的情況)。

我將這些數據存儲在數據庫表中,只是因爲這很容易查詢並對其進行歷史分析。

+0

好點,記錄「所有」錯誤是一個好主意。然而,一旦您對此有點認真,您可能需要引入一些邏輯,以避免發送日誌過多,當然發送太多通知,以防出現突發錯誤。有一個名爲say「ErrorHandler()」的實用程序方法是一個好主意,其中所有日誌記錄(以及管理員通知等其他功能)都會發生。以這種方式,當關於錯誤處理的業務邏輯發生改變時,程序不會改變。 – mjv 2009-09-20 09:57:37

+0

我會過濾出可能的404錯誤和ThreadAbortExceptions等錯誤。但是,我發現更多更多,值得記錄一切。我有一個網站每天要獲得超過10萬個請求,儘管由於網絡問題,我可能會有數千個錯誤發生,但記錄日誌證明在報告問題中是無價的。當它變得太大時,我經常截斷我的錯誤表。另外,我的通知系統不會通過電子郵件發送給我任何錯誤。當最近的Y分鐘出現> X錯誤時,我會收到通知。 – 2009-09-20 10:26:12

0

如果您已經擁有訪問SQL SERVER爲什麼不使用SQL sp_send_dbmail程序?它處理所有SMTP的東西,併爲您記錄錯誤。也是異步的並處理重試。

在UI線程上做一些像smtp流量一樣昂貴的代碼是非常不明智的。您應該將用戶工作項目排列到線程池,並釋放UI線程以處理更多事件。

還有各種現成的異常處理和日誌模塊,如log4net。

+0

謝謝親愛的我可以有使用SQL發送電子郵件的上述問題的示例代碼。請幫忙! – 2009-09-21 07:59:40

0

根據突出記錄所有錯誤的重要性的其他評論,請看log4net。它有各種日誌目標(appender),包括數據庫日誌記錄。

相關問題