无需Exchange Online PowerShell模块,如何在PowerShell中使用MFA?
无需Exchange Online PowerShell模块,在PowerShell中实现MFA邮件发送
Send-MailMessage确实不支持MFA——它依赖传统的基本/NTLM认证,没有适配OAuth2这类现代MFA所需的认证流程。不过可以通过以下两种方法实现需求,完全不需要Exchange Online模块:
方法1:.NET SmtpClient + OAuth2令牌
这是直接基于SMTP协议的方案,核心是获取MFA认证后的OAuth2令牌,再传递给.NET的SmtpClient类。
步骤:
- 在Azure AD注册应用:
- 登录Azure门户,创建新的应用注册,设置重定向URI为
http://localhost。 - 为应用添加Delegated权限:搜索
SMTP.Send并勾选,最后提交管理员同意。
- 登录Azure门户,创建新的应用注册,设置重定向URI为
- 获取OAuth2令牌:
先安装MSAL.PS模块(PowerShell Gallery中的官方MSAL封装):
然后交互式获取MFA令牌:Install-Module MSAL.PS -Scope CurrentUser -Force
运行后会弹出浏览器,完成MFA验证即可拿到令牌。$clientId = "你的Azure AD应用ID" $tenantId = "你的租户ID" $token = Get-MsalToken -ClientId $clientId -TenantId $tenantId -Scopes "https://outlook.office365.com/SMTP.Send" -Interactive - 发送邮件:
$smtpConfig = @{ Server = "smtp.office365.com" Port = 587 From = "your-email@domain.com" To = "recipient@domain.com" Subject = "MFA测试邮件" Body = "通过OAuth2 + SmtpClient发送的MFA邮件" } $smtpClient = New-Object System.Net.Mail.SmtpClient($smtpConfig.Server, $smtpConfig.Port) $smtpClient.EnableSsl = $true $smtpClient.UseDefaultCredentials = $false $smtpClient.Credentials = New-Object System.Net.NetworkCredential($smtpConfig.From, $token.AccessToken) $smtpClient.Send($smtpConfig.From, $smtpConfig.To, $smtpConfig.Subject, $smtpConfig.Body)
方法2:调用Microsoft Graph API
通过Graph API的SendMail端点发送邮件,同样支持MFA认证,无需Exchange模块。
步骤:
- Azure AD应用配置:
同样需要注册应用,不过这次添加的Delegated权限是Mail.Send,并获取管理员同意。 - 获取Graph令牌:
$token = Get-MsalToken -ClientId $clientId -TenantId $tenantId -Scopes "https://graph.microsoft.com/Mail.Send" -Interactive - 调用API发送邮件:
$mailBody = @{ message = @{ subject = "Graph API MFA测试" body = @{ contentType = "Text" content = "通过Graph API发送的MFA验证邮件" } toRecipients = @( @{ emailAddress = @{ address = "recipient@domain.com" } } ) } saveToSentItems = $true } | ConvertTo-Json -Depth 3 Invoke-RestMethod -Uri "https://graph.microsoft.com/v1.0/me/sendMail" ` -Method Post ` -Headers @{ Authorization = "Bearer $($token.AccessToken)" } ` -ContentType "application/json" ` -Body $mailBody
关键注意点
- 两种方案都需要Azure AD应用的配置,且必须完成管理员对应用权限的同意(如果是租户账号)。
- 令牌获取是交互式的,必须手动完成MFA验证(比如短信、APP验证码等),无法完全自动化(这是MFA的安全要求)。
- 如果无法安装
MSAL.PS模块,可以直接引用MSAL的.NET DLL手动实现令牌获取,逻辑和上面一致。
内容的提问来源于stack exchange,提问作者ndubs
相关产品推荐
相关产品推荐

