在PowerShell中,有没有一种方法可以处理Send-MailMessage资源?

3

我写了一个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()

有没有一种方法可以通过Dispose或类似于C#的using语句来强制释放Send-MailMessage在使用完毕后的资源?谢谢。


3
听起来像是TCP端口耗尽或者你正在受到远程服务器的Tar Pit攻击。你要发送多少条消息? - Bacon Bits
一旦部署到服务器上,它基本上每天只会是一封电子邮件。 - Ken Palmer
2个回答

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()

更不用说,这个功能应该(应当)被封装在一个函数中,在需要的地方使用。 - briantist
感谢您向我展示类构造函数。您是正确的,“冗长”的10行并不是什么大问题,但是由于这将成为更大脚本的一部分,因此任何为了清晰度而节省的行数都是好的。由于PowerShell对我来说是新的,所以我的一个想法是我可能忽略了一些明显的析构函数。 - Ken Palmer

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接