You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
}

关键修正点

  1. 使用Select-Object -ExpandProperty 'Server Owner'直接提取纯邮箱地址字符串,避免对象转字符串的错误格式;
  2. 将EmailNotification函数调用放在foreach循环内部,确保每个分组都触发一次邮件发送;
  3. 简化数组处理,PowerShell会自动将单个或多个元素转为数组,无需手动用@()包裹;
  4. 优化邮件正文格式,使用Here-String让代码更易读。

内容的提问来源于stack exchange,提问作者Anirban Banerjee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 10:50:08