2013-01-17 94 views
2

我有一个场景,我需要一次发送100封电子邮件(使用循环),但我也不允许每个SMTP会话发送1封电子邮件。在.NET中调用SmtpClient.Dispose()是否安全?

现在,所有100封电子邮件都共享相同的SMTP会话。

我在想,调用SmtpClient.Dispose()将照顾我需要的东西。如果我错了,请纠正我。

所以,基本上3个问题:

  1. 威尔SmtpClient.Dispose()照顾我需要什么?
  2. 如果是,是否安全Dispose()SmtpClient而不影响 服务器上的其他服务?
  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, "[email protected]", rptAttachment) 
Next 
+0

你能展示一部分代码,包括循环吗? – scartag

+0

更新了示例代码 – Learner

+0

听起来你的服务提供商想阻止你滥用他的服务。不,Dispose()方法不是您与服务提供商签订的合同义务的解决方法。您需要与您的提供商谈判另一份使用协议。 –

回答

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 
+0

是否意味着每个发送的电子邮件(全部100封电子邮件)将创建它自己的SMTP会话? – Learner

+0

@Mihir不!他们将全部使用我们在顶部创建的相同实例 – scartag

+0

所以这就是我不想要的。它会发送15封电子邮件,而不是抛出我的错误,因为我们已将限制设置为每个会话15封电子邮件。 – Learner

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, "[email protected]", rptAttachment) 
    end using 
    Next 
相关问题