Arrays 我不断地犯错误;指定的字符串不是电子邮件地址所需的格式;使用发送邮件消息时
然而,前几行运行正常,当Arrays 我不断地犯错误;指定的字符串不是电子邮件地址所需的格式;使用发送邮件消息时,arrays,windows,email,powershell,Arrays,Windows,Email,Powershell,然而,前几行运行正常,当foreach启动时,它会出错并显示 指定的字符串不是电子邮件地址所需的格式 我不确定为什么会出现此错误,因为我已经使用输出字符串将$element转换为字符串$element不是电子邮件地址,而是一个碰巧具有名为EmailAddress的属性的对象 Out String只会生成一个多行字符串,控制台输出为$element | Format Table 不要使用输出字符串,只需直接参考电子邮件地址属性: #get max password age policy $maxP
foreach
启动时,它会出错并显示
指定的字符串不是电子邮件地址所需的格式
我不确定为什么会出现此错误,因为我已经使用
输出字符串将$element
转换为字符串$element
不是电子邮件地址,而是一个碰巧具有名为EmailAddress
的属性的对象
Out String
只会生成一个多行字符串,控制台输出为$element | Format Table
不要使用输出字符串
,只需直接参考电子邮件地址
属性:
#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;
}
}
或者,使用-as
将地址强制转换为对象。如果在If()
语句中类型检查失败,则不会执行Send MailMessage
$output = $element.EmailAddress
为避免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"
}
可以肯定的是,这里的问题是您希望$element
是一个单独的电子邮件地址,而实际上它是一个具有emailaddress
属性的对象。更改$EmailList
的填充:
Send-MailMessage -To $To @MailParams
然后可以更新循环:
$EmailList = ........ this remains the same |
Select-Object -ExpandProperty EmailAddress
我看不出$finaloutput
的意义,但您不再需要中间人变量$output
。我会做类似的事情:
foreach ($element in $EmailList) {
if ($finaloutput=$element.Contains(".")) {
Send-MailMessage -SmtpServer $SMTPServer -From $EmailFrom -To $element -Cc $EmailCc -Subject $EmailSubject -Body $emailbody -Bodyashtml;
}
}
$\ux.Contains(“.”
似乎是多余的,但您可以理解。使用Where Object{$}
我们可以过滤掉空值,因为用户可能没有电子邮件地址。您还可以将该逻辑移动到正在填充的$emaillist
语句后面添加一行“-$output-”
。在错误发生之前,它的输出是什么?我的钱在Select Object EmailAddress
应该是Select Object-Expand EmailAddress
。在我想象的{emailaddress循环中看起来像这样=matt@notmdomain.ca}
与您的问题无关:不要使用-Property*
,而是使用-Property emailaddress
,这样您就不会拖累很多不必要的属性。与您的问题相关:也可以在代码中添加Write Verbose$元素-Verbose
,以查看显示的内容。@boeprox Yes。。。那是肯定的。拉这些东西浪费了大量时间。这似乎已经解决了它!但是,现在我遇到了5次错误,即“不能对空值表达式调用方法”。我以为我已经通过contains if语句排除了空值?如果$output
为空,您可以使用if($output){do stuff}
。Contains是个问题,因为Contains是一个字符串方法,null无权访问它。非常感谢。我是一名实习生,在powershell没有任何经验,这应该会给我的老板留下深刻印象。非常感谢。出于某种原因,这似乎不起作用。它运行时没有错误,但没有发送任何错误emails@mplouque我在这里提供了一些建议,所以你必须帮助我,而不是它不起作用。$EmailList
是否包含您期望的内容?自从我给出2之后,您使用的是哪种代码示例?
foreach ($element in $EmailList) {
if ($finaloutput=$element.Contains(".")) {
Send-MailMessage -SmtpServer $SMTPServer -From $EmailFrom -To $element -Cc $EmailCc -Subject $EmailSubject -Body $emailbody -Bodyashtml;
}
}
$EmailList | Where-Object{$_} | ForEach-Object{
Send-MailMessage -SmtpServer $SMTPServer -From $EmailFrom -To $_ -Cc $EmailCc -Subject $EmailSubject -Body $emailbody -Bodyashtml
}