使用附件时,Send-MailMessage 每 2 个连接关闭一次
Send-MailMessage closes every 2nd connection when using attachments
我正在尝试编写一个 powershell 脚本来向 30 个人发送带有几个附件的电子邮件。电子邮件是个性化的,因此必须单独发送。该脚本在没有附件的情况下工作得很好。但是,在使用附件时,Send-MailMessage 的所有其他实例都会失败并显示:
Send-MailMessage : Unable to write data to the transport connection:
An existing connection was forcibly closed by the remote host.
我wait/pause发送消息的时间间隔似乎无关紧要。即使我等待几分钟,第一个实例总是成功,下一个失败,下一个会成功,等等。我什至注意到在 运行 脚本之间,我的 ctrl+c 在偶数或奇数上决定了第一个 Send-MailMessage 实例的成功。如果最后一条消息失败,则第一条消息成功,反之亦然。
我的代码非常简单,我们只有一个包含所有用户的数组,并且
$array | foreach {
Write-Host "Sending Mail..."
Send-MailMessage -From 'myemail@domain' -To $_.EmailAddress
-SmtpServer 'fqdn'
-Attachments "1.pdf", "2.pdf"
-Subject 'Subject'
-Body ($html)
-BodyAsHtml
}
因此输出将类似于:
Sending Mail...
Sending Mail...
Send-MailMessage : Unable to write data to the transport connection:
An existing connection was forcibly closed by the remote host.
Sending Mail...
Sending Mail...
Send-MailMessage : Unable to write data to the transport connection:
An existing connection was forcibly closed by the remote host.
在没有错误的情况下,邮件完好无损地到达。
我可以 "fix" 这样做:
try { Send-MailMessage ... -EA Stop }
catch { Send-MailMessage }
因此,30/30 人将收到邮件(而不是 15/30),因为每次尝试(除了 #1)都失败了,但 catch 块中的代码总是能够成功。
当然,这不是一个真正的解决方案,我不想就这样离开它。有没有人知道这里发生了什么,以及如何解决它?
该错误似乎表明存在传输层问题。在不了解您的网络架构的情况下,很难确定。试试这个:
也许可以在您的 foreach 循环中添加等待时间,以查看是否有服务器正在限制(找不到更好的词)您的消息。在无法访问服务器配置的情况下,您的 hack 可能是您可以用它做的最好的事情。
就您的 try/catch 解决方案而言,这将在您这边产生最快的成功,但是,它会增加网络流量。从本质上讲,您是在强行突破您遇到的任何限制。
我相信我已经找到了最好的解决方案。非常感谢马特在评论中帮助我解决这个问题。
问题似乎源于 Send-Mailmessage
在完成发送邮件后未正确处理连接对象。 运行 Send-Mailmessage
与现有连接强制将其处置,因此 运行 第三次连接它会成功。
解决方法是 运行将 Send-Mailmessage
的每个实例作为单独的作业。至 :
PowerShell jobs have their own memory and resources. When the job is
done that memory is supposed to be removed.
因此,每次我们 运行 Send-Mailmessage
作为作业时,连接都会正确创建和处理。我还将其通过管道传输到 Wait-Job | Receive-Job
以自然地限制速率、查看输出并防止理论上可能出现的任何内存问题。
Start-Job -ScriptBlock {
Send-MailMessage -From 'mymail' -To 'theirmail' -SmtpServer 'fqdn' -Attachments "$($args[0]).pdf", "$($args[0]).pdf" -Subject 'subject' -Body ("test")
} -ArgumentList $PSScriptRoot | Wait-Job | Receive-Job
使用此方法不会产生任何错误,并且应该会减少 SMTP 服务器的负载。
我正在尝试编写一个 powershell 脚本来向 30 个人发送带有几个附件的电子邮件。电子邮件是个性化的,因此必须单独发送。该脚本在没有附件的情况下工作得很好。但是,在使用附件时,Send-MailMessage 的所有其他实例都会失败并显示:
Send-MailMessage : Unable to write data to the transport connection: An existing connection was forcibly closed by the remote host.
我wait/pause发送消息的时间间隔似乎无关紧要。即使我等待几分钟,第一个实例总是成功,下一个失败,下一个会成功,等等。我什至注意到在 运行 脚本之间,我的 ctrl+c 在偶数或奇数上决定了第一个 Send-MailMessage 实例的成功。如果最后一条消息失败,则第一条消息成功,反之亦然。
我的代码非常简单,我们只有一个包含所有用户的数组,并且
$array | foreach {
Write-Host "Sending Mail..."
Send-MailMessage -From 'myemail@domain' -To $_.EmailAddress
-SmtpServer 'fqdn'
-Attachments "1.pdf", "2.pdf"
-Subject 'Subject'
-Body ($html)
-BodyAsHtml
}
因此输出将类似于:
Sending Mail...
Sending Mail...
Send-MailMessage : Unable to write data to the transport connection: An existing connection was forcibly closed by the remote host.
Sending Mail...
Sending Mail...
Send-MailMessage : Unable to write data to the transport connection: An existing connection was forcibly closed by the remote host.
在没有错误的情况下,邮件完好无损地到达。
我可以 "fix" 这样做:
try { Send-MailMessage ... -EA Stop }
catch { Send-MailMessage }
因此,30/30 人将收到邮件(而不是 15/30),因为每次尝试(除了 #1)都失败了,但 catch 块中的代码总是能够成功。
当然,这不是一个真正的解决方案,我不想就这样离开它。有没有人知道这里发生了什么,以及如何解决它?
该错误似乎表明存在传输层问题。在不了解您的网络架构的情况下,很难确定。试试这个:
也许可以在您的 foreach 循环中添加等待时间,以查看是否有服务器正在限制(找不到更好的词)您的消息。在无法访问服务器配置的情况下,您的 hack 可能是您可以用它做的最好的事情。
就您的 try/catch 解决方案而言,这将在您这边产生最快的成功,但是,它会增加网络流量。从本质上讲,您是在强行突破您遇到的任何限制。
我相信我已经找到了最好的解决方案。非常感谢马特在评论中帮助我解决这个问题。
问题似乎源于 Send-Mailmessage
在完成发送邮件后未正确处理连接对象。 运行 Send-Mailmessage
与现有连接强制将其处置,因此 运行 第三次连接它会成功。
解决方法是 运行将 Send-Mailmessage
的每个实例作为单独的作业。至
PowerShell jobs have their own memory and resources. When the job is done that memory is supposed to be removed.
因此,每次我们 运行 Send-Mailmessage
作为作业时,连接都会正确创建和处理。我还将其通过管道传输到 Wait-Job | Receive-Job
以自然地限制速率、查看输出并防止理论上可能出现的任何内存问题。
Start-Job -ScriptBlock {
Send-MailMessage -From 'mymail' -To 'theirmail' -SmtpServer 'fqdn' -Attachments "$($args[0]).pdf", "$($args[0]).pdf" -Subject 'subject' -Body ("test")
} -ArgumentList $PSScriptRoot | Wait-Job | Receive-Job
使用此方法不会产生任何错误,并且应该会减少 SMTP 服务器的负载。