![](/img/trans.png)
[英]PowerShell Send-MailMessage to multiple recipients from scheduled task
[英]I keep getting the error “the specified string is not in the form required for an email address” when using Send-MailMessage
#get max password age policy
$maxPwdAge=(Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge.Days
#expiring in 7 days
$7days=(get-date).AddDays(7-$maxPwdAge).ToShortDateString()
$EmailList = Get-ADUser -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False -and PasswordLastSet -gt 0} –Properties * |
where {($_.PasswordLastSet).ToShortDateString() -le $7days} |
Select-Object EmailAddress
$EmailFrom = "code.example@email.com"
$EmailCc = "code.example2@email.com"
$EmailSubject = "Example subject"
$emailbody = "example body"
$SMTPServer = "192.168.8.130"
foreach ($element in $EmailList) {
$output = Out-String -InputObject $element ;
if ($finaloutput=$output.Contains(".")) {
Send-MailMessage -SmtpServer $SMTPServer -From $EmailFrom -To $output -Cc $EmailCc -Subject $EmailSubject -Body $emailbody -Bodyashtml;
}
}
前几行运行正常,但是,当foreach
启动时,它会出错并说
指定的字符串不是电子邮件地址所需的格式。
我不确定为什么会收到此错误,因为我已经使用Out-String
将$element
转换为Out-String
。
$element
不是电子邮件地址,而是恰好具有名为EmailAddress
的属性的对象。
Out-String
仅会导致多行字符串,并且控制台输出为$element| Format-Table
$element| Format-Table
。
不要使用Out-String
,只需直接引用EmailAddress
属性即可:
$output = $element.EmailAddress
或者,使用-as
将地址转换为mailaddress
对象。 如果类型检查在if()
语句中失败,则不会执行Send-MailMessage
。
if(($To = $element.EmailAddress -as [mailaddress])) {
Send-MailMessage -To $To
}
为了避免Send-MailMessage
线变得太长,使用泼溅表:
$MailParams = @{
"From" = "code.example@email.com"
"Cc" = "code.example2@email.com"
"Subject" = "Raw intelligence!"
"Body" = "Howdy! Here are some datez n stuff"
"SmtpServer" = "192.168.8.130"
}
然后在循环中:
Send-MailMessage -To $To @MailParams
可以肯定的是,这里的问题是您希望$element
实际上是具有emailaddress
属性的对象时,它是一个单独的电子邮件地址。 更改$EmailList
:
$EmailList = ........ this remains the same |
Select-Object -ExpandProperty EmailAddress
然后可以更新您的循环:
foreach ($element in $EmailList) {
if ($finaloutput=$element.Contains(".")) {
Send-MailMessage -SmtpServer $SMTPServer -From $EmailFrom -To $element -Cc $EmailCc -Subject $EmailSubject -Body $emailbody -Bodyashtml;
}
}
我看不到$finaloutput
的意义,但您不再需要中间人变量$output
。 我会做类似的事情:
$EmailList | Where-Object{$_} | ForEach-Object{
Send-MailMessage -SmtpServer $SMTPServer -From $EmailFrom -To $_ -Cc $EmailCc -Subject $EmailSubject -Body $emailbody -Bodyashtml
}
$_.Contains(".")
似乎是多余的,但您可以理解。 使用Where-Object{$_}
我们可以过滤出空值,因为有可能用户没有电子邮件地址。 您也可以将该逻辑移动到填充$emaillist
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.