邮件控制台应用程序不发送最后一封邮件

时间:2011-08-09 09:10:22

标签: vb.net console-application sendmail

我有以下问题:

我写过很少发送电子邮件的控制台应用程序。它的行为方式如下:

  • 当我在调试模式下运行此应用程序并逐步完成代码时,它会发送电子邮件;
  • 当我在调试模式下运行此应用程序并且没有逐步完成代码时,最后一封电子邮件不会被发送;
  • 当我构建应用程序并将其移动到服务器并为其创建任务时,最后一封电子邮件不会被发送;
  • 当我从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 个答案:

答案 0 :(得分:2)

我与之合作的开发人员负责每月向大型(100k +)用户群发送简报,并在每封邮件之间建立400毫秒的延迟。他这样做是为了防止邮件服务器自动将他列为垃圾邮件发送者。您可能遇到SendMail安全问题。你一次发送多少封电子邮件?他从试错中到达了400毫秒的数字。

答案 1 :(得分:2)

即使这是迟到的回复,我希望它可以帮助下一位读者

 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 :(得分:0)

实际上,我不发送大量邮件(最多20个),而且大多数只发送一个。但我注意到,当应用程序需要发送一封邮件时,它不会被发送,如果需要发送3封邮件,只发送前两封等等。我不认为这是一个问题。