2017-07-25 117 views
3

我寫過一個發送電子郵件的PowerShell腳本。最初我使用了Send-MailMessage命令行開關。在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() 

是否有某種方式來強制,當我用它通過處置或者使用C#風格的語句來完成的,或許發送,以MAILMESSAGE釋放資源?謝謝。

+3

聽起來像潛在的TCP端口耗盡,或者你正在通過遠程服務器獲取焦點。您嘗試發送多少條消息? –

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

更不用說,這個功能可以(應該)包裹在一個函數中,在需要的地方使用。 – briantist

+0

感謝您向我展示類構造函數。你說得對,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 
相關問題