Exchange Online中Send-MailMessage已弃用,PowerShell发邮件遇问题求助
Exchange Online PowerShell邮件发送疑问解答
1. 对Exchange Online模块邮件操作的误解
你存在两个关键误解:
- Send-MailMessage并非Exchange Online模块专属命令:它是PowerShell核心组件里的通用SMTP客户端工具,和Exchange Online模块无关联,无法利用Exchange的现代认证、权限管控等专属特性。
- 未适配Office365 SMTP的认证规则:Exchange Online的
outlook.office365.com服务器早已禁用基本认证,而Send-MailMessage仅支持这种老旧的认证方式,这就是你收到「Requested action aborted: local error in processing」错误的根本原因——服务器拒绝了无有效认证的请求。
2. Send-MailMessage是否会被永久移除?
是的,该命令已被官方标记为弃用,微软明确不建议继续使用,未来会在PowerShell的更新版本中彻底移除。弃用的核心原因是它无法保障SMTP连接的安全性,不支持现代认证协议,存在数据泄露风险。
推荐替代方案:使用Microsoft Graph PowerShell发送邮件
微软推荐采用Microsoft Graph PowerShell模块完成Exchange Online的邮件操作,它支持现代认证,符合安全规范,完全适配你的需求(发送通知+密送留存):
步骤1:安装并导入模块
Install-Module Microsoft.Graph.Mail -Force -AllowClobber Import-Module Microsoft.Graph.Mail
步骤2:连接到Microsoft Graph(获取邮件发送权限)
Connect-MgGraph -Scopes "Mail.Send" # 按提示完成身份验证,需具备对应邮箱的发送权限
步骤3:编写发送邮件的脚本
假设你要给主管发送新用户账户信息,同时密送自己:
# 替换为实际的用户信息和收件人邮箱 $newUsername = "newuser@domain.tld" $tempPassword = "TempPass123!" # 建议用安全方式生成/存储,避免明文 $managerEmail = "manager@domain.tld" $myEmail = "myemail@domain.tld" $mailParams = @{ Message = @{ Subject = "新员工账户已创建" Body = @{ ContentType = "Text" Content = @" 您好: 新员工账户信息如下: 用户名:$newUsername 初始密码:$tempPassword 请通知员工登录后立即修改密码。 "@ } ToRecipients = @( @{ EmailAddress = @{ Address = $managerEmail } } ) BccRecipients = @( @{ EmailAddress = @{ Address = $myEmail } } ) } SaveToSentItems = $true } # 发送邮件 Send-MgUserMail -UserId $myEmail -BodyParameter $mailParams
补充说明
- 若你已在使用Exchange Online PowerShell模块,也可以通过配置支持OAuth的SMTP客户端实现,但Microsoft Graph是微软主推的长期解决方案,兼容性和安全性更有保障。
- 密码建议用
ConvertTo-SecureString加密存储,避免明文硬编码在脚本中。
内容的提问来源于stack exchange,提问作者Kevin Wilkins
相关产品推荐
相关产品推荐

