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

