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
相关产品推荐
相关产品推荐

