CodeIgniter部署VPS后无法通过Gmail SMTP发送邮件求助
解决CodeIgniter部署VPS后Gmail SMTP邮件验证失效问题
你遇到的这个问题其实挺常见的——本地跑正常,一上VPS就掉链子,大概率是安全限制、网络配置或者细节没踩对,我给你梳理几个排查和解决的方向:
一、先排查Gmail账户的安全限制
现在Gmail对陌生环境的登录管控很严,VPS的IP对Google来说就是陌生地址,这是最常见的原因:
- 如果你开了两步验证(2FA),必须用**应用专用密码(App Password)**替换代码里的普通密码!普通密码在开启2FA后会直接失效,去Google账户的「安全」板块生成一个App Password,把它填到
smtp_pass里。 - 登录你的Google账户,查看「最近登录活动」,如果有来自VPS IP的登录被标记为“可疑”,手动点击「这是我本人操作」允许该IP的访问。
- 注意:Gmail已经彻底取消了「允许低安全性应用」的选项,别再找这个设置了,用App Password才是正确路径。
二、检查VPS的网络与端口限制
很多VPS服务商默认会拦截SMTP相关端口,或者机房防火墙限制了出站连接:
- 在VPS上用命令测试连通性:
telnet smtp.gmail.com 465,如果连接超时或失败,说明465端口被封,可以联系服务商开放,或者换用587端口(配置改成smtp_host' => 'tls://smtp.gmail.com', 'smtp_port' => 587)。 - 检查VPS自身的防火墙(比如ufw、iptables),确保出站的465/587端口是开放状态。
三、修正CodeIgniter的邮件配置细节
你的代码里有个容易踩坑的点,还有优化建议:
- SMTP协议强制要求用
\r\n作为换行符,你的代码里crlf和newline的设置看起来显示是换行,大概率是没写对转义字符,改成下面这样:'crlf' => "\r\n", 'newline' => "\r\n" - 发件人地址建议用你Gmail账户的邮箱,而不是
no-reply@example.com——Gmail会拦截发件人与SMTP账户不一致的请求,把from改成xxx@gmail.com试试。
四、检查PHP环境依赖
确保VPS上的PHP启用了openssl扩展,因为SSL连接完全依赖它:
- 创建一个
phpinfo.php文件,内容是<?php phpinfo(); ?>,访问后搜索openssl,看是否显示enabled。如果没开启,在php.ini里添加extension=openssl,然后重启PHP服务。
五、启用调试信息快速定位问题
在$mail->send();后面加上调试代码,直接看具体的错误提示,比瞎猜高效多了:
if (!$mail->send()) { echo $mail->print_debugger(); exit; }
调试信息会告诉你是连接超时、认证失败还是邮件内容被拦截,直接锁定根源。
内容的提问来源于stack exchange,提问作者Danil Hendra
相关产品推荐
相关产品推荐

