codeigniter 4 smtp 邮件发送失败的核心原因是 .env 中 email.default.* 配置未被正确加载或命名不规范,需严格使用该前缀、启用 dotenv::load(),并配合 gmail 应用专用密码与 ssl/tls 加密设置。

CodeIgniter 配置 SMTP 发送邮件,核心是让框架正确连接到邮件服务商(如 Gmail、163、Mailchimp 等),并完成身份认证与内容投递。关键不在“能不能发”,而在“配置是否被真正加载、参数是否匹配服务商当前要求”。尤其 CI4 对 .env 变量命名和加载逻辑有严格约定,错一个前缀或少一行加载,就可能静默失败。
确认用的是 CI3 还是 CI4
两者配置方式差异明显,不能混用:
-
CI3:直接在
application/config/email.php中写死配置数组,或在控制器里传入 $config;支持ssl://smtp.xxx.com这类带协议前缀的 host 写法。 -
CI4:默认从
.env文件读取email.default.*开头的变量,不自动识别 email.production.* 或其他前缀;host 必须写成smtp.gmail.com(不加 ssl://);加密方式由SMTPCrypto单独指定。
填对 SMTP 基础参数(以 Gmail 为例)
Gmail 已全面停用“低安全性应用访问”,必须用「应用专用密码」(App Password),且需已开启两步验证:
-
SMTPHost:
smtp.gmail.com -
SMTPUser:你的完整 Gmail 地址(如
name@gmail.com) - SMTPPass:16 位应用专用密码(不是登录密码)
-
SMTPPort:
465(配ssl)或587(配tls) -
SMTPCrypto:对应填
ssl或tls,不能留空或写错大小写 - fromEmail / fromName:建议在 .env 中一并配置,避免代码里硬编码
确保配置真正生效
很多失败其实卡在“配置写了,但没被读到”:
-
CI4 必查:确认
app/Config/Boot/environment.php中调用了DotEnv::load();检查.env文件权限是否允许 PHP 读取;配置键名必须是email.default.SMTPHost,不是email.smtp_host。 -
CI3 必查:若在控制器中手动 new Email 实例,记得传入 $config;若用 config/email.php,确保文件存在且无语法错误;
$config['smtp_timeout']建议设为5~10,避免卡死。 - 发送前加一句
echo $this->email->print_debugger(); exit;,能立刻看到连接过程、报错原因(比如 “Failed to authenticate” 或 “Connection timed out”)。
换服务商只需改几项(推荐 Mailchimp Transactional)
不用装新库,只改 .env 就能切到更稳定的服务:
-
SMTP 方式:
email.default.SMTPHost = smtp.mailchimp.com
email.default.SMTPUser = default
email.default.SMTPPass = your_mailchimp_api_key
email.default.SMTPPort = 587
email.default.SMTPCrypto = tls - Mailchimp 的 SMTP User 固定为
default,密码填后台获取的 API Key(不是旧 Mandrill Key);它比个人邮箱更适合作为企业级通知通道。











