PowerShell遍历CSV列表单独发送邮件失败求助
问题排查与修复方案
核心问题梳理
- 未定义变量引用:使用了未声明的
$trimfiletest变量,实际应指向之前导出的$trimfile文件 - 列名不匹配:
$userColumn被设为"User",但后续筛选的目标字段是"Learner Email",导致无法正确读取邮箱地址 - 对象传递错误:遍历
$use时直接将对象传给Recipients.add()和To属性,未提取具体的邮箱字符串 - 重复创建COM对象:循环内每次创建新的Outlook实例,既低效又可能引发COM对象异常
- 日期逻辑偏差:
AddDays(1)将过滤条件设为"早于明天",不符合注释中"早于今天"的需求;且未验证日期转换有效性,可能保留无效数据 - Trim语法错误:
Trim("""")的转义格式错误,无法正确去除字符串两端的引号
修正后的完整脚本
$CSV = "Rootfile.csv" $EmptyColumns = "Hired", "Manager Email" $userColumn = "Learner Email" # 修正列名匹配实际字段 $managerColumn = "Manager Email" $trimfile= "trimfile.csv" # 修正日期过滤:取今天零点,筛选入职时间早于今天的记录 $filterDate = (Get-Date).Date # 导入CSV并过滤空列,修正Trim语法 $data = Import-Csv $CSV | Where-Object{ $line = $_ ($EmptyColumns | ForEach-Object{ ![string]::IsNullOrEmpty(($line.$_.Trim('"'))) # 正确去除引号 }) -notcontains $false } # 选择目标列并过滤日期,增加日期转换验证 $selectedData = $data | Select-Object -Property 'Learner Email', "Manager Email", "Hired" $selectedData | Where-Object { $hiredDate = $_.Hired -as [DateTime] $hiredDate -and $hiredDate -lt $filterDate # 确保日期转换成功再比较 } | Export-Csv -Path $trimfile -NoTypeInformation # 避免CSV头部冗余类型信息 # 初始化Outlook对象放到循环外,提升效率 $ol = New-Object -ComObject Outlook.Application $Use = Import-Csv $trimfile | Select-Object $userColumn foreach ($user in $Use){ $newOl = $ol.CreateItem(0) # 提取具体的邮箱地址属性 $emailAddress = $user.$userColumn $newOl.To = $emailAddress $newOl.Type = 3 # 若需普通收件人可改为0,3代表密件抄送 $newOl.Subject = "TEST" $newOl.Body = "############################################# IGNORE #############################################" $newOl.Send() # 释放邮件对象避免内存泄漏 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($newOl) | Out-Null } # 释放Outlook对象 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ol) | Out-Null
关键修改说明
- 变量与列名对齐:将
$trimfiletest替换为$trimfile,$userColumn改为"Learner Email",确保数据读取路径和字段匹配 - COM对象优化:将Outlook实例创建移至循环外,循环内使用后及时释放对象,避免内存泄漏
- 日期处理严谨化:使用
(Get-Date).Date获取今日零点时间,确保筛选逻辑符合预期;增加日期转换验证,过滤无效日期数据 - 邮箱地址提取:通过
$user.$userColumn获取具体的邮箱字符串,而非直接传递对象 - CSV导出优化:添加
-NoTypeInformation参数,移除CSV头部冗余的类型信息
内容的提问来源于stack exchange,提问作者Kevin Bonilla
相关产品推荐
相关产品推荐

