我试图写一个powershell脚本发送电子邮件与一些附件30人。电子邮件是个性化的,所以必须单独发送。没有附件,脚本工作得很好。但是,在使用附件时,发送邮件的其他每个实例都会失败,原因如下:
:无法将数据写入传输连接:现有连接被远程主机强制关闭。
发送消息之间的等待/停顿时间似乎并不重要。,即使我等待几分钟,第一个实例总是成功的,下一个实例将失败,下一个实例将成功,等等。我甚至注意到在运行脚本之间,偶数或奇数上的ctrl+c决定了发送邮件第一个实例的成功与否。如果最后一条消息失败,则第一条消息成功,反之亦然。
我的代码非常简单,我们只有一个包含所有用户的数组,并且
$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
}
因此,输出将类似于:
发邮件..。 发邮件..。 :无法将数据写入传输连接:现有连接被远程主机强制关闭。 发邮件..。 发邮件..。 :无法将数据写入传输连接:现有连接被远程主机强制关闭。
在没有错误的情况下,邮件会完好无损地到达。
我可以通过这样做来“解决”这个问题
try { Send-MailMessage ... -EA Stop }
catch { Send-MailMessage }
因此,30/30的人将收到邮件(而不是15/30),因为每一次尝试(除了#1)都失败了,但是catch块中的代码总是能够成功的。
当然,这不是一个真正的解决方案,我不想就这样离开。有没有人对这里发生的事情有任何洞察力,以及如何解决?
发布于 2017-04-12 10:20:32
我相信我已经找到了最好的解决办法。非常感谢马特在评论中帮助了我。
这个问题似乎是由Send-Mailmessage
产生的,当连接对象发送完邮件后,它就没有正确地处理它。使用现有连接运行Send-Mailmessage
将强制将其释放,从而第三次运行它将获得成功。
解决方法是将Send-Mailmessage
的每个实例作为单独的作业运行。转到quote Matt
PowerShell作业有自己的内存和资源。当工作完成后,内存应该被移除。
因此,每次我们作为作业运行Send-Mailmessage
时,都会正确地创建和处理连接。我还会将其传输到Wait-Job | Receive-Job
,以自然地限制速率,查看输出,并防止任何可能在理论上可能发生的内存问题。
Start-Job -ScriptBlock {
Send-MailMessage -From 'mymail' -To 'theirmail' -SmtpServer 'fqdn' -Attachments "$($args[0])\1.pdf", "$($args[0])\2.pdf" -Subject 'subject' -Body ("test")
} -ArgumentList $PSScriptRoot | Wait-Job | Receive-Job
使用此方法不会产生错误,并应减少SMTP服务器上的负载。
发布于 2017-04-11 08:37:53
该错误似乎表明存在传输层问题。如果不了解您的网络架构,就很难确定。试试这个:
可能会在foreach循环中添加一个等待,以查看是否有服务器正在节流(因为缺少更好的单词)您的消息。如果没有对服务器配置的访问,您的黑客很可能是最好的处理方法。
就您的尝试/捕获解决方案而言,这将在您的终端上产生最快的成功,但是,它将增加网络流量。你本质上是蛮横的,强迫你的方式越过任何你正在触及的限制。
https://stackoverflow.com/questions/43349726
复制