0

示したコードのように、VB.NET を介してメールを送信しています。

    Dim retval As Integer
    Dim attachment As System.Net.Mail.Attachment = Nothing
    If fileName <> "" Then
        attachment = New System.Net.Mail.Attachment(fileName)
    End If

    Dim client As New SmtpClient()
    With client
        .EnableSsl = True
        .Host = smtpServerAddress
        .Port = 587
        .DeliveryMethod = SmtpDeliveryMethod.Network
        .UseDefaultCredentials = False
        .Credentials = New NetworkCredential(FromEmailId, password)
        AddHandler .SendCompleted, AddressOf SendCompletedCallback
    End With

    Dim mail = New MailMessage(FromEmailId, toEmailId)
    With mail
        .Priority = MailPriority.High
        .Subject = subject
        .SubjectEncoding = System.Text.Encoding.UTF8
        .IsBodyHtml = False
        If fileName <> "" Then
            .Attachments.Add(attachment)
        End If
        .Body = msgBody
        .BodyEncoding = System.Text.Encoding.UTF8
    End With

    Try
        client.SendAsync(mail, "")
        retval = 1
    Catch ex As Exception
        retval = 0
        MsgBox(ex.Message, MsgBoxStyle.Critical)
    End Try

    Return retval

この作品はいいですね。問題は、インターネットに接続していない場合、Try/Catch ブロックが期待どおりに反応しないことだけです。メールが送信されなかったことを知る唯一の方法は、コールバックからのメッセージを受信して​​いないことです。これには長い時間がかかる可能性があります。また、メールが正常に送信されるなどの関数から 1 が返されます。

インターネット接続が存在するかどうか、およびメールの送信が開始されているかどうかを確認する通常の方法はどれですか?

4

1 に答える 1

0

SmtpClient からスローされたすべての例外をキャッチしたい場合は、メールを同期的に送信できます。非同期の方法を好む場合は、エラー ハンドラーを設定するために ContinueWith を呼び出すことができる Task インスタンスを返すSendMailAsyncを使用します。

client.SendMailAsync(mail).ContinueWith(t=>HandleError(t.Exception), TaskContinuationOptions.OnlyOnFaulted)
于 2012-10-14T23:34:37.467 に答える