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

CodeIgniter添加邮件功能报错:Call to a member function initialize() on null

解决CodeIgniter邮件功能的两类报错

错误原因分析

先帮你拆解下这两个报错的根源:

  1. Notice: Undefined property: Welcome::$email:你的自定义application/libraries/email.php写法不符合CodeIgniter库的规范,导致Email库加载失败,控制器里的$this->email对象根本没初始化,所以提示未定义属性。
  2. Error: Call to a member function initialize() on null:在你的自定义email.php里,直接调用$this->email->initialize(),但此时$this->email还没被CI加载,是个null值,自然没法调用方法。

另外你的控制器代码还有几个逻辑小问题,我一起帮你修正。


第一步:修复自定义Email库(或直接用CI自带库)

CodeIgniter的库必须是类结构,不能直接写执行代码。如果你想封装邮件功能,正确的库写法如下(建议把文件名改成My_email.php避免和系统自带的Email库冲突):

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class My_email {
    private $CI;
    private $smtp_config;

    public function __construct() {
        // 获取CI实例
        $this->CI =& get_instance();
        
        // 配置SMTP参数(Gmail需要应用密码,记得替换成你的信息)
        $this->smtp_config = array(
            'protocol' => 'smtp',
            'smtp_host' => 'ssl://smtp.gmail.com',
            'smtp_port' => 465,
            'smtp_user' => 'your-gmail-account@gmail.com',
            'smtp_pass' => 'your-app-password', // Gmail开启2FA后生成应用密码
            'mailtype' => 'html',
            'charset' => 'utf-8',
            'newline' => "\r\n"
        );
        
        // 加载系统Email库并初始化配置
        $this->CI->load->library('email', $this->smtp_config);
    }

    // 封装发送邮件的方法
    public function send_contact_mail($to, $from_email, $from_name, $subject, $message) {
        $this->CI->email->from($from_email, $from_name);
        $this->CI->email->to($to);
        $this->CI->email->subject($subject);
        $this->CI->email->message($message);
        
        return $this->CI->email->send();
    }

    // 可选:获取邮件发送失败的调试信息
    public function get_debug_info() {
        return $this->CI->email->print_debugger();
    }
}

第二步:修复控制器welcome.php的formData()方法

你的控制器代码有逻辑错误(比如判断条件反了、插入数据库的内容不对、跳转逻辑顺序错了),修正后的代码:

function formData(){
    // 只有当表单提交的checkprocess存在时才处理
    if (!empty($this->input->post('checkprocess'))) { 
        $admin_email = 'rockpokhrel@gmail.com';
        
        // 获取表单数据
        $name = $this->input->post('full_name');
        $email = $this->input->post('email');
        $mob_num = $this->input->post('mob_num');
        $address = $this->input->post('address');
        $user_message = $this->input->post('message');

        // 组装邮件内容
        $email_message = "Dear Admin, <br/>" . 
                        "Contact Information of Users:" .'<br/>'. 
                        "<b>Name</b> :- " . $name .'<br/>'. 
                        "<b>Email:-</b> " . $email .'<br/>'. 
                        "<b>Contact Number:-</b> " . $mob_num .'<br/><br/>'. 
                        "<b>Address:-</b> " . $address .'<br/><br/>'. 
                        "<b>Message:-</b> " . $user_message;

        // 加载自定义的邮件库
        $this->load->library('my_email');
        
        // 发送邮件
        if ($this->my_email->send_contact_mail($admin_email, $email, $name, "Public Contact/Feedback", $email_message)) {
            // 先插入表单数据到数据库(之前你插的是邮箱配置,这是错的)
            $contact_data = array(
                'full_name' => $name,
                'email' => $email,
                'mob_num' => $mob_num,
                'address' => $address,
                'message' => $user_message
            );
            $this->db->insert('tbl_contactusform', $contact_data);
            
            // 用CI的redirect跳转,比meta刷新更规范
            redirect(base_url(), 'refresh');
        } else {
            // 发送失败时显示调试信息
            echo $this->my_email->get_debug_info();
        }
    }
}

额外注意事项

  • Gmail SMTP配置:如果用Gmail发邮件,必须开启两步验证,然后生成应用密码(不能用原邮箱密码);如果不想开2FA,需要开启“不太安全的应用访问”(不推荐)。
  • 文件名大小写:在Linux服务器上,CI的库文件名首字母必须大写(比如My_email.php),否则会加载失败。
  • 表单判断逻辑:原代码里if (empty($this->input->post('checkprocess')))是反的,应该用!empty,否则只有当checkprocess为空时才执行邮件发送,不符合表单提交的逻辑。

内容的提问来源于stack exchange,提问作者prakash pokhrel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:50:24