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

无需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类。

步骤:

  1. 在Azure AD注册应用:
    • 登录Azure门户,创建新的应用注册,设置重定向URI为http://localhost。
    • 为应用添加Delegated权限:搜索SMTP.Send并勾选,最后提交管理员同意。
  2. 获取OAuth2令牌:
    先安装MSAL.PS模块(PowerShell Gallery中的官方MSAL封装):
    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
    
    运行后会弹出浏览器,完成MFA验证即可拿到令牌。
  3. 发送邮件:
    $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模块。

步骤:

  1. Azure AD应用配置:
    同样需要注册应用,不过这次添加的Delegated权限是Mail.Send,并获取管理员同意。
  2. 获取Graph令牌:
    $token = Get-MsalToken -ClientId $clientId -TenantId $tenantId -Scopes "https://graph.microsoft.com/Mail.Send" -Interactive
    
  3. 调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:40:32