smtp клиенты `SendAsync ()` метод - PullRequest
3 голосов
/ 18 марта 2012
 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("admin@xxxx.com")

                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("admin@xxxx.com", "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() ??

1 Ответ

0 голосов
/ 28 марта 2012

Я делаю это все время, и после нескольких лет работы я предлагаю (2) кратное решение вашей проблемы:

  1. Рефакторинг фактическая отправка кода электронной почты (Материал System.Net) в службу WCF или отдельную библиотеку DLL'способ, где вы не подключаете никаких обратных вызовов.

Вы можете сказать, что вам нужно знать, если что-то пошло не так при отправке электронного письма.Пусть служба WCF, которая отправляет электронные письма, обрабатывает это.Зайдите в сервис.В конце концов, это все, что вы действительно делали, это входить в систему.Если вам нужно привыкнуть к рабочему процессу в случае сбоя электронной почты, есть способы пометить ваш ASP.NET, но я думаю, вы обнаружите, что, как только служба отправки электронных сообщений станет стабильной, у вас будет очень мало проблем.

Фактически, я использовал этот точный метод в течение многих лет, используя службу ASP.NET для отправки электронных писем и отправки 10 тысяч различных писем, и у меня никогда не было проблем с этим проектом «забей и забудь».

И, наконец, установка страницы Async=True заставляет страницу работать в целом синхронно , в конце концов, блокируя основной поток до завершения всех асинхронных процессов.Это может замедлить загрузку страниц и, как правило, нежелательно.

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