繁体   English   中英

使用Send-MailMessage时,我不断收到错误消息“指定的字符串不是电子邮件地址所需的格式”

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM