在PowerShell中,有没有办法处理Send-MailMessage资源?

时间:2017-07-25 16:12:13

标签: powershell email

我编写了一个发送电子邮件的PowerShell脚本。最初我使用了Send-MailMessage命令行开关。

Send-MailMessage -SmtpServer $MailServer `
-To $MailTo `
-From $MailFrom `
-Subject $MailSubject `
-Body $MailBody

这很简洁。但是,如果我在工作站上连续快速执行脚本,PowerShell控制台中会出现以下错误。

  

无法从传输连接中读取数据:已建立   连接被主机中的软件中止。

我怀疑资源没有被释放或者线程被阻止了。以下是我目前的解决方法,它具有一次性使用的优点。我可以快速连续运行,没有传输连接错误。但这比Send-MailMessage更冗长。

[object]$SMTPClient = New-Object System.Net.Mail.SmtpClient
[object]$MailMessage = New-Object System.Net.Mail.MailMessage
$SMTPClient.Host = $MailServer
$MailMessage.To.Add($MailTo)
$MailMessage.From = $MailFrom
$MailMessage.Subject = $MailSubject
$MailMessage.Body = $MailBody
$SMTPClient.Send($MailMessage)
$MailMessage.Dispose()
$SMTPClient.Dispose()

有没有办法强制Send-MailMessage在我完成它时释放资源,可能是通过Dispose或C#style使用语句?感谢。

2 个答案:

答案 0 :(得分:4)

坦率地说,"它有效,但它很冗长"不应该是一个巨大的问题,特别是当"冗长"意味着10行。我的意思是,您可以使用类构造函数来简化语法:

$SMTPClient = New-Object -TypeName System.Net.Mail.SmtpClient -ArgumentList $MailServer
$MailMessage = New-Object -TypeName System.Net.Mail.MailMessage -ArgumentList $MailFrom, $MailTo, $MailSubject, $MailBody
$SMTPClient.Send($MailMessage)
$MailMessage.Dispose()
$SMTPClient.Dispose()

答案 1 :(得分:2)

根据注释,您可能会溢出cmdlet的任何缓冲区。通过使用splatting,这个答案更像是关于未来风格的点(发生错误的可能性更小):

$MailMessage = @{
  SmtpServer = $MailServer;
  To         = $MailTo;
  From       = $MailFrom;
  Subject    = $MailSubject;
  Body       = $MailBody;
}

Send-MailMessage @MailMessage

编辑 -
这也可以通过选择的答案来完成:

$Client = @{
  TypeName = 'System.Net.Mail.SmtpClient';
  ArgumentList = $MailServer;
}
$Message = @{
  TypeName = 'System.Net.Mail.MailMessage';
  ArgumentList = @($MailFrom,$MailTo,$MailSubject,$MailBody);
}
$SMTPClient = New-Object @Client
$MailMessage = New-Object @Message