PowerShell脚本报错:无法读取CSV列,需实现用户+经理批量发邮件
PowerShell邮件脚本收件人读取问题排查与修复
问题场景
需求为循环读取CSV文件中User列的邮箱地址,为每一行的用户及其经理单独发送邮件(每封邮件收件人为用户邮箱+经理邮箱)。执行现有脚本时触发Outlook错误:
"We need to know who to send this to. Make sure you enter at least one name."
错误根源
- 未循环遍历CSV行:原脚本直接将整个CSV对象赋值给
Mail.To,Outlook无法解析这种对象格式的收件人 - 变量定义错误:
Users = import-csv -path $trimfileTest缺少变量前缀$,且$trimfileTest未定义(应为之前的$trimfile) - 收件人格式错误:未将用户和经理邮箱拼接为Outlook支持的分号分隔格式
修复后的完整脚本
Clear-Host Start-Transcript # -------------------------- 过滤CSV文件 -------------------------- $CSV = "Main.CSV" $EmptyColumns = "Hired", "Manager Email" $trimfile = "Trim_Main.CSV" $filterDate = (Get-Date).AddDays(1) # 导入CSV并过滤空列 $data = Import-Csv $CSV | Where-Object { $line = $_ # 检查指定列是否均非空 ($EmptyColumns | ForEach-Object { ![string]::IsNullOrEmpty(($line.$_.Trim('"'))) }) -notcontains $false } # 选择需要的列并按日期过滤后导出 $selectedData = $data | Select-Object -Property 'User', "Manager Email", "Hired" $selectedData | Where-Object { [datetime]$_.Hired -lt $filterDate } | Export-Csv $trimfile -NoTypeInformation # -------------------------- 循环发送邮件 -------------------------- # 导入过滤后的CSV $userList = Import-Csv -Path $trimfile # 初始化Outlook对象 $ol = New-Object -ComObject Outlook.Application # 遍历每一行数据发送邮件 foreach ($user in $userList) { # 拼接收件人:用户邮箱 + 经理邮箱,用分号分隔 $recipients = "$($user.User);$($user.'Manager Email')" # 创建新的邮件对象 $mail = $ol.CreateItem(0) $mail.To = $recipients $mail.Subject = "PS1 Script TestMail" $mail.Body = @" Test Mail 用户邮箱: $($user.User) 经理邮箱: $($user.'Manager Email') "@ $mail.Send() # 释放邮件对象资源 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($mail) | Out-Null } # 释放Outlook对象资源 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ol) | Out-Null Stop-Transcript
关键修复说明
- 循环遍历:通过
foreach循环处理CSV中的每一行数据,确保每个用户-经理组合单独发邮件 - 变量修正:修正变量前缀和路径名错误,保证CSV文件正确导入
- 收件人格式:将用户和经理邮箱拼接为分号分隔的字符串,符合Outlook收件人格式要求
- 资源释放:添加COM对象资源释放逻辑,避免Outlook进程残留
- 日期转换:明确将
Hired列转换为datetime类型,避免格式解析错误
内容的提问来源于stack exchange,提问作者Kevin Bonilla
相关产品推荐
相关产品推荐

