如何实现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
相关产品推荐
相关产品推荐

