CI电子邮件send()函数仅返回true或false。有没有办法得到更详细的原因,为什么发送失败?我正在使用SMTP。
答案 0 :(得分:15)
您可以使用电子邮件调试程序进一步检查发生的情况:
$r = $this->send(FALSE);
if (!$r)
$this->email->print_debugger()
;
来自Codeigniter Email Class Reference。
如果您需要将调试器输出作为字符串,则可以使用output buffer来捕获输出:
$errors = array();
... # Loop
$r = $this->send(FALSE);
if (!$r) {
ob_start();
$this->email->print_debugger();
$error = ob_end_clean();
$errors[] = $error;
}
... # Loop end
更新版本中的Codeigniter要求$auto_clear
parameter of the email->send()
function显式为FALSE,以便不清除消息和调试,如果未能通过FALSE,则会有效地终止调试器函数。
答案 1 :(得分:8)
print_debugger()
功能可以使用,但它会在底部附加电子邮件标题和消息。如果你想要的只是一个调试消息的数组(包括成功和错误消息),你可以考虑扩展Email类的功能,如下所示:
<?php
class MY_Email extends CI_Email
{
public function clear_debugger_messages()
{
$this->_debug_msg = array();
}
public function get_debugger_messages()
{
return $this->_debug_msg;
}
}
您希望将其放在./application/libraries文件夹中名为MY_Email.php的文件中。 CodeIgniter会自动识别这个类的存在并使用它而不是它的默认类。
如果要获取调试消息的列表(数组),则可以执行以下操作:
$this->email->get_debugger_messages();
如果您正在循环浏览消息并且不想包含先前尝试的调试器消息,则可以执行以下操作:
foreach ( $email_addresses as $email_address )
{
$this->email->to($emai_address);
if ( ! $this->email->send() )
{
echo 'Failed';
// Loop through the debugger messages.
foreach ( $this->email->get_debugger_messages() as $debugger_message )
echo $debugger_message;
// Remove the debugger messages as they're not necessary for the next attempt.
$this->email->clear_debugger_messages();
}
else
echo 'Sent';
}
参考:https://www.codeigniter.com/user_guide/general/creating_libraries.html的“扩展本地库”部分。
答案 2 :(得分:-1)
您可以查看邮件日志。如果邮件错误,那么你应该有一个记录,说明为什么在那里。
虽然这取决于您的系统,但我不确定它们的位置。