最近将公司系统从Windows换成了Linux,大部分功能都能正常使用,唯独发送邮件通知功能时,出现了错误。通过var_dump($CI->email->print_debugger());打印调试错误时,报错:”Unable to send email using PHP SMTP. Your server might not be configured to send mail using this method”。
下面是配置方法(在Windows环境下使用没有问题):
/**
* 通过email发送提醒
* @param unknown $message 邮件内容
* @param unknown $subject 主题
* @param unknown $to_email 收件地址
* @param string $chaosong 抄送
*/
public function send_msg_qqmail($message,$subject,$to_email,$chaosong=''){
$result=FALSE;
$CI=& get_instance();
$CI->load->library('email');
$config['protocol'] = 'smtp';
$config['smtp_host'] = 'ssl://smtp.qq.com';
$config['smtp_user'] = '595*****@qq.com';
$config['smtp_pass'] = "vhcll********";//填写腾讯邮箱开启POP3/SMTP服务时的授权码,即核对密码正确
$config['smtp_port'] = 465;
$config['charset'] = 'utf-8';
$config['smtp_timeout'] = 30;
$config['mailtype'] = 'text';
$config['wordwrap'] = TRUE;
$config['crlf'] = PHP_EOL;
$config['newline'] = PHP_EOL;
$CI->email->initialize($config);
$CI->email->from('595*****@qq.com', '淘**');
$CI->email->to($to_email);
!empty($chaosong) && $CI->email->cc($chaosong);
//$CI->email->bcc('595*****@jinzhijun.cn');
$CI->email->subject($subject);
$CI->email->message($message);
$result=$CI->email->send();
if(!$result){
log_for_debug($CI->email->print_debugger(),"mail_debug");
//var_dump($CI->email->print_debugger());
}
return $result;
}
但是在Linux下就出现了问题,本着面向搜索引擎编程的原则,立即将错误信息复制到百度(为什么不用谷歌?vpn账号到期了,穷的没钱续费【笑哭】)。

搜出来的结果,搜出来的结果有说端口号的问题,有说ssl插件问题的,有说 protocol 协议问题的,其中出现较多的问题是 newline配置问题。于是试着将“$config[‘newline’] = PHP_EOL;”换成“ $config[‘newline’] = “\r\n”; ”。在将这些都尝试之后,问题依旧存在。这就很尴尬了,就像你眼看着钥匙扣上的钥匙一把把试完,可是锁还没打开。

钥匙扣上的钥匙试完了没打开锁,能怎么办呢?那就再重新来一遍。因此重新再看一遍那些解决方案,特别是英文的(因为英文太菜,说不定就疏忽了某些细节)。果然,在一个老哥的回帖中找到一个细节。

他说:造成这种情况的一个常见原因是CodeIgniter与SMTP服务器使用的换行符不一样, 也许SMTP服务器需要的是“ \r\n ”,而CodeIgniter使用的是“ \n ”,要修复这个问题,只要正确配置换行符就可以了。第一次排查问题时使用的是在配置数组里设置的,即:$config['newline'] = "\r\n";
但是这样问题没有解决,再细看老哥的解决方法发现 newline = "\r\n"
的配置要放在 initialize ()之后。
$CI->email->initialize($config);
$CI->email->set_newline("\r\n");
一试,果然解决问题,只是不知道为什么要在初始化之后再设置才行?算了赖得去了解了,再去完成几个bug,早点下班不香吗?
你要是看到这篇文章,并且知道知道原因,麻烦留个言。感谢!
为了防止有的同学像我一样粗心大意,再次说明解决办法是: newline = "\r\n"
的配置要放在 initialize ()之后。下面是完整代码。
/**
* 通过email发送提醒
* @param unknown $message 邮件内容
* @param unknown $subject 主题
* @param unknown $to_email 收件地址
* @param string $chaosong 抄送
*/
public function send_msg_qqmail($message,$subject,$to_email,$chaosong=''){
$result=FALSE;
$CI=& get_instance();
$CI->load->library('email');
$config['protocol'] = 'smtp';
$config['smtp_host'] = 'ssl://smtp.qq.com';
$config['smtp_user'] = '595*****@qq.com';
$config['smtp_pass'] = "vhcll********";//填写腾讯邮箱开启POP3/SMTP服务时的授权码,即核对密码正确
$config['smtp_port'] = 465;
$config['charset'] = 'utf-8';
$config['smtp_timeout'] = 30;
$config['mailtype'] = 'text';
$config['wordwrap'] = TRUE;
$config['crlf'] = PHP_EOL;
$config['newline'] = PHP_EOL;
$CI->email->initialize($config);
$CI->email->set_newline("\r\n");
$CI->email->from('595*****@qq.com', '淘**');
$CI->email->to($to_email);
!empty($chaosong) && $CI->email->cc($chaosong);
//$CI->email->bcc('595*****@jinzhijun.cn');
$CI->email->subject($subject);
$CI->email->message($message);
$result=$CI->email->send();
if(!$result){
log_for_debug($CI->email->print_debugger(),"mail_debug");
//var_dump($CI->email->print_debugger());
}
return $result;
}
原创文章,作者:Zeyu,如若转载,请注明出处:https://jinzhijun.cn/develop/141