PowerShell数组转邮件收件人字段报错及批量收件问题求助
问题:按Operating Model分组发送邮件的两个故障解决
需要基于Operating Model字段筛选收件人,为每个分组发送包含该组所有收件人的邮件,但存在两个故障:
- 初始代码执行时,
Send-MailMessage报5.1.3 Bad recipient address syntax错误,收件人字段处理不符合要求; - 调整代码后能获取唯一邮箱地址,但每个
Operating Model分组仅能发送给单个收件人,无法覆盖全部收件人。
初始循环代码
foreach($opModel in $opModelarr){ $filterOp = @($XLSfile |Where-Object {$_.'Operating Model' -eq $opModel.Name}) $emailArray = @( $filterOp | Select-Object 'Email Address'|Get-Unique -AsString |% {[string]$_}) echo $opModel.Name echo @(,$emailArray) } // Calling email Function EmailNotification @(,$emailArray) $($MasterLogFile) $opModel.Name
初始代码输出结果
ROE @{Server Owner=noopur@gmail.com} @{Server Owner=riya@gmail.com} @{Server Owner=noopur@gmail.com} AOE @{Server Owner=riya@gmail.com} LOCAL @{Server Owner=roshan@gmail.com} FOE @{Server Owner=akhil@gmail.com} SOE @{Server Owner=nidhi@gmail.com} BLO @{Server Owner=jaspal@gmail.com} NGO @{Server Owner=prashant@gmail.com}
邮件发送函数代码
Function EmailNotification ([string[]]$ToEmail, [string]$LogFileToAttach, [string]$OpModel){ $emailServer ="myServer.gmail.com" $emailFrom = "NoReply-Junkey <no-reply@gmail.com>" $emailSubject = "Feedback from Automated Junkey Window for OpModel: $OpModel" $emailNotifyBody = "Hello <br> <p>Please find the feedback from Automated Email notification for the Junkey have. </p> <p>Do not Respond. On Issue reach out to @ for help. </p> <p>Regards</p> <p>Automated Junkey Status</p>" Send-MailMessage -SmtpServer $emailServer ` -From $emailFrom ` -To $ToEmail ` -CC 'anirban@gmail.com' ` -Subject $emailSubject ` -Body $emailNotifyBody ` -Priority Low ` -DeliveryNotificationOption None ` -BodyAsHTML }
错误信息
Send-MailMessage : Syntax error in parameters or arguments. The server response was: 5.1.3 Bad recipient address syntax At D:\Junkey not reporting from past 30 days\JunkeyAutomatedEmail.ps1:24 char:5 + Send-MailMessage -SmtpServer $emailServer ` + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Net.Mail.SmtpClient:SmtpClient) [Send-MailMessage], SmtpException + FullyQualifiedErrorId : SmtpException,Microsoft.PowerShell.Commands.SendMailMessage
调整后的代码
$opModelarr = @($XLSfile | Select-Object -ExpandProperty 'Operating Model' |Sort-Object -Unique) #echo $opModelarr foreach($opModel in $opModelarr){ $filterOp = @($XLSfile |Where-Object {$_.'Operating Model' -eq $opModel}) $emailArray = @( $filterOp | Select-Object -ExpandProperty 'Server Owner'|Sort-Object -Unique |% {[string]$_}) } EmailNotification @(,$emailArray) $($MasterLogFile) $opModel.Name
故障原因分析与解决方案
问题1:收件人地址语法错误
从初始代码输出可见,$emailArray中的元素是@{Server Owner=xxx@gmail.com}格式的对象字符串,而非纯邮箱地址。原因是:
- 初始代码用
Select-Object 'Email Address'未添加-ExpandProperty,获取的是包含字段的对象,不是纯字符串; - 后续
[string]$_仅将对象转为字符串形式,未提取邮箱地址值。
问题2:仅发送给单个收件人
调整后的代码将邮件发送函数放在foreach循环外部,导致仅使用循环最后一次的$emailArray和$opModel值发送邮件,未遍历每个分组执行发送操作。
修正后的完整代码
# 获取唯一的Operating Model列表 $opModelarr = $XLSfile | Select-Object -ExpandProperty 'Operating Model' | Sort-Object -Unique # 遍历每个Operating Model分组 foreach($opModel in $opModelarr){ # 筛选当前分组的所有记录 $filterOp = $XLSfile | Where-Object {$_.'Operating Model' -eq $opModel} # 提取去重后的纯邮箱地址数组 $emailArray = $filterOp | Select-Object -ExpandProperty 'Server Owner' | Sort-Object -Unique # 调用邮件发送函数,传入当前分组的收件人列表 EmailNotification -ToEmail $emailArray -LogFileToAttach $MasterLogFile -OpModel $opModel } # 邮件发送函数 Function EmailNotification ([string[]]$ToEmail, [string]$LogFileToAttach, [string]$OpModel){ $emailServer ="myServer.gmail.com" $emailFrom = "NoReply-Junkey <no-reply@gmail.com>" $emailSubject = "Feedback from Automated Junkey Window for OpModel: $OpModel" $emailNotifyBody = @" Hello <br> <p>Please find the feedback from Automated Email notification for the Junkey.</p> <p>Do not Respond. On Issue reach out to @ for help.</p> <p>Regards</p> <p>Automated Junkey Status</p> "@ Send-MailMessage -SmtpServer $emailServer ` -From $emailFrom ` -To $ToEmail ` -CC 'anirban@gmail.com' ` -Subject $emailSubject ` -Body $emailNotifyBody ` -Priority Low ` -DeliveryNotificationOption None ` -BodyAsHTML }
关键修正点
- 使用
Select-Object -ExpandProperty 'Server Owner'直接提取纯邮箱地址字符串,避免对象转字符串的错误格式; - 将
EmailNotification函数调用放在foreach循环内部,确保每个分组都触发一次邮件发送; - 简化数组处理,PowerShell会自动将单个或多个元素转为数组,无需手动用
@()包裹; - 优化邮件正文格式,使用Here-String让代码更易读。
内容的提问来源于stack exchange,提问作者Anirban Banerjee
相关产品推荐
相关产品推荐

