PHPMailer 6.18为何将内嵌图片识别为附件?
解决PHPMailer 6.18内嵌图片被识别为附件的问题
你的代码里存在几个关键问题,导致内嵌图片被当作附件处理,逐一修正如下:
HTML标签未正确闭合
你写的<img src='cid:venmo' "标签不完整,缺少闭合符号(>),部分邮件客户端会因HTML语法错误,将内嵌资源判定为附件。必须确保img标签完整,比如:<img src='cid:venmo' alt='Venmo二维码' />addEmbeddedImage参数顺序错误
PHPMailer 6.x中addEmbeddedImage的正确参数顺序是:addEmbeddedImage(string $path, string $cid, ?string $name = null, string $encoding = 'base64', ?string $type = null)你最后一行调换参数的写法不符合规范,会触发报错;注释里的第二种写法也把编码和类型顺序搞反了。正确调用方式为:
// 最简写法(自动识别文件类型) $mail->addEmbeddedImage($attachment, "venmo"); // 或明确指定类型和编码(可选) $mail->addEmbeddedImage($attachment, "venmo", "venmo-code.jpg", "base64", "image/jpeg");确认文件路径正确性
相对路径packages/ds/reservations/venmo-code.jpg可能存在读取问题,建议使用绝对路径确保PHPMailer能正确找到文件,比如:$attachment = __DIR__ . '/packages/ds/reservations/venmo-code.jpg';
修正后的完整代码示例
$mail->IsHTML(true); $mail->CharSet = "UTF-8"; // 使用绝对路径避免文件找不到 $attachment = __DIR__ . '/packages/ds/reservations/venmo-code.jpg'; $mail->Body = " <style type='text/css'> img { max-width: 100%; width: 480px; } </style> <h2>Including an embedded image</h2> <img src='cid:venmo' alt='Venmo Code' /> "; // 正确调用addEmbeddedImage $mail->addEmbeddedImage($attachment, "venmo");
另外注意:如果同时设置了AltBody纯文本内容,纯文本模式下不会显示内嵌图片,但这不会影响HTML模式的内嵌效果。
内容的提问来源于stack exchange,提问作者Bob M
相关产品推荐
相关产品推荐

