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

