Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 我不断地犯错误;指定的字符串不是电子邮件地址所需的格式;使用发送邮件消息时_Arrays_Windows_Email_Powershell - Fatal编程技术网

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
}