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

解决PHPMailer导入外部库时发送PDF附件邮件的引入错误

问题解决:PHPMailer发送多PDF附件报错及代码修正

一、致命错误原因及修复

报错核心是PHPMailer文件引入路径错误,同时命名空间使用不符合规范:

  1. 你当前引入的路径..\_lib\vendor\phpmailer\phpmailer是目录而非具体文件,PHPMailer需要引入入口文件或自动加载器。
  2. 现代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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:23:17