Консольное приложение для рассылки не отправляет последнюю почту - PullRequest
1 голос
/ 09 августа 2011

У меня следующая проблема:

Я написал небольшое консольное приложение, которое отправляет электронные письма. Он ведет себя следующим образом:

  • когда я запускаю это приложение в режиме отладки и пошагово перебираю код, оно отправляет электронные письма;
  • когда я запускаю это приложение в режиме отладки и не выполняю пошаговый код, последнее письмо не отправляется;
  • когда я создаю и перемещаю приложение на сервер и создаю для него задачу, последнее письмо не отправляется;
  • при запуске приложения из проводника Windows (двойной щелчок по файлу .exe) последнее письмо не отправляется;
  • когда я запускаю приложение из командной строки, оно отправляет все электронные письма;

Что интересно, когда я помещаю thread.sleep (200), все письма отправляются! Обратите внимание, что я использую этот код в своих приложениях ASP, и все письма отправляются всегда. Если в письме есть вложение, оно всегда отправляется, даже если оно последнее в очереди (но это другое приложение, которое работает правильно).

Код, который я использую (класс для рассылки):

 Public Class Mailer

        ' Methods
        Public Sub SendMail()
            Dim mail As New MailMessage(Me.Sender, Me.To, Me.Subject, Me.Body)
            mail.IsBodyHtml = True
            If Not Me.CC.Trim.Equals("") Then
                mail.CC.Add(Me.CC)
            End If
            If Not Me.BCC.Trim.Equals("") Then
                mail.Bcc.Add(Me.BCC)
            End If
            Dim client As New SmtpClient(Me.MailServer)
            client.Credentials = New NetworkCredential(Me.Username, Me.Password)
            client.Send(mail)
            mail.Dispose()
        End Sub


        ' Properties
        Public Property Attachments As String
            Get
                Return Me._attachments
            End Get
            Set(ByVal value As String)
                Me._attachments = value
            End Set
        End Property

        Public Property BCC As String
            Get
                Return Me._BCC
            End Get
            Set(ByVal value As String)
                Me._BCC = value
            End Set
        End Property

        Public Property Body As String
            Get
                Return Me._body
            End Get
            Set(ByVal value As String)
                Me._body = value
            End Set
        End Property

        Public Property CC As String
            Get
                Return Me._CC
            End Get
            Set(ByVal value As String)
                Me._CC = value
            End Set
        End Property

        Public ReadOnly Property MailSent As Boolean
            Get
                Return Me._mailSent
            End Get
        End Property

        Public Property MailServer As String
            Get
                Return Me._mailServer
            End Get
            Set(ByVal value As String)
                Me._mailServer = value
            End Set
        End Property

        Public Property Password As String
            Get
                Return Me._password
            End Get
            Set(ByVal value As String)
                Me._password = value
            End Set
        End Property

        Public Property Sender As String
            Get
                Return Me._sender
            End Get
            Set(ByVal value As String)
                Me._sender = value
            End Set
        End Property

        Public Property Subject As String
            Get
                Return Me._subject
            End Get
            Set(ByVal value As String)
                Me._subject = value
            End Set
        End Property

        Public Property [To] As String
            Get
                Return Me._recepients
            End Get
            Set(ByVal value As String)
                Me._recepients = value
            End Set
        End Property

        Public Property Username As String
            Get
                Return Me._username
            End Get
            Set(ByVal value As String)
                Me._username = value
            End Set
        End Property


        ' Fields
        Private _attachments As String
        Private _BCC As String
        Private _body As String
        Private _CC As String
        Private _mailSent As Boolean
        Private _mailServer As String
        Private _password As String
        Private _recepients As String
        Private _sender As String
        Private _subject As String
        Private _username As String
    End Class

Код для отправки электронных писем:

Do While rd.Read

    Dim m As New LinksMailer.Mailer

    m.MailServer = ConfigurationSettings.AppSettings.Item("mailServer")
    m.Username = ConfigurationSettings.AppSettings.Item("mailUsername")
    m.Password = ConfigurationSettings.AppSettings.Item("mailPassword")
    m.Sender = ConfigurationSettings.AppSettings.Item("sender")
    m.To = Conversions.ToString(rd.Item("Email"))
    m.CC = ConfigurationSettings.AppSettings.Item("Cc")
    m.BCC = ConfigurationSettings.AppSettings.Item("Bcc")
    m.Subject = "Some subject...."
    m.Body = "Some HTML body..."
    m.SendMail()

    ' when I add this line everything works!!!
    ' Threading.Thread.Sleep(200)
Loop

Что здесь происходит ???

Ответы [ 3 ]

2 голосов
/ 24 апреля 2012

Несмотря на то, что это поздний ответ, я надеюсь, что он может помочь следующему читателю

 Dim inte  As Integer
 Dim ji As Integer
 Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

        If Grid.Rows.Count > 0 Then
            Dim inte As Integer = Grid.Rows.Count
            inte = inte - 1
            For ji = 0 To inte
                Dim email As String = Grid.Rows(ji).Cells(4).Text
                sendmail(email)
            Next ji
        End If

    End Sub

Этот код сможет отправить электронное письмо в последний ряд таблицы. Надеюсь, что он будет работать, если не извиниться

2 голосов
/ 09 августа 2011

Разработчик, с которым я работаю, отвечает за рассылку новостных рассылок большой (более 100 000 пользователей) группе пользователей ежемесячно и имеет задержку 400 мс между отправленными письмами.Он делает это, чтобы почтовые серверы не выставляли его автоматически как спамера.Возможно, вы столкнулись с проблемами безопасности SendMail.Сколько писем вы отправляете за раз?Он прибыл на номер 400 мс из проб и ошибок.

0 голосов
/ 09 августа 2011

На самом деле я не отправляю большое количество писем (до 20), и в основном только одно.Но я заметил, что когда приложению нужно отправить одно письмо, оно не отправляется, если нужно отправить 3 письма, отправляются только первые два и так далее.Я не думаю, что это проблема здесь.

...