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

调用Send方法传1个参数时异常:必须指定收件人(PowerShell相关)

PowerShell发送邮件报错「必须指定收件人」的原因与解决办法

为啥会报错?

看你贴的代码和报错信息,核心问题有两个:

  1. 完全没设置收件人:你创建的$msg邮件对象里,根本没加任何收件人地址——SMTP协议发邮件必须至少有一个收件人,这就是直接触发报错的原因。
  2. 变量赋值顺序搞反了:比如$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:08:59