2

(ループを使用して) 1 回のショットで 100 通の電子メールを送信する必要があるシナリオがありますが、SMTP セッションごとに 1 つの電子メールを送信することも許可されていません。

現在、100 通の電子メールすべてが同じ SMTP セッションを共有しています。

SmtpClient.Dispose() を呼び出すと、必要なものが処理されると考えていました。間違っている場合は修正してください。

したがって、基本的に3つの質問:

  1. SmtpClient.Dispose() は必要なものを処理してくれますか?
  2. はいの場合、サーバー上の他のサービスに影響を与えずに SmtpClient を Dispose() しても安全ですか?
  3. いいえの場合、私が望むものを達成するための正しいアプローチは何ですか?

サンプルコード:

Private Shared Sub SendMail(ByVal MailServer As SmtpClient, ByVal body As String, ByVal Subject As String, ByVal FromEmail As String, _
                               ByVal ToEmailList As String, Optional ByVal AttFile As Attachment = Nothing)

    Dim message As New MailMessage

    Try
        message.From = New MailAddress(FromEmail)

        message.Subject = Subject
        message.IsBodyHtml = False
        message.Body = body
        message.Priority = MailPriority.High

        If Not AttFile Is Nothing Then
            message.Attachments.Add(AttFile)
        Else
            message.Attachments.Add(AttFile)
        End If

        MailServer.Send(message)
    Catch ex As Exception
        Throw New ApplicationException("SERVICE1.SendMail ERROR -- Error sending email [ERROR]:[" & ex.Message.ToString & "] " & vbCrLf & "To:" & ToEmailList & vbCrLf & "From:" & FromEmail & vbCrLf & "Subject: " & Subject & vbCrLf & "Body: " & body)
    End Try
    message.Dispose()
End Sub

そして、これはメソッドがどのように実行されているかです:

 For Each Item In ItemListCollection
 m_MailServer = New SmtpClient(MailServerName)
 MailServer.Credentials = New System.Net.NetworkCredential(MailServerUserName, MailServerPassword)
 SendMail(WeeklyMailServer, msgBody, msgSubject, MsgFromEmail, "xyz@abc.com", rptAttachment)
 Next
4

2 に答える 2

3

これを using ステートメントでラップし、実行がブロックを離れたときに確実に破棄されるようにすることができます。また、同じ SmtpClient を使用して、Send をループ内で複数回呼び出すことができます。

Using client = New SmtpClient()

    For i As Integer = 0 To 99
        Dim message = New MailMessage()
        'initialization of whatever is needed
        ' message creation

        client.Send(message)

    Next
End Using
于 2013-01-17T23:01:54.233 に答える
1

実行ループ内では、コードをUsingブロックで囲むことができます。smtpclientこれにより、電子メールごとに個別に使用され、適切に破棄/閉じられます。

 For Each Item In ItemListCollection
   using m_MailServer as New SmtpClient(MailServerName)
     MailServer.Credentials = New System.Net.NetworkCredential(MailServerUserName, MailServerPassword)
     SendMail(WeeklyMailServer, msgBody, msgSubject, MsgFromEmail, "xyz@abc.com", rptAttachment)
   end using
   Next
于 2013-01-17T23:47:15.803 に答える