【问题标题】:In PowerShell, is there a way to dispose of Send-MailMessage resources?在 PowerShell 中,有没有办法处理 Send-MailMessage 资源?
【发布时间】:2017-07-25 16:12:13
【问题描述】:

我编写了一个发送电子邮件的 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# 风格的 using 语句?谢谢。

【问题讨论】:

  • 听起来像是潜在的 TCP 端口耗尽,或者您正在被远程服务器坑 tar。您要发送多少条消息?
  • 一旦部署到服务器上,基本上每天只有一封电子邮件。

标签: powershell email


【解决方案1】:

坦率地说,“它有效,但它很冗长”不应该是一个大问题,尤其是当“冗长”意味着 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()

【讨论】:

  • 更不用说,这个功能可以(应该)被包装在一个函数中,在需要的地方使用。
  • 感谢您向我展示类构造函数。你是对的,10 行的“冗长”没什么大不了的,但这将是一个更大的脚本的一部分,所以为了清晰起见,任何行节省都是好的。由于 PowerShell 对我来说是新的,一个想法是我忽略了一些明显的解构函数。
【解决方案2】:

根据评论,您可能会溢出 cmdlet 的任何缓冲区。这个答案更多的是通过使用飞溅来为未来的风格(发生错误的机会更少)提供一点:

$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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    相关资源
    最近更新 更多