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

PHP邮件嵌入本地图片显示异常,寻求解决方法

解决PHP邮件嵌入图片显示破碎的问题

我之前也碰到过一模一样的问题,咱们一步步来排查和解决:

为什么直接用相对路径的图片会显示破碎?

你原来的代码里用 <img src="img/logo.png"/>,这个路径是你本地服务器的相对路径,收件人的邮件客户端根本无法访问到你本地机器上的文件,所以肯定会显示成破碎的图标。必须把图片作为邮件的附件嵌入进去,然后通过CID(Content ID)来引用它。

正确使用AddEmbeddedImage的步骤

你尝试过用AddEmbeddedImage但没成功,大概率是CID引用错了,或者路径有问题。下面是修正后的完整代码:

$mail1->SMTPDebug = 2; 
$mail1->isSMTP(); 
$mail1->Host = 'smtp.gmail.com'; 
$mail1->SMTPAuth = true; 
$mail1->Username = 'email@gmail.com'; 
// 重要提示:Gmail现在需要用App Password,而非原账号密码(需开启两步验证)
$mail1->Password = 'your_app_password_here'; 
$mail1->SMTPSecure = 'tls'; 
$mail1->Port = 587; 
$mail1->setFrom('auto-reply@email.ca', '123'); 
$mail1->addAddress('email@gmail.com'); 
$mail1->isHTML(true); 

// 嵌入图片:参数分别是【本地文件路径】、【CID标识】、【文件名】
$imagePath = 'img/logo.png';
// 先验证文件是否存在,避免路径错误
if (file_exists($imagePath)) {
    $mail1->AddEmbeddedImage($imagePath, 'logo_cid', 'logo.png');
} else {
    echo "图片文件不存在,请检查路径!";
    exit;
}

$mail1->Subject = 'Thanks For Reaching us!'; 
// 在HTML的img标签里用cid:刚才设置的CID标识来引用图片
$mail1->Body = '<p>This is a test picture <img src="cid:logo_cid" alt="Company Logo" /></p>'; 

if(!$mail1->send()) {
    echo '邮件发送失败:' . $mail1->ErrorInfo;
} else {
    echo '邮件发送成功!';
}
exit;

额外需要注意的几个点

  • Gmail SMTP权限问题:现在Gmail默认禁止使用普通密码登录SMTP服务,你需要先给账号开启两步验证,然后创建一个App Password,用这个密码代替代码里的原密码。
  • 文件路径准确性:如果相对路径(img/logo.png)还是找不到文件,可以改用绝对路径,比如:
    $imagePath = $_SERVER['DOCUMENT_ROOT'] . '/img/logo.png';
    
    这样能确保脚本准确找到图片文件的位置。
  • 邮件客户端兼容性:有些老式邮件客户端可能不支持CID引用,但主流的Gmail、Outlook、QQ邮箱等都能正常识别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:09:36