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

相关推荐

  • window配置Vue2开发环境

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

    2020年10月17日
    1.6K
  • 单点登录SSO设计与实现(转)

    前言: 是时候了解一下SSO相关的知识了,本篇主要是概念篇,发现网上两篇不错的文章,简单整合了一下,原文链接:https://www.cnblogs.com/Java3y/p/10…

    2021年7月29日
    2.4K
  • fiddler修改请求信息重新执行

    最近在做一个仿制功能开发时,碰到了这样一个场景:开发的系统需要在三方app里运行,并且在app里执行完后会产生一些数据,然后需要将这些数据保存起来。因为开发是在本地,本地的环境无法…

    2022年7月1日
    3.3K
  • VMware中CentOS 7设置文件夹共享的方法

    下午把虚拟机安装好了,但是还有一个不太给力的地方,就是本地代码每次编辑完总是要上传到服务器,之前windows的虚拟机是可以和物理机共享文件夹的,所以就尝试了一下通过文件夹共享来解…

    2021年8月16日
    2.0K
  • centos7下宝塔安装DocHub记录

    最近看到一篇利用文库上传文档作副业的文章,然后把网盘里的各种文档试着上传了一下,结果上传了80多个文档,就成功了2个文档,这成功率,简直不能忍。 趁着周末在家两天,在网上搜了一天的…

    2021年7月26日
    3.0K
  • 理解开发HD 钱包涉及的 BIP32、BIP44、BIP39(转)

    理解开发HD 钱包涉及的 BIP32、BIP44、BIP39 数字钱包概念 钱包用来存钱的,在区块链中,我们的数字资产都会对应到一个账户地址上, 只有拥有账户的钥匙(私钥)才可以对…

    2022年8月4日
    4.9K
  • 打破壁垒:使用 PHP 和 Nginx 在本地开发 OpenAI API

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

    2023年4月10日
    4.7K
  • 互联网医院_三级等保_存储型跨脚本执行漏洞

    最近公司在做三级等保备案,安全测试方反馈过来一份漏洞测试报告,其中有一条定义为高危的漏洞:存储型跨脚本执行。 造成这个漏洞的原因,是因为没有对客户端提交的内容进行安全过滤。系统用的…

    2021年2月5日
    40.7K
  • php向Postgresql中插入时间格式问题

    最近在对接互联网医院监管前置机时,向前置机Postgresql数据库插入数据时出现了一个问题,就是我在数据插入前置机前把时间用date(‘Y-m-d h:i:s&#82…

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

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

    2022年9月5日
    2.9K

发表回复

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