解决PHPMailer导入外部库时发送PDF附件邮件的引入错误
问题解决:PHPMailer发送多PDF附件报错及代码修正
一、致命错误原因及修复
报错核心是PHPMailer文件引入路径错误,同时命名空间使用不符合规范:
- 你当前引入的路径
..\_lib\vendor\phpmailer\phpmailer是目录而非具体文件,PHPMailer需要引入入口文件或自动加载器。 - 现代PHPMailer采用PSR-4命名空间,正确的命名空间前缀为
PHPMailer\PHPMailer\。
修复引入方式
如果通过Composer安装PHPMailer,优先使用自动加载器:
require '../_lib/vendor/autoload.php'; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; // 可选,用于捕获异常
若手动引入文件,需指定具体PHP文件:
require '../_lib/vendor/phpmailer/phpmailer/src/PHPMailer.php'; require '../_lib/vendor/phpmailer/phpmailer/src/Exception.php'; // 可选 use PHPMailer\PHPMailer\PHPMailer;
二、代码整体修正(支持三个PDF附件处理)
你的代码仅处理了bankstatement单个文件输入框,需同时兼容id、bankstatement、payslip三个字段,以下是完整修正后的代码:
PHP代码
<?php // 引入PHPMailer自动加载器(优先推荐) require '../_lib/vendor/autoload.php'; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; $msg = ''; // 判断表单是否提交 if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 需要处理的文件字段列表 $fileFields = ['id', 'bankstatement', 'payslip']; try { $mail = new PHPMailer(true); // 启用异常捕获 // 邮件发送配置(根据服务器实际情况调整) $mail->isSMTP(); $mail->Host = 'your-smtp-host.com'; // 替换为你的SMTP服务器地址 $mail->SMTPAuth = true; $mail->Username = 'your-account@example.com'; // SMTP账号 $mail->Password = 'your-password'; // SMTP密码 $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->Port = 587; // 邮件内容设置 $mail->setFrom('info@acifinance.com', 'ACI Finance'); // 补充完整邮箱域名 $mail->addAddress('gcobani.mkontwana@agilelimitless.org.za', 'ACI Finance'); $mail->Subject = 'ACI Finance Application Loan'; $mail->Body = 'My message body'; // 遍历处理所有文件字段 foreach ($fileFields as $fieldName) { if (!empty($_FILES[$fieldName]['tmp_name']) && $_FILES[$fieldName]['error'] === UPLOAD_ERR_OK) { $fileName = $_FILES[$fieldName]['name']; $tmpFilePath = $_FILES[$fieldName]['tmp_name']; // 验证是否为PDF文件 $fileType = mime_content_type($tmpFilePath); if ($fileType !== 'application/pdf') { $msg .= "文件 {$fileName} 不是PDF格式,已跳过\n"; continue; } // 直接添加临时文件作为附件(无需手动移动) if (!$mail->addAttachment($tmpFilePath, $fileName)) { $msg .= "附件 {$fileName} 添加失败\n"; } } } $mail->send(); $msg .= '邮件发送成功!'; } catch (Exception $e) { $msg .= "邮件发送失败:{$mail->ErrorInfo}"; } } ?>
HTML代码修正
必须给表单添加enctype="multipart/form-data"属性,否则无法上传文件:
<form method="post" enctype="multipart/form-data"> <fieldset> SELECT A pdf FILE TO UPLOAD <br> <label>ID </label><br> <input type="File" name="id" id="id" accept=".pdf" required> <br> <label>Bank Statement </label><br> <input type="File" name="bankstatement" id="bankstatement" accept=".pdf" required> <br> <label>Pay Slip </label><br> <input type="File" name="payslip" id="payslip" accept=".pdf" required> <br> <input type="Submit" id="btnNow" class="btn apply-btn mt-30" name="button" value="APPLY NOW"> </fieldset> </form>
三、额外注意事项
- SMTP配置需匹配服务器要求:若使用本地邮件服务,可注释SMTP相关代码,改用
$mail->isSendmail(); - 确保服务器临时目录具备读写权限
- 发件邮箱需为完整格式,如
info@acifinance.com而非info@acifinance
内容的提问来源于stack exchange,提问作者Sandra Jackson
相关产品推荐
相关产品推荐

