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

相关推荐

  • 以太坊节点面面观:全节点与轻节点(转)

    收看本系列文章的读者,应该都对于区块链的基本原理和架构有些概念,如果没有,推荐您先去Google搜寻区块链、比特币、以太坊这些关键字了解一下。我们将在这些基础概念之上,来谈区块链的…

    2020年11月30日
    7.1K
  • php实现助记词转TRX,ETH 私钥和钱包地址

    TRX助记词转地址网上都是Java,js或其他语言开发的示例,一个简单的功能需要依赖其他环境来实现表示不能忍,毕竟php是世界上最好的语言。【狗头】 一、知识准备 要实现助记词转T…

    2022年8月4日
    8.3K
  • Centos安装elasticsearch教程

    最近在部署一个项目是用 laravel开发,项目用到了了 elasticsearch,通过自己的搜索和学习能力不算很费力解决了。下面就整理一下安装elasticsearch教程,服…

    2020年11月26日
    1.9K
  • 广东互联网医院监管对接_前置机FTP文件上传

    最近在广东省互联网医院监管对接过程中,有些文件需要同步到前置机上,我这里用到的解决方案是通过ftp上传文件功能实现的,这里记录一下一些遇到的问题。 1.安装,配置ftp服务器软件 …

    2021年5月26日
    1.9K
  • docker的备份和迁移

    1.查看容器 2.容器保存为镜像 php是容器名称 myphp是新的镜像名称 此镜像的内容就是你当前容器的内容,接下来你可以用此镜像再次运行新的容器 然后查询镜像,看一下结果 3.…

    2020年11月17日
    1.8K
  • Centos7 升级内核版本(转)

    1、查看当前内核版本 [root@localhost ~]# uname -r 3.10.0-327.el7.x86_64 [root@localhost ~]# uname -a…

    2022年3月13日
    1.8K
  • 红米8A刷机root流程记录

    自从安卓版本升级以后,app抓包https就成了问题,所以上周就在咸鱼上买了一个红米8a,计划着root手机来做开发测试使用。在绑了小米账号7天后,终于可以解除bl锁,然后把手机r…

    2023年3月5日
    6.9K
  • 使用 Laravel 开发 API 时的前置准备(转)

    一、前言 使用 Laravel 有一段时间了,虽然公司项目使用的都是 Thinkphp 框架,但我个人还是比较偏好 Laravel,今天来总结我平时进行开发前的一些准备工作,如果有…

    2022年7月15日
    3.8K
  • 常见的Web攻击手段(转)

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

    2021年10月10日
    1.6K
  • php后期静态绑定

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

    2022年4月18日
    1.8K

发表回复

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