CodeIgniter添加邮件功能报错:Call to a member function initialize() on null
解决CodeIgniter邮件功能的两类报错
错误原因分析
先帮你拆解下这两个报错的根源:
- Notice: Undefined property: Welcome::$email:你的自定义
application/libraries/email.php写法不符合CodeIgniter库的规范,导致Email库加载失败,控制器里的$this->email对象根本没初始化,所以提示未定义属性。 - 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
相关产品推荐
相关产品推荐

