PHPmailer发送邮件内嵌图片无法显示问题求助
问题修正代码及说明
核心问题点与修正:
- 循环内重复调用
$mail->send(),导致发送逻辑混乱 addAddress的第二个参数错误,应传入收件人姓名而非邮件主题- 改用绝对路径引入图片,避免相对路径导致的文件找不到问题
- 调整代码结构,将重复配置的内容移到循环外,提升效率
修正后的完整代码:
try { // 初始化PHPMailer实例(原代码需补充此基础实例化) $mail = new PHPMailer(true); // 补充SMTP服务器配置(根据你的实际邮件服务商信息填写) // $mail->isSMTP(); // $mail->Host = '你的SMTP主机地址'; // $mail->SMTPAuth = true; // $mail->Username = '你的邮箱账号'; // $mail->Password = '你的邮箱授权码/密码'; // $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; // $mail->Port = 465; // 内嵌图片:使用绝对路径确保文件可被读取 $imageAbsolutePath = __DIR__ . '/images/wncwasmall.jpg'; $mail->addEmbeddedImage($imageAbsolutePath, "logo", "wncwasmall.jpg", "image/jpg"); // 邮件基础配置(只需设置一次) $mail->isHTML(true); $mail->Subject = $subject; $mail->Body = '<center><img alt="WNCWA Logo" src="cid:logo"></center>' . $message; $mail->setFrom('email@wncwa.net', 'WNCWA'); $mail->addReplyTo($replyto, $sender); // 发件人副本:若需每封邮件都抄送自己则保留,否则可移除 $mail->addAddress($from_email, $sender); // 数据库查询 $sql = $conn->prepare(" SELECT fname, lname, email FROM test ORDER BY lname "); $sql->execute(); while ($row = $sql->fetch()) { $fname = $row['fname']; $lname = $row['lname']; $to = $row['email']; $recipientFullName = $fname . ' ' . $lname; // 添加目标收件人(正确传入收件人姓名) $mail->addAddress($to, $recipientFullName); // 执行发送(仅调用一次) $isSent = $mail->send(); if (!$isSent) { echo "<div style='color:red;' >NOT sent - $fname $lname <br /></div> "; } // 清空收件人列表,准备下一封邮件发送 $mail->clearAddresses(); } } catch (Exception $e) { echo "全局发送错误: {$mail->ErrorInfo}"; }
补充说明:
- 若使用旧版PHPMailer,
addEmbeddedImage可兼容大写写法AddEmbeddedImage,但推荐用规范的小写方法名 - 务必确认
$imageAbsolutePath指向的图片文件存在,且PHP进程对该文件有读取权限 - SMTP配置部分是邮件发送的基础,必须根据你的邮箱服务商信息补充完整
内容的提问来源于stack exchange,提问作者Phil R
相关产品推荐
相关产品推荐

