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

PowerShell调用Microsoft Graph API时内嵌CSS的HTML邮件模板报错求助

PowerShell调用Graph API发送带嵌入图片和CSS的HTML邮件示例

常见400错误排查点

  • 请求体JSON格式错误,比如未正确转义特殊字符
  • 服务主体缺少Mail.Send(应用权限),需在Azure AD中配置并授予管理员同意
  • 嵌入图片的CID引用与附件ContentID不匹配
  • HTML中使用外部CSS(多数邮件客户端不支持,需改为内联样式)

完整示例代码

# 1. 配置服务主体参数
$tenantId = "你的租户ID"
$clientId = "你的客户端ID"
$clientSecret = "你的客户端密钥"
$sendFrom = "发件人邮箱(需已授权服务主体代表其发送)"
$sendTo = "收件人邮箱"

# 2. 获取访问令牌
$tokenUri = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token"
$tokenBody = @{
    client_id     = $clientId
    scope         = "https://graph.microsoft.com/.default"
    client_secret = $clientSecret
    grant_type    = "client_credentials"
}
$tokenResponse = Invoke-RestMethod -Uri $tokenUri -Method Post -Body $tokenBody
$accessToken = $tokenResponse.access_token

# 3. 准备HTML内容(内联CSS,嵌入图片用CID引用)
$htmlBody = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body style="font-family: Arial, sans-serif; background-color: #f5f5f5; padding: 20px;">
    <div style="max-width: 600px; margin: 0 auto; background-color: white; padding: 30px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1);">
        <h1 style="color: #2c3e50; text-align: center;">测试邮件</h1>
        <p style="font-size: 16px; color: #34495e; line-height: 1.6;">这是一封包含嵌入图片和内联CSS的测试邮件:</p>
        <img src="cid:logoImage" style="display: block; margin: 20px auto; width: 200px;" alt="Logo">
        <p style="font-size: 16px; color: #34495e; line-height: 1.6;">邮件内容结束。</p>
    </div>
</body>
</html>
"@

# 4. 处理嵌入图片(转为Base64,设置ContentID)
$imagePath = "D:\test-logo.png" # 替换为你的图片路径
$imageBytes = [System.IO.File]::ReadAllBytes($imagePath)
$imageBase64 = [System.Convert]::ToBase64String($imageBytes)
$imageMimeType = "image/png" # 根据图片类型调整(jpg/jpeg对应image/jpeg)

# 5. 构造Graph API请求体
$mailBody = @{
    message = @{
        subject = "测试:带嵌入图片和CSS的邮件"
        body = @{
            contentType = "HTML"
            content = $htmlBody
        }
        toRecipients = @(
            @{
                emailAddress = @{
                    address = $sendTo
                }
            }
        )
        attachments = @(
            @{
                "@odata.type" = "#microsoft.graph.fileAttachment"
                name = "logo.png"
                contentType = $imageMimeType
                contentBytes = $imageBase64
                contentId = "logoImage" # 需与HTML中的cid:值一致
                isInline = $true
            }
        )
    }
    saveToSentItems = $true
} | ConvertTo-Json -Depth 10

# 6. 调用Graph API发送邮件
$graphUri = "https://graph.microsoft.com/v1.0/users/$sendFrom/sendMail"
$headers = @{
    "Authorization" = "Bearer $accessToken"
    "Content-Type" = "application/json"
}

try {
    Invoke-RestMethod -Uri $graphUri -Method Post -Headers $headers -Body $mailBody
    Write-Host "邮件发送成功"
} catch {
    Write-Host "发送失败:$($_.Exception.Message)"
    if ($_.ErrorDetails) {
        Write-Host "Graph API返回详情:$($_.ErrorDetails.Message)"
    }
}

关键注意事项

  • 权限配置:在Azure AD门户中,为服务主体添加Mail.Send应用权限,并获取管理员同意
  • 图片处理:确保contentId与HTML中cid:后的字符串完全一致,isInline必须设为true
  • CSS样式:所有样式需内联到HTML元素的style属性中,避免使用<style>标签(Outlook等客户端不支持)
  • JSON深度:使用ConvertTo-Json -Depth 10避免嵌套结构被截断

内容的提问来源于stack exchange,提问作者Ritwik Payra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 19:49:59