更换SMTP主机后Codeigniter 3邮件附件变为内嵌显示求助
解决CodeIgniter 3.1.4更换SMTP服务商后PDF附件内嵌而非作为附件的问题
问题核心原因
你当前的邮件配置存在冲突:虽然配置了SMTP相关参数,但protocol设置为mail(该协议调用服务器本地sendmail命令,而非SMTP服务),导致CodeIgniter邮件库生成的MIME结构异常,附件被错误标记为inline(内嵌)而非attachment(附件),且邮件多部分结构不符合标准。
解决方案
1. 修正邮件协议与SMTP配置
将protocol从mail改为smtp,同时补充SSL加密配置(465端口为SSL加密端口):
修改配置数组:
$config['protocol'] = 'smtp'; // 替换原有的'mail' $config['smtp_host'] = 'smtp0101.titan.email'; $config['smtp_user'] = SMTP_USER; $config['smtp_pass'] = SMTP_PASS; $config['smtp_port'] = 465; $config['smtp_crypto'] = 'ssl'; // 新增SSL加密配置
同步调整全局定义的协议配置:
defined('PROTOCOL') OR define('PROTOCOL', 'smtp');
2. 优化附件调用(可选但推荐)
明确指定附件的显示文件名,避免自动编码导致的识别问题:
// 提取原始文件名 $display_name = basename($file_path); $this->email->attach($file_path, 'attachment', $display_name);
3. 开启调试验证(排查问题用)
临时取消show_error($this->email->print_debugger());的注释,查看邮件发送过程中的MIME结构、SMTP交互日志,确认附件的Content-Disposition是否为attachment,以及SMTP连接是否正常。
修改后的完整代码示例
public function emailPDF ($id) { $timesheet = $this->timesheets_model->get_timesheets($id)[0]; $filename = $this->getFilename($id); $master_company = 'company'; $companyname = 'companyname'; $this->load->library('email'); $config['protocol'] = 'smtp'; $config['smtp_host'] = 'smtp0101.titan.email'; $config['smtp_user'] = SMTP_USER; $config['smtp_pass'] = SMTP_PASS; $config['smtp_port'] = 465; $config['smtp_crypto'] = 'ssl'; $config['mailtype'] = 'html'; $config['charset'] = 'utf-8'; $config['newline'] = "\r\n"; $config['wordwrap'] = TRUE; $this->email->initialize($config); $this->email->from($master_company->email); $this->email->to("{$company->email}"); $file_path = PDF_PATH . $filename; chmod($file_path, 777); $display_name = basename($file_path); $this->email->attach($file_path, 'attachment', $display_name); $this->email->subject("Service Sheet for $companyname"); $this->email->message("Hi,<br><br> Please find attached a Service Sheet"); if($this->email->send()) { $this->session->set_flashdata('level', 'success'); // if ($this->timesheets_model->set_email_sent($id)) { // $this->session->set_flashdata('message', 'Email sent successfully'); // } } else { show_error($this->email->print_debugger()); // 开启调试查看问题 $this->session->set_flashdata('message', 'There was a problem sending the email'); $this->session->set_flashdata('level', 'danger'); } }
关键说明
- 使用
smtp协议后,CodeIgniter会正确生成multipart/mixed类型的邮件结构,将附件与正文分离,确保邮件客户端识别为附件而非内嵌内容。 - 补充
smtp_crypto配置是因为465端口要求SSL加密,缺失该配置可能导致SMTP连接失败或邮件内容编码异常。
内容的提问来源于stack exchange,提问作者greebstreebling
相关产品推荐
相关产品推荐

