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
相关产品推荐
相关产品推荐

