如何将服务器wp-regpdf文件夹中的PDF通过SMTP邮件作为附件发送
问题分析与解决方案
你的代码存在两个核心问题导致PDF附件无法正常发送,以下是具体修复步骤:
1. 变量作用域问题
你在函数外部定义的$path变量,无法在smtp_mailer函数内部直接访问,导致AddAttachment传入的是未定义的无效值。解决方式是将$path作为参数传递给函数。
2. 文件路径可靠性问题
使用相对路径可能因脚本执行目录差异导致找不到文件,建议改用服务器绝对路径,通过$_SERVER['DOCUMENT_ROOT']拼接,确保指向Public_htm下的wp-regpdf文件夹。
修复后的完整代码
<?php session_start(); if ($_SESSION['email'] == '' || $_SESSION['Uniqueid'] == '') { session_destroy(); echo '<script>window.location.href="wp-destroy.php"</script>'; } ?> <?php $Uniqueid = $_SESSION['Uniqueid']; // 拼接服务器绝对路径,避免相对路径出错 $path = $_SERVER['DOCUMENT_ROOT'] . '/wp-regpdf/' . $Uniqueid . '.pdf'; $email = $_SESSION['email']; include ('smtp/PHPMailerAutoload.php'); // 将$path作为参数传入邮件发送函数 echo smtp_mailer($email, 'Testing Mail', '请查收你的工资单附件', $path); function smtp_mailer($to, $subject, $msg, $path) { $mail = new PHPMailer(); $mail->IsSMTP(); $mail->SMTPAuth = true; $mail->SMTPSecure = 'tls'; $mail->Host = "smtppro.zoho.in"; $mail->Port = 587; $mail->IsHTML(true); $mail->CharSet = 'UTF-8'; // 开启调试模式,方便排查问题(测试完成后可注释) $mail->SMTPDebug = 2; $mail->Username = "你的Zoho邮箱账号"; $mail->Password = "你的Zoho邮箱密码"; $mail->SetFrom("support@team.tech"); $mail->addCC('info@team.com'); $mail->Subject = $subject; $mail->Body = $msg; // 先验证文件是否存在且可读 if (file_exists($path) && is_readable($path)) { $mail->AddAttachment($path); } else { echo "附件文件不存在或无读取权限:" . $path; return false; } $mail->AddAddress($to); $mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => false ) ); if ($mail->Send()) { echo '<script>window.location.href="thankyou.php"</script>'; } else { echo $mail->ErrorInfo; } } ?>
额外排查建议
- 检查
wp-regpdf文件夹及PDF文件的权限,确保服务器进程(如www-data)拥有读取权限 - 确认Zoho邮箱的SMTP账号密码正确,且已开启SMTP服务
- 保留
$mail->SMTPDebug = 2,查看详细SMTP交互日志,可快速定位发送失败的具体原因
内容的提问来源于stack exchange,提问作者jitender kumar
相关产品推荐
相关产品推荐

