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

