CodeIgniter服务器端仅上午可发邮件,下午发送失败求助
时段性邮件发送故障排查与解决建议
看起来你遇到了一个挺棘手的时段性问题——本地正常、服务器上午能发下午发不出,而且调试信息还显示“发送成功”,这确实挺迷惑人的。我来帮你捋捋可能的原因和解决办法:
1. 首先注意到配置里的冲突点
你在email.php里同时配置了sendmail协议和SMTP的全套参数,但CodeIgniter在使用sendmail协议时,会直接调用服务器上的sendmail程序,完全忽略SMTP相关配置。这就导致你实际是在依赖服务器的本地邮件服务发件,而不是直接连接Exchange的SMTP服务器。
2. 时段性故障的核心可能原因
(1)服务器sendmail队列阻塞或资源限制
下午大概率是邮件发送高峰,服务器的sendmail队列可能堆积了大量邮件,导致新的请求被延迟甚至丢弃。你可以登录服务器做这些检查:
- 执行命令
mailq查看邮件队列状态,看看有没有大量待发送的邮件; - 查看邮件服务日志(通常在
/var/log/mail.log或/var/log/messages),下午发送邮件时观察是否有队列满、超时、被拒绝等报错; - 检查服务器下午的资源使用情况(CPU、内存、磁盘IO),如果资源占满,
sendmail可能无法正常工作。
(2)邮件服务商的时段性限制
你的发件邮箱是Exchange托管的,但通过服务器sendmail中转时,下午Exchange服务器可能对该服务器IP设置了流量限制,或者IP被临时加入了可疑列表,导致邮件无法送达。
(3)调试信息的误导
CI的调试信息显示“发送成功”,只是说明它成功调用了sendmail程序,但sendmail是否真的把邮件投递出去,要看它的执行日志,而不是CI的返回结果。
3. 具体解决步骤
(1)修正配置,改用SMTP直接发送
把协议改成smtp,让CI直接连接Exchange服务器发件,绕过服务器的sendmail中转,这样能更直接地排查SMTP层面的错误,也能避免队列问题。修正后的配置如下(注意smtp_user要填完整的发件邮箱地址,你之前写的MyMail.com大概率是错的):
$config['protocol'] = 'smtp'; $config['smtp_host'] = "smtp.exchangeadministrado.com"; $config['smtp_user'] = "status.embarques@autotransportecari.com"; $config['smtp_pass'] = "MyPass"; $config['smtp_port'] = "587"; $config['smtp_timeout'] = "30"; $config['smtp_keepalive'] = TRUE; $config['smtp_crypto'] = "tls"; $config['charset'] = "utf-8"; $config['mailtype'] = "html"; $config['crlf'] = "\r\n"; $config['newline'] = "\r\n";
(2)添加详细错误日志
在邮件发送代码后添加日志记录,即使调试显示成功,也能捕获更详细的执行信息:
$htmlContent = $this->load->view('emailExpo_view',$data,true); $this->email->set_crlf( "\r\n" ); $this->email->to(implode(', ', array($correoCliente1, $correoCliente2, $correoCliente3))); $this->email->from('status.embarques@autotransportecari.com'); $this->email->cc($adresses); $this->email->subject('Actualización de Exportación'); $this->email->attach(FCPATH . "imagenes/cari.png", "inline"); $this->email->message($htmlContent); if (!$this->email->send()) { log_message('error', '邮件发送失败: ' . $this->email->print_debugger()); } else { log_message('info', '邮件发送执行记录: ' . $this->email->print_debugger()); }
(3)若坚持使用sendmail,排查服务器本地服务
- 执行
service sendmail restart重启邮件服务,测试下午是否能正常发送; - 联系服务器运维,检查是否有下午时段的资源限制策略。
内容的提问来源于stack exchange,提问作者Pahoran Alanis
相关产品推荐
相关产品推荐

