小编Jac*_*vin的帖子

使用附件时,Send-MailMessage 关闭每第二个连接

我正在尝试编写一个 powershell 脚本来向 30 人发送带有几个附件的电子邮件。电子邮件是个性化的,因此必须单独发送。该脚本在没有附件的情况下运行良好。但是,当使用附件时,Send-MailMessage 的每个其他实例都会失败,并显示:

Send-MailMessage : 无法将数据写入传输连接:远程主机强行关闭了现有连接。

在发送消息之间等待/暂停多长时间似乎并不重要。即使我等了几分钟,第一个实例总是会成功,下一个会失败,下一个会成功,等等。我什至注意到在运行脚本之间,我对偶数或奇数的 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
}
Run Code Online (Sandbox Code Playgroud)

因此,输出将类似于以下内容:

发送邮件...

发送邮件...

Send-MailMessage : 无法将数据写入传输连接:远程主机强行关闭了现有连接。

发送邮件...

发送邮件...

Send-MailMessage : 无法将数据写入传输连接:远程主机强行关闭了现有连接。

在没有错误的情况下,邮件会完好无损地到达。

我可以通过执行以下操作来“解决”这个问题:

try { Send-MailMessage ... -EA Stop }
catch { Send-MailMessage }
Run Code Online (Sandbox Code Playgroud)

结果,30/30 的人会收到邮件(而不是 15/30),因为每次尝试(除了 #1)都失败了,但是 catch 块中的代码总是能够成功。

当然,这不是一个真正的解决方案,我不想就这样离开它。有没有人对这里发生的事情有任何了解,以及如何解决它?

email powershell smtp smtpclient

3
推荐指数
1
解决办法
2872
查看次数

如何根据名称匹配过滤对象?

我要返回很多想要过滤的数据.酒店的名称包含此信息.我习惯于基于过滤| ? {$_.Name -eq 'Value'}.我希望能够使用隐藏.pscustomobject更动态地执行此操作.

$x = [pscustomobject]@{
   atruevalue = 'sometext'
   afalsevalue = 'sometext'
}

$x | ?{$_.psobject.Properties.Name -like '*true*'}
Run Code Online (Sandbox Code Playgroud)

我希望这会回来:

> atruevalue
> ----------  
> sometext
Run Code Online (Sandbox Code Playgroud)

但是,它只返回对象中的每个项目.

有谁能解释这种行为?

powershell

3
推荐指数
1
解决办法
226
查看次数

我可以使用变量访问对象的嵌套属性吗?

假设我有以下内容:

(Get-Date).psobject.Properties.Name
Run Code Online (Sandbox Code Playgroud)

我可以使用变量来访问属性:

$x = Name
(Get-Date).psobject.Properties.$x
Run Code Online (Sandbox Code Playgroud)

但是,我不能使用$ x来“扩展”嵌套属性:

$x = 'psobject.Properties.Name'
(Get-Date).$x
Run Code Online (Sandbox Code Playgroud)

因为在这种情况下,Powershell会将$ x视为整个字符串都是文字属性名称。

我发现有很多资源以不同的方式访问带有特殊字符的属性,但是没有关于如何做相反的事情的资源。

这可能吗?如果没有,为什么?

powershell

3
推荐指数
1
解决办法
547
查看次数

测试连接和变量

$server = "SOME_SERVER"
$target = "8.8.8.8"
Invoke-Command -ComputerName $server -ScriptBlock { Test-Connection -ComputerName $target }
Run Code Online (Sandbox Code Playgroud)

所以我有这个代码,它给我一个错误

无法验证参数'ComputerName'的参数.参数为null或空.提供非null或空的参数,然后再次尝试该命令.

奇怪的是,如果我换$target8.8.8.8最后一行,一切都很好.

有人可以向我解释一下吗?我一直在努力争取一个小时,并搜索互联网寻找答案,但没有找到任何解决方案.这是PowerShell中的某种错误吗?

BTW - 如果我调用$target它,它给了我8.8.8.8,类型是String,所以......

variables powershell null invoke-command

0
推荐指数
1
解决办法
616
查看次数

标签 统计

powershell ×4

email ×1

invoke-command ×1

null ×1

smtp ×1

smtpclient ×1

variables ×1