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

更换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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:25:57