我编写了一个发送电子邮件的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使用语句?感谢。
答案 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