codeigniter发邮件sendmail报错

最近将公司系统从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账号到期了,穷的没钱续费【笑哭】)。

codeigniter发邮件sendmail报错

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

codeigniter发邮件sendmail报错

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

codeigniter发邮件sendmail报错
https://stackoverflow.com/questions/45252547/unable-to-send-email-using-php-smtp-your-server-might-not-be-configured-to-send

他说:造成这种情况的一个常见原因是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

赞 (1)
ZeyuZeyu
上一篇 2020年11月11日 下午6:01
下一篇 2020年11月12日 下午6:34

相关推荐

  • PHP代码审计一条龙思路(转)

    00×0 前言 最近也是边挖src边审计代码,总结下最近的php代码审计的一些思路,我一般按照顺序往下做,限于能力水平,可能会有不对或者欠缺的地方,希望各位师傅能够指导。 00×1…

    2022年5月31日
    1.7K
  • php后期静态绑定

    最近在跑一套系统时碰到一个头大的问题,laravel的队列任务(通过另一个原生系统读取数据库)在执行时,会出现数据库连接断开的问题,导致队列任务刚启动时可以正常运行,有一段时间没有…

    2022年4月18日
    1.7K
  • 常见的Web攻击手段(转)

    午饭期间,读者小李与我闲聊,谈到上周去面试的过程。经典的高开低走,面试初期答得还可以,但是到后面却不尽人意。其中有个面试问题引起了我的注意,面试官当时问小李:你知道有哪几种常见的&…

    2021年10月10日
    1.5K
  • 计算机网络协议总结(转载)

    一、OSI七层协议 1、物理层: 很久很久以前,那时候还没有现在的外星人超级电脑,或者华为的P30。比较调皮的小明想要把自己机器上写好的一些个人游戏心得(如何玩好王者农药)发给小红…

    2022年5月31日
    1.8K
  • window配置Vue2开发环境

    最近找到一套互联网医院的源码,前端技术栈用的是vue,于是想着把vue开发环境搭起来,在网上找了一点资料,现在总结记录一下,方便以后查阅。 一、介绍 Vue (读音 /v…

    2020年10月17日
    1.8K
  • linux 测试端口通不通(四种方法)(转)

    针对Linux系统:有1、2、3、4四种方法针对Windows系统:有2、5两种通用方法 一般情况下使用”telnet ip port”判断端口通不通,其实…

    2022年3月13日
    2.5K
  • 记录一下宝塔搭建Redis遇到的一个小问题

    最近在对接广东省互联网医院监管平台时,发现广东这边是要求平台必须要有医生和患者要有视频通话功能。因为原本的消息通话是用的网易IM,所以音视频也选的网易。网易音视频能实现通话视频云录…

    2021年6月29日
    1.8K
  • 记一次生产环境救火-20210716

    今天起了个早,早早来到公司,本来吃完早餐,泡好咖啡,在工位上气定神闲的刷刷昨天的财经信息,准备开启今天的工作。想起昨天微信群里有人反映系统,系统加载较慢,于是打开阿里云后台,准备看…

    2021年7月16日
    1.5K
  • 网站防DDOS攻击思路

    最近给一个客户搭的网站,受到DDOS攻击,因为源码是在网上找的,代码质量不忍直视,一个首页就有n条sql查询。虽然服务器配置用了8核8G内存,然后也加了阿里云全站加速(过滤了一些流…

    2022年9月5日
    3.2K
  • 打破壁垒:使用 PHP 和 Nginx 在本地开发 OpenAI API

    最近在开发一个OpenAI的产品,但是由于众所周知的原因, OpenAI API 有 IP 限制,使得在本地开发变得困难。开始我的想法是,把代码放服务器上去跑,可是这样一来,要修改…

    2023年4月10日
    5.0K

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注