Codeigniter 3 无法通过PHP SMTP发送邮件的问题咨询
CodeIgniter 3 SMTP 发送 Gmail 邮件报错排查方案
常见报错原因
- Gmail 账号认证规则限制
目前谷歌已禁止第三方应用使用账号普通密码直接登录SMTP服务,你需要先为谷歌账号开启两步验证,然后生成专属的应用密码替换配置里的smtp_pass值;另外注意smtp_user的邮箱地址必须和from()方法设置的发件人地址完全一致,你当前代码里两个地址不匹配,会被谷歌SMTP服务直接拒绝。 - 配置项缺失/格式错误
CI3 邮件类的SMTP配置默认缺少换行符设置,会导致SMTP握手失败,需要补充两个配置项:
另外你当前配置里'newline' => "\r\n", 'crlf' => "\r\n",smtp_port填写的是字符串格式,建议改为数字类型587;同时检查PHP是否已开启openssl扩展,这是TLS/SSL加密SMTP连接的必备依赖。 - 端口/连接限制
本地运营商、防火墙可能会封禁587端口,可尝试将端口改为465,加密方式改为SSL验证:
注意原生mail函数走的是系统sendmail配置的代理链路,和CI直接发起SMTP直连的链路完全不同,所以原生可用不代表SMTP直连端口无限制。'smtp_port' => 465, 'smtp_crypto' => 'ssl', - 加载顺序冲突
你当前是先加载邮件类再初始化配置,可能存在默认配置覆盖自定义配置的问题,可改为加载类时直接传入配置参数,无需单独调用initialize方法:$this->load->library('email', $config);
修正后的参考代码
public function send_mail_verification(){ $config = array( 'protocol' => 'smtp', 'smtp_host' => 'smtp.gmail.com', 'smtp_port' => 587, 'smtp_crypto' => 'tls', 'smtp_user' => 'myacc@gmail.com', // 确保和发件人地址一致 'smtp_pass' => '你的谷歌应用密码', // 替换为生成的应用密码 'charset' => 'iso-8859-1', 'newline' => "\r\n", 'crlf' => "\r\n", 'smtp_timeout' => 10 ); $this->load->library('email', $config); $this->email->from('myacc@gmail.com', 'Registration'); // 发件人和smtp_user一致 $this->email->to('tosomeonemail@gmail.com'); $this->email->subject('something'); $this->email->message('Testing email.'); if($this->email->send()){ echo "success"; } else{ show_error($this->email->print_debugger()); } }
内容的提问来源于stack exchange,提问作者Amben Uchiha
相关产品推荐
相关产品推荐

