使用Send-MailMessage从CSV批量发邮件时收件人语法错误求助
问题解决:Send-MailMessage 收件人地址语法错误
问题重现
有一个包含重复邮箱的CSV文件:
Email_Address a@gmail.com b@hotmail.com c@aol.com d@yahoo.com b@hotmail.com
编写EmailNotification函数批量发送邮件时,传入处理后的收件人列表触发SMTP服务器报错:
Send-MailMessage : Syntax error in parameters or arguments. The server response was: 5.1.3 Bad recipient address syntax At D:\Change\PutChange.ps1:29 char:5 + Send-MailMessage -SmtpServer $emailServer ` + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Net.Mail.SmtpClient:SmtpClient) [Send-MailMessage], SmtpException + FullyQualifiedErrorId : SmtpException,Microsoft.PowerShell.Commands.SendMailMessage
错误原因
核心问题在于对Send-MailMessage的-To参数理解错误:
-To参数接受的是字符串数组(多个独立的邮箱地址字符串),而非拼接成带单引号的单个字符串- 你生成的
$emailToArray是类似'a@gmail.com', 'b@hotmail.com'的单个字符串,PowerShell会将其作为一个收件人地址传递,SMTP服务器无法识别这种带引号的格式
修复步骤
- 修改函数参数类型:将
$ToEmail的类型从[string]改为[string[]],支持接收数组 - 正确生成收件人数组:直接提取去重后的邮箱数组,不需要拼接引号
- 正常调用函数:直接传入数组参数即可
修改后的完整代码
修正后的EmailNotification函数
Function EmailNotification ([string[]]$ToEmail, [string]$LogFileToAttach, [string]$Change){ $emailServer = "mailhosts.svc.net" $emailFrom = "NoReply-Feedback <no-reply@feedback.com>" $emailSubject = "Feedback from Automated Window - $Change" $emailBody = "Hello <br> <p>Please find the feedback from Automated Email notification for the Change you have raised. </p> <p>Do not Respond. On Issue reach out for help. </p> <p>Regards</p> <p>Automated Window</p>" Send-MailMessage -SmtpServer $emailServer ` -From $emailFrom ` -To $ToEmail ` -Subject $emailSubject ` -Body $emailBody ` -Attachments $LogFileToAttach ` -Priority Low ` -DeliveryNotificationOption None ` -BodyAsHTML }
读取CSV并调用函数
# 读取CSV文件 $CSVfile = Import-Csv -Path "你的CSV文件路径.csv" # 提取去重后的邮箱数组 $emailToArray = @($CSVfile.Email_Address) | Get-Unique # 调用函数 EmailNotification -ToEmail $emailToArray -LogFileToAttach $ChangeLogFile -Change ($ChangeLogFile.Split("_")[3])
额外说明
- 如果CSV中存在空行或无效邮箱,建议添加过滤逻辑:
$emailToArray = @($CSVfile.Email_Address) | Where-Object { $_ -match '^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$' } | Get-Unique - 调用函数时使用命名参数(如
-ToEmail)可以避免参数位置错误,提升代码可读性
内容的提问来源于stack exchange,提问作者Anirban Banerjee
相关产品推荐
相关产品推荐

