Как хранить ошибки в SQL-таблице или лог-файле, если при отправке электронной почты произошла ошибка - PullRequest
0 голосов
/ 20 сентября 2009

Я использую код VB.net и SQL-сервер 2005.

У меня ниже код для отправки электронной почты в моем коде 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

Теперь моя проблема в том, что какое-то время, если адрес электронной почты неверен или SMTP-сервер отвечает, мое приложение зависает. Я хочу записать свои ошибки, сгенерированные моим SMTP-сервером, в таблицу или любой файл журнала, было бы хорошо, если бы я мог отправить обратно электронное письмо администратору с подробностями произошедшей ошибки.

Пожалуйста, предложите!

Спасибо.

С наилучшими пожеланиями, MS

Ответы [ 4 ]

0 голосов
/ 22 ноября 2009

В соответствии с другими комментариями, которые подчеркивают важность регистрации всех ошибок, взгляните на log4net . Он имеет различные цели ведения журнала (appenders), включая ведение журнала базы данных.

0 голосов
/ 20 сентября 2009

До ошибок при отправке почты можно регистрировать или до того, как администратор может уведомить о таких ошибках, они должны быть обнаружены!

После тщетного поиска в Интернете подробного описания этого метода .NET SendMail.SendMessage () я подумал, что может быть так же быстро реализовать собственную версию метода отправки почты, может быть, путем бесстыдного копирования этого из 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-сервер, если это возможно, на самом сервере. где вы запускаете программу, чтобы ограничить зависимости или использовать другую коммуникационную систему (прямой набор на пейджер ..., сообщение твиттера ...).

-

0 голосов
/ 20 сентября 2009

Если у вас уже есть доступ к серверу Sql, почему бы не использовать процедуру SQL sp_send_dbmail ? Он обрабатывает все SMTP и регистрирует ошибки для вас. Также является асинхронным и повторяет ручку.

Разве очень неразумно делать что-то дороже, чем трафик smtp в потоке пользовательского интерфейса. Вам нужно просто поставить пользовательский рабочий элемент в пул потоков и освободить поток пользовательского интерфейса для обработки большего количества событий.

Существуют также различные готовые модули обработки и регистрации исключений, такие как log4net.

0 голосов
/ 20 сентября 2009

Я бы порекомендовал регистрировать не только эти ошибки, но и все ошибки, возникающие в вашем приложении. Это важнейшее оружие в вашем арсенале отладки. Я обычно регистрирую время, трассировку стека, сообщение об ошибке, тип ошибки (т.е. IOException, SQLException и т. Д.), И у меня также есть столбец, в котором я могу записывать сведения о приложении во время ошибки (например, имя сервера SMTP в ваш случай).

Я храню их в таблице базы данных просто потому, что их легко запрашивать и выполнять исторический анализ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...