CodeIgniter发送邮件返回HTTP 303状态码发送失败如何解决
问题原因及解决方法
1. 你看不到邮件报错、返回303状态码的原因
303是重定向状态码,和邮件发送本身无关:你的控制器逻辑中,不管邮件发送成功还是失败,都会执行redirect跳转,跳转后当前请求的输出内容全部会被丢弃,自然看不到邮件发送的具体错误信息。
2. 导致邮件发送失败的直接BUG
- 第一个BUG:你的自定义邮件类
Ah_Email的send方法中,设置收件人逻辑加了判断:只有当$settings中存在send_email且值为真时才会调用$this->email->to($email_to),但你在控制器调用send方法时,根本没有传入send_email参数,导致邮件没有收件人,必然发送失败。 - 第二个BUG:你想覆盖
mailtype为text,但参数传错了位置:send方法的第四个参数是模板变量,第五个参数才是配置覆盖项,你把mailtype放到了模板变量数组里,配置不会生效。
3. 具体修复步骤
步骤1:修复控制器调用参数
修改控制器的调用代码,把配置项放到第五个参数,同时传入send_email开启收件人设置:
public function SendMail() { $this->load->library('ah_email', 'ah_email'); // 注意:第四个参数是模板变量,第五个才是配置覆盖 $send = $this->ah_email->send( 'receiver@gmail.com', 'Informasi Kode OTP Akun Kamu', 'example', // 模板变量 array( 'username' => 'Ndo Malau', 'message' => 'Hello World' ), // 配置覆盖项放这里 array( 'mailtype' => 'text', 'send_email' => true ) ); // 临时注释重定向,打印错误排查,排查完再恢复 if(!$send) { // 输出邮件具体错误信息 echo $this->ah_email->email->print_debugger(); exit; } if($send) { $this->session->set_flashdata('succ_msg', 'success, email has been sending!'); } else { $this->session->set_flashdata('err_msg', 'failed, error while email sending'); } redirect(base_url('Systems/Users/index/')); }
步骤2:可选优化(可直接移除无用判断)
如果send_email这个判断没有特殊用途,可以直接修改Ah_Email.php中的代码,删掉判断,默认设置收件人:
// 删掉if判断,直接设置收件人 $this->email->to($email_to);
步骤3:其他可能的问题排查
如果修复后还是发送失败,根据print_debugger()输出的错误做对应处理:
- 如果是SMTP连接失败:检查你的Mailtrap的SMTP用户名、密码是否正确,你当前贴的配置里的账号密码是脱敏后的,实际使用要填Mailtrap后台提供的真实凭据;也可以尝试更换端口为465,
smtp_crypto改为ssl,部分服务器环境可能封禁2525端口。 - 如果是模板加载失败:检查
application/views/emails/example.php文件是否存在。
内容的提问来源于stack exchange,提问作者odnmalau
相关产品推荐
相关产品推荐

