PHPMailer附件问题主因是路径错误或编码不当,需用绝对路径、处理中文名编码、调大PHP上传限制;SMTP需匹配端口与加密方式并用授权码;HTML邮件须用msgHTML()设置且内嵌图片需addEmbeddedImage()绑定。

PHPMailer 发送带附件邮件时附件不显示或损坏
附件没收到、打开提示损坏、文件名乱码,基本都是 addAttachment() 路径或编码处理不当。PHPMailer 不会自动校验附件路径是否存在或是否可读,出错时往往静默失败。
-
addAttachment()第一个参数必须是服务器上的绝对路径(如/var/www/html/files/report.pdf),相对路径极易失效 - 若附件来自用户上传,确保已调用
move_uploaded_file()存储到安全目录,并检查$_FILES['file']['error'] === UPLOAD_ERR_OK - 中文文件名需额外设置:先用
mb_convert_encoding($filename, 'UTF-8', 'auto')统一编码,再传给addAttachment($path, $filename)的第二个参数 - 大附件(>5MB)需同步调整 PHP 配置:
upload_max_filesize、post_max_size、memory_limit
使用 SMTP 发送时连接被拒绝或认证失败
本地 mail() 函数在大多数生产环境不可用,必须走 SMTP;但填错端口、加密方式或凭据会导致连接中断,错误信息常被忽略。
- 常见组合要严格匹配:
– Gmail:smtp.gmail.com+ 端口587+SMTPSecure = 'tls'
– Outlook/Hotmail:smtp-mail.outlook.com+ 端口587+SMTPSecure = 'tls'
– QQ 邮箱:smtp.qq.com+ 端口587+SMTPSecure = 'tls'(注意:必须用「授权码」而非登录密码) - 务必开启调试模式定位问题:
$mail->SMTPDebug = 2(输出到页面)或3(含更详细通信日志) - 若服务器禁用了
fsockopen或 OpenSSL 扩展,SMTPSecure = 'ssl'会直接报错,优先选'tls'
HTML 邮件中图片不显示、样式丢失
内联 CSS 失效、 不渲染,本质是 HTML 内容未正确绑定资源或 MIME 结构异常。
v1.13更新:1.增加产品讨论功能(ProductMsg备注字段)2.修正页面中的js错误数处。3.删除后的拍卖产品在回收站中统一管理。4.版面图标的DIY..自己更换,表格颜色自由调配。5.无限分类结构优化。6.产品说明支持HTML.7.网页界面优化.8.修正产品上下跳转的条数错误。9.完善邮件群发功能,可选择发送给不同类型的商城用户。10.修正拍卖信息中错误的交易完成Bug。11.去掉搜索用
- HTML 正文必须用
$mail->msgHTML($htmlContent)设置,不能用$mail->Body直接赋值字符串 - 嵌入图片需两步:
– 先调用$mail->addStringEmbeddedImage($imageData, 'mylogo', 'logo.png', 'base64', 'image/png')(或addEmbeddedImage()读文件)
– 再在 HTML 中写,cid值必须与第二参数完全一致 - 避免使用外部 CSS 文件或
@import,所有样式必须内联;标签在多数邮箱客户端会被过滤
isSMTP();
$mail->Host = 'smtp.qq.com';
$mail->SMTPAuth = true;
$mail->Username = 'your@qq.com';
$mail->Password = 'your_app_password'; // 注意:不是邮箱登录密码
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->setFrom('your@qq.com', '发件人名称');
$mail->addAddress('to@example.com', '收件人');
$mail->addAttachment('/tmp/report.pdf', '月度报告.pdf'); // 绝对路径 + 中文别名
$mail->isHTML(true);
$mail->Subject = '带附件的测试邮件';
$mail->msgHTML('正文内容
附件已附上。
立即学习“PHP免费学习笔记(深入)”;
');
$mail->send();
echo '邮件发送成功';
} catch (Exception $e) {
echo "邮件发送失败: {$mail->ErrorInfo}";
}
?>
附件路径权限、SMTP 凭据类型、HTML 资源绑定方式——这三个点只要错一个,整封邮件就可能“发出去了但收不到效果”。调试时别只看是否抛异常,一定开 SMTPDebug 看真实交互过程。










