vb.net如何在win form程序中检测电子邮件是否无法送达

vb.net如何在win form程序中检测电子邮件是否无法送达,vb.net,email,Vb.net,Email,我有以下代码: Public Function VerstuurMail(ByVal strFrom As String, ByVal strTo As String, ByVal strSubject As String, ByVal strBody As String, ByVal strMailSMTP As String, ByVal MailUser As String, ByVal MailPassword As String, ByVal MailPort As Integer,

我有以下代码:

Public Function VerstuurMail(ByVal strFrom As String, ByVal strTo As String, ByVal strSubject As String, ByVal strBody As String, ByVal strMailSMTP As String, ByVal MailUser As String, ByVal MailPassword As String, ByVal MailPort As Integer, Optional ByVal AttachmentFiles As String = "") As String

    Try

        'create the mail message
        Dim mail As New MailMessage()

        Dim basicCredential As New NetworkCredential(MailUser, MailPassword)

        'set the addresses
        mail.From = New MailAddress(strFrom)
        mail.To.Add(strTo)

        'set the content
        mail.Subject = strSubject
        If File.Exists(strBody) = True Then
            Dim objReader As New System.IO.StreamReader(strBody, System.Text.Encoding.GetEncoding(1252))
            mail.Body = objReader.ReadToEnd
            objReader.Close()
        End If
        mail.IsBodyHtml = False

        'send the message
        Dim smtp As New SmtpClient(strMailSMTP)
        smtp.DeliveryMethod = SmtpDeliveryMethod.Network
        smtp.EnableSsl = True
        'smtp.UseDefaultCredentials = True
        smtp.Credentials = basicCredential
        smtp.Port = MailPort

        Dim AttachmentFile As String() = AttachmentFiles.Split("*")
        For Each bestand In AttachmentFile
            If System.IO.File.Exists(bestand) Then
                mail.Attachments.Add(New Attachment(bestand))
            Else
                Call MessageBox.Show("File can't be found")
            End If
        Next

        'Dim userState As Object = mail
        'smtp.SendAsync(mail, userState)
        'AddHandler smtp.SendCompleted, AddressOf SendCompletedCallback

        smtp.Send(mail)
        mailSent = True

        smtp.Dispose()

    Catch ex As Exception
        mailSent = False
        Call MessageBox.Show(ex.Message & vbCrLf & "Didn't sent to: " & strTo & vbCrLf & " with extra error message:" & vbCrLf & ex.ToString)
    Finally

    End Try

    Return mailSent

End Function
此函数用于一个程序,该程序读取一个文本文件,其中的参数在一行上,并在有多少行时调用。(循环中) 这很好用

现在,当文本文件有一个错误的电子邮件地址时,该函数不会出错,它只是将电子邮件发送给任何人

示例:向发送邮件joe@gmail.com工作,发送电子邮件至joe@hmail.com未发送,但也未给出错误

我在谷歌上搜索过,但示例中说我应该使用“smtp.SendAsync(mail,userState)” 但是程序不再循环往复,也不再发送邮件。我无法使用调试器并单步执行代码。它只是从一个地方跳到另一个地方

这是另一个功能:

   Private Sub SendCompletedCallback(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)

    Dim mail As MailMessage = CType(e.UserState, MailMessage)

    'write out the subject
    Dim subject As String = mail.Subject

    'If e.Cancelled Then
    '    Call MessageBox.Show("Send canceled: " & Now & " token " & subject)
    '    MailLog &= "Send canceled" & vbCrLf
    'End If

    If Not e.Error Is Nothing Then
        Call MessageBox.Show("Foutmelding op: " & Now & " onderwerp " & subject & " met error: " & e.Error.ToString())
        MailLog = MailLog & "Niet verstuurd met als fout melding: " & e.Error.ToString() & vbCrLf
    Else
        'Call MessageBox.Show("Message sent at: " & Now)
        MailLog = MailLog & "Bericht verstuurd op: " & Now & vbCrLf
    End If

    mailSent = True

End Sub
提前谢谢。我希望有人能帮我找到正确的方向


Brian

这是一个数据问题,而不是发送电子邮件的实际机制问题。最好使用正则表达式确保电子邮件地址根据的规则有效,如下所示:

string email = txtemail.Text;
Regex regex = new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
Match match = regex.Match(email);

if (match.Success)
{
    Response.Write(email + " is valid.");
}
else
{
    Response.Write(email + " is invalid.");
}
不幸的是,
joe@hmail.com根据上述逻辑,
是有效的电子邮件地址,但不是预期的
joe@gmail.com
地址,因此它会出现在错误的位置。当发现是错误的电子邮件地址时,将数据更改为正确的值是唯一正确的做法


注意:一般来说,当某人注册网站时,您会验证其电子邮件地址,因此系统“知道”该电子邮件地址是合法/正确的,因为他们成功地收到了一封电子邮件,并输入了验证码或点击了一个链接,该链接通过网站验证他们确实收到了电子邮件。这解决了大多数数据问题(拼写错误、输入值不正确等)


经过整整两天的测试和搜索,我发现在使用时:

    Dim userState As Object = mail
    smtp.SendAsync(mail, userState)
    AddHandler smtp.SendCompleted, AddressOf SendCompletedCallback
不应使用smtp.Dispose()关闭smtpClient

回调函数不断收到cancel错误

我还使用backgroundworker发送了许多邮件,但async在某种程度上是一个backgroundworker。所以我有两个后台工作人员,但那根本不起作用

我花了两天时间


布莱恩

你如何知道哪些电子邮件是“正确的”?换句话说,你只能发送到应用程序中的
@gmail.com
帐户或任何电子邮件地址吗?这个程序被用作发票发送者,因此当客户抱怨他今天没有收到发票时。当用户在其他程序数据库中检查他的电子邮件地址时,他可以看到有拼写错误。我用gmail电子邮件地址作为拼写错误的例子。你是在问如何检测电子邮件是否因为地址不存在而无法发送?如果是这样的话,您可能需要编辑标题,以显示尽可能多的内容。谢谢。我已经更改了标题。谢谢你,卡尔,但我问得不清楚。我已经改变了问题。它不是用于网站,而是用于winform程序。将该程序添加到现有程序中,在电话会议中输入电子邮件地址。我自己也有拼写问题,但我只能编辑5分钟。这是“对话”。很抱歉