php怎么发送邮件_PHPMailer库发送带附件邮件的说明【说明】

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_filesizepost_max_sizememory_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 结构异常。

  • 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 看真实交互过程。