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

使用PowerShell发送邮件时无法在正文中嵌入图片求助

问题分析与解决建议

1. 先排查Body为空的直接原因

报错提示Body参数为空或null,先确认你的$screenshots变量是否真的获取到了文件:
在代码开头添加一行验证:

Write-Host "找到的截图数量:$($screenshots.Count)"

如果输出为0,说明文件匹配存在问题:

  • 检查过滤逻辑:Where-Object name -like "*.bmp"区分大小写,可改为$_.Name -match '\.bmp$'(不区分大小写),或用-like "*.BMP"覆盖大小写场景
  • 确认路径C:\Test\Screenshots是否正确,当前用户是否有访问权限

2. 核心问题:嵌入图片到邮件正文的正确方式

你当前的代码仅将文件名写入HTML,邮件客户端无法访问本地文件路径,必须将图片作为内嵌附件,通过cid(内容ID)引用,才能在正文显示。以下是支持批量处理的完整解决方案:

可运行代码示例

# 获取目标文件夹下的BMP文件
$screenshots = Get-ChildItem "C:\Test\Screenshots" -Filter "*.bmp" -File

# 初始化HTML正文和附件列表
$bodySegments = @()
$inlineAttachments = @()

foreach ($screenshot in $screenshots) {
    # 生成唯一Content-ID,避免多图ID冲突
    $cid = "screenshot_$($screenshot.BaseName)_$(Get-Random)"
    
    # 创建内嵌附件并配置属性
    $attachment = New-Object System.Net.Mail.Attachment($screenshot.FullName)
    $attachment.ContentDisposition.Inline = $true
    $attachment.ContentId = $cid
    $inlineAttachments += $attachment

    # 在HTML正文中用cid引用图片
    $bodySegments += "<br/><img src='cid:$cid' alt='截图' style='max-width:100%;'/><br/>"
}

# 拼接成完整HTML正文
$htmlBody = $bodySegments -join ""

# 发送邮件(替换为你的实际邮件参数)
Send-MailMessage `
    -From "你的邮箱@xxx.com" `
    -To "收件人邮箱@xxx.com" `
    -Subject "内嵌批量截图邮件" `
    -Body $htmlBody `
    -BodyAsHtml `
    -SmtpServer "你的SMTP服务器地址" `
    -Attachments $inlineAttachments

# 释放附件资源,避免文件被占用
foreach ($att in $inlineAttachments) {
    $att.Dispose()
}

关键说明

  • 用Get-ChildItem -Filter "*.bmp" -File更高效,直接过滤文件和指定后缀
  • 每个图片生成唯一cid,防止多图时ID重复导致显示异常
  • 通过System.Net.Mail.Attachment设置Inline = $true和ContentId,实现图片内嵌
  • 必须指定-BodyAsHtml参数,否则邮件会显示原始HTML代码
  • 最后调用Dispose()释放附件资源,避免本地文件被锁定

3. 额外优化建议

  • 若BMP文件体积过大,可借助System.Drawing程序集转换为PNG/JPG格式压缩后再发送
  • 可在<img>标签中添加width/height属性,控制图片显示尺寸

内容的提问来源于stack exchange,提问作者Lucky Nthite

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:52:33