You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHPMailer发送含PDF附件邮件突发失效问题排查与修复

带PDF附件的邮件发送失效问题排查与修复

失效核心原因

  • Gmail SMTP认证机制变更:谷歌已停止支持普通密码用于SMTP登录,需启用两步验证后生成应用专用密码,或切换到OAuth2认证;若未启用两步验证,当前已无法通过普通密码登录SMTP服务,这是近期突然失效的最主要原因。
  • 文件上传环节潜在问题:uploads目录不存在/无写入权限、未处理上传错误、未限制PDF文件类型,导致附件无法正常添加。
  • 跳转逻辑错误:echo header("Location:...")写法违规,可能导致跳转失效,且未终止后续代码执行。

代码修改要点

1. 修复Gmail SMTP认证

  • 启用谷歌账号的两步验证,生成对应SMTP的应用专用密码,替换代码中的$mail->Password = 'password';为应用专用密码。
  • 若不想用两步验证,可切换到其他SMTP服务商(如网易邮箱、SendGrid等),对应修改Host、Username、Password等参数。

2. 完善文件上传与附件添加逻辑

替换原附件处理代码为:

if (isset($_FILES['attachment']) && $_FILES['attachment']['error'] === UPLOAD_ERR_OK) {
    $allowed_types = ['application/pdf'];
    $file_type = $_FILES['attachment']['type'];
    $file_ext = strtolower(pathinfo($_FILES['attachment']['name'], PATHINFO_EXTENSION));
    
    // 仅允许PDF文件上传
    if (in_array($file_type, $allowed_types) || $file_ext === 'pdf') {
        $upload_dir = 'uploads/';
        // 自动创建uploads目录(若不存在)
        if (!is_dir($upload_dir)) {
            mkdir($upload_dir, 0755, true);
        }
        // 生成唯一文件名,避免覆盖
        $file_name = uniqid() . '_' . $_FILES['attachment']['name'];
        $upload_path = $upload_dir . $file_name;
        
        if (move_uploaded_file($_FILES['attachment']['tmp_name'], $upload_path)) {
            $mail->addAttachment($upload_path, $_FILES['attachment']['name']);
            // 可选:发送完成后删除临时文件
            // unlink($upload_path);
        }
    }
}
  • 新增上传错误校验,仅处理上传成功的文件。
  • 通过MIME类型+文件后缀双重校验,限制仅PDF文件。
  • 自动创建上传目录,避免因目录缺失导致上传失败。
  • 生成唯一文件名,防止同名文件覆盖。

3. 修复跳转逻辑

替换原跳转代码为:

// 发送成功跳转
$mail->send();
header("Location: sent.html");
exit; // 必须添加exit终止后续代码执行

// 捕获异常时跳转
catch (Exception $e) {
    header("Location: not sent.html");
    exit;
}
  • 移除多余的echo,直接调用header()函数。
  • 添加exit确保跳转生效,避免后续代码继续执行。

4. 优化邮件内容格式

替换原邮件内容构建代码为:

$Body = "<p>First Name: {$fname}</p>";
$Body .= "<p>Last Name: {$lname}</p>";
$Body .= "<p>Email: {$email}</p>";
$Body .= "<p>Message: {$message}</p>";
$Body .= "<p>Position: {$Position}</p>";
$Body .= "<p>Phone no: {$Contact}</p>";
  • 用HTML<p>标签替代混乱的\n <br>组合,让邮件内容格式更规范。

5. 调试与错误排查

临时开启SMTP调试:注释掉$mail->SMTPDebug = SMTP::DEBUG_OFF;,保留$mail->SMTPDebug = SMTP::DEBUG_SERVER;,查看控制台输出的SMTP交互日志,可快速定位认证或连接问题。

内容的提问来源于stack exchange,提问作者Aakash Mishra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 03:34:55