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

如何实现PHP嵌入邮件的图片可被Outlook正常加载显示

问题原因

Outlook 2007及后续版本使用Microsoft Word内核渲染HTML邮件,原生不支持data:协议的Base64内嵌图片,这是你当前代码在Outlook无法显示图片的核心原因。

修复方案1:使用CID(Content-ID)内嵌图片(推荐,Outlook完美兼容)

这种方案是将图片作为邮件附件添加,给附件分配唯一ID,HTML内容通过cid:唯一ID关联图片,不需要依赖外部资源,Outlook可以直接识别加载。

原生PHP实现示例:

<?php
// 基础配置
$mailTo = "john@auser.com";
$mailSubject = "Image Test";
$from = "noreply@asite.com";
$boundary = md5(uniqid(time())); // 生成多部分分隔符

// 构造邮件头
$mailHead = implode("\r\n", [
  "MIME-Version: 1.0",
  "Content-Type: multipart/related; boundary=\"".$boundary."\"",
  "From: ".$from
]);

// 构造邮件体第一部分:HTML内容
$mailBody = "--".$boundary."\r\n";
$mailBody .= "Content-type: text/html; charset=utf-8\r\n\r\n";
$mailBody .= "<p>Here is an image.</p>";
$mailBody .= "<img src='cid:test_img'/><br>\r\n\r\n";

// 构造邮件体第二部分:图片附件
$path = 'test.jpg';
$img = file_get_contents($path);
$imgdata = base64_encode($img);
$mailBody .= "--".$boundary."\r\n";
$mailBody .= "Content-Type: image/jpg; name=\"test.jpg\"\r\n";
$mailBody .= "Content-Transfer-Encoding: base64\r\n";
$mailBody .= "Content-ID: <test_img>\r\n"; // 这里的ID和HTML里的cid对应
$mailBody .= "Content-Disposition: inline\r\n\r\n";
$mailBody .= chunk_split($imgdata)."\r\n\r\n";
$mailBody .= "--".$boundary."--";

// 发送邮件
echo mail($mailTo, $mailSubject, $mailBody, $mailHead) ? "OK" : "ERROR";
?>

修复方案2:使用公网可访问的外部图片

将图片上传到你的公网服务器,HTML里直接填写图片的完整HTTP/HTTPS链接即可:

$mailBody .= "<img src='https://你的域名/test.jpg'/><br>";

该方案实现最简单,但Outlook默认会阻止外部图片加载,用户手动点击「下载图片」后就可以正常显示。

注意事项

  • 图片优先使用JPG、PNG格式,不要使用WebP,旧版Outlook不支持WebP格式
  • 图片文件不要过大,建议控制在1MB以内,避免被邮件服务商判定为垃圾邮件
  • 如果需要处理更复杂的邮件场景,推荐使用PHPMailer类库实现,内置的addEmbeddedImage方法可以快速实现CID内嵌图片,不需要手动构造复杂的MIME头。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:42:04