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

CodeIgniter SMTP邮件附件功能异常求助

问题描述

已按步骤配置CodeIgniter的SMTP邮件功能,发送邮件时仅能收到正文内容,无法获取附件。附件路径通过GetFileRootPath函数获取到绝对路径:/home/User/public_html/domainname.com/resources/upload/img/2023/11/24/download.jpg,但附件仍未随邮件发送,请求排查问题。

SMTP配置代码

$config = array(
    "protocol"   => "SMTP",
    "smtp_host"  => "domainname.com",
    "smtp_port"  => "465",
    "smtp_timeout"  => "7",
    "smtp_user"  => 'sales@domainname.com',
    "smtp_pass"  => "password", 
    "starttls"   => TRUE,
    "charset"    => "iso-8859-1",
    "mailtype"   => "html", 
    "wordwrap"   => TRUE,
    "newline"    => "\r\n",
    "validate"   => FALSE,
    "smtp_keep_alive" => TRUE
);

$this->load->library('email', $config);

邮件发送代码

$this->email->from($Data['Email'], $Data['Name']);
$this->email->to('sales@domainname.com');
$this->email->subject(sprintf('Email Send by - %s', $Data['Name']));
$this->email->message(sprintf('
    Request ID: %s <br />
    Name: %s <br />
    Email: %s<br />
    Colors: %s <br />
    Quantity: %s<br />
    Phone: %s<br />
    Message: %s <br />
    Target Price: %s'
, $PK,$Data['Name'], $Data['Email'], $Data['Colors'], $Data['Quantity'], $Data['Phone'], $Input->post('Config')['Message'],$Data['TargetPrice']));
//attachment
if($Row){
    $ImagePath = GetFileRootPath($Row->EntryDate,'IMG',false,$Row->Image);
    // this function is returning this path - /home/User/public_html/domainname.com/resources/upload/img/2023/11/24/download.jpg
    if($ImagePath){
        $this->email->attach($ImagePath);
    }
}

if($this->email->send()){
    SetMessage('ENTRYSUCCESS');
} else {
    SetMessage('ENTRYFAILED');
}
} else{
    SetMessage('ENTRYFAILED');
}
排查与解决建议
  • 验证文件存在性与权限
    先确认附件路径对应的文件真实存在,且Web服务器进程(如www-data、apache)拥有该文件的读取权限。可在代码中添加判断逻辑:

    if(file_exists($ImagePath) && is_readable($ImagePath)) {
        $this->email->attach($ImagePath);
    } else {
        error_log("附件不存在或不可读:".$ImagePath); // 记录错误日志便于排查
    }
    
  • 修复SMTP配置冲突
    当前配置中smtp_port设为465(SSL专属端口),但同时开启了starttls(TLS加密开关),二者存在冲突。465端口默认使用SSL加密,无需开启starttls,建议修改配置:

    "smtp_port"  => "465",
    "smtp_crypto" => "ssl", // 明确指定SSL加密方式
    "starttls"   => FALSE, // 关闭starttls
    

    若使用587端口,则需开启starttls并移除smtp_crypto配置。

  • 明确附件参数
    尝试在attach方法中指定附件的MIME类型和显示文件名,确保邮件库能正确识别文件属性:

    $this->email->attach(
        $ImagePath,
        'attachment',
        'download.jpg', // 收件人看到的文件名
        'image/jpeg' // 对应文件的MIME类型
    );
    
  • 查看详细错误日志
    在邮件发送失败时,输出CodeIgniter邮件库的调试信息,能直接定位问题根源:

    if(!$this->email->send()){
        error_log($this->email->print_debugger()); // 记录SMTP交互全流程日志
        SetMessage('ENTRYFAILED');
    }
    
  • 确认换行符配置
    CodeIgniter要求newline必须设置为"\r\n",当前配置已符合要求,但需确认该配置未被其他代码覆盖。

内容的提问来源于stack exchange,提问作者Muhammad Hamza Nisar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:43:33