调用Send方法传1个参数时异常:必须指定收件人(PowerShell相关)
PowerShell发送邮件报错「必须指定收件人」的原因与解决办法
为啥会报错?
看你贴的代码和报错信息,核心问题有两个:
- 完全没设置收件人:你创建的
$msg邮件对象里,根本没加任何收件人地址——SMTP协议发邮件必须至少有一个收件人,这就是直接触发报错的原因。 - 变量赋值顺序搞反了:比如
$Subject是先赋值给$msg.subject之后才定义的,$SMTPServer也是先创建了SMTP客户端对象才定义的,这会导致这些变量在使用时是空值,后续还可能引发其他问题(比如邮件没主题、连不上正确的SMTP服务器)。
怎么解决?
1. 赶紧加上收件人
给邮件对象添加收件人有两种常用方式,选一种就行:
- 方式一:创建邮件对象时直接指定发件人和收件人:
$msg = New-Object Net.Mail.MailMessage("admin@email.com", "要发的收件人@xx.com")
- 方式二:用
To.Add()方法添加,支持加多个收件人:
# 加单个收件人 $msg.To.Add("收件人1@xx.com") # 加多个的话继续加就行 $msg.To.Add("收件人2@xx.com") $msg.To.Add("收件人3@xx.com")
2. 把变量定义挪到前面去
所有要用的变量,得先定义好再用,不然用的时候变量是空的。调整后的代码片段大概是这样:
param ([switch]$configure) $Date = Get-Date $Server = gc env:computername # 先把所有要用到的变量都定义好 $Subject = "Hardware Alert from $Server $Date" $SMTPServer = "smtp.office365.com" $SMTPPort = 587 # 这里建议改成587,Office365更推荐这个端口 $SMTPUser = 'admin@email.com' $Body = "这里填你的邮件正文内容" # 别忘了定义Body变量,不然邮件正文是空的 # 再创建邮件对象 $msg = New-Object Net.Mail.MailMessage # 设置邮件属性 $msg.From = "admin@email.com" $msg.Replyto = "me@email.com" $msg.subject = $Subject $msg.body = $Body # 关键步骤:添加收件人 $msg.To.Add("你的收件人地址@xx.com") # 创建SMTP客户端对象 $SMTP = New-Object Net.Mail.SmtpClient($SMTPServer) # Office365需要启用SSL,加上认证信息 $SMTP.Port = $SMTPPort $SMTP.EnableSsl = $true $SMTP.Credentials = New-Object System.Net.NetworkCredential($SMTPUser, "你的邮箱密码或应用密码") # 最后发送邮件 $SMTP.Send($msg)
额外提醒
- Office365的SMTP服务优先用587端口+SSL,25端口可能会被网络拦截,成功率更低。
- 如果你的邮箱开了MFA(多因素认证),不能用普通登录密码,得去邮箱后台生成应用专用密码来填。
内容的提问来源于stack exchange,提问作者rbaggett
相关产品推荐
相关产品推荐

