最稳方案是直接用Mailgun SMTP接口而非SDK,CodeIgniter原生支持;需严格配置smtp_host、smtp_user、smtp_pass、smtp_port、smtp_crypto共5项,填错任一将静默失败。

直接用 Mailgun 的 SMTP 接口最稳,别碰它的官方 SDK——CodeIgniter 的 email 类原生支持,配置对了就能发,不用额外装包、不引入兼容风险。
Mailgun SMTP 配置必须填对这 5 个键
Mailgun 不提供传统“用户名密码”式登录,而是用 smtp.mailgun.org + API Key 模拟 SMTP 凭据。CI3 或 CI4 均需以下硬性配置:
-
smtp_host必须为smtp.mailgun.org(不是mailgun.org或带端口的 URL) -
smtp_user必须填 Mailgun 控制台里 “SMTP Credentials” 下的 Default SMTP Login(形如postmaster@sandbox123456789.mailgun.org) -
smtp_pass必须填同一页面下的 Password(不是 API Key,也不是私钥) -
smtp_port选587(配tls)或465(配ssl),二者不可混搭 -
smtp_crypto必须小写,且与端口严格对应:tls对应 587,ssl对应 465
填错任意一项,$this->email->send() 都会静默失败,print_debugger() 只显示 “Unable to send email using PHP SMTP”,毫无提示。
CI3 中 config/email.php 的最小可用模板
把下面内容存为 application/config/email.php,替换掉占位符即可开用:
<?php $config['protocol'] = 'smtp'; $config['smtp_host'] = 'smtp.mailgun.org'; $config['smtp_user'] = 'postmaster@sandbox123456789.mailgun.org'; $config['smtp_pass'] = 'your_actual_smtp_password_here'; $config['smtp_port'] = 587; $config['smtp_crypto'] = 'tls'; $config['charset'] = 'utf-8'; $config['mailtype'] = 'html'; $config['newline'] = "\r\n"; $config['crlf'] = "\r\n";
注意两点:
-
newline和crlf必须显式设为"\r\n",CI3 在 Windows 环境下默认用\n,会导致 Mailgun 拒收 -
mailtype设为html是安全选择,哪怕只发文本——Mailgun 对纯文本邮件的 MIME 头处理更松,但 HTML 模式下编码和换行控制更可靠
发信时 from 地址必须是 Mailgun 已验证域名或邮箱
Mailgun 强制要求 $this->email->from() 的邮箱地址必须满足以下任一条件,否则直接 550 拒绝:
- 属于你已通过 Mailgun 控制台验证的自定义域名(如
contact@yourdomain.com) - 是 Mailgun 提供的 sandbox 域名下的邮箱,且该邮箱已在控制台“Authorized Recipients”中添加(如
you@gmail.com)
常见错误是用未验证的 Gmail 或 QQ 邮箱作 from,看起来能初始化、能调 send(),但实际根本连不上 Mailgun SMTP 服务器——print_debugger() 里会出现 Failed to authenticate on SMTP server 或空连接超时,而非明确报错。
CI4 用户请改用 .env 配置,且 key 名不能错
CI4 不读 config/email.php,必须在 .env 里写:
email.default.protocol = smtp email.default.SMTPHost = smtp.mailgun.org email.default.SMTPUser = postmaster@sandbox123456789.mailgun.org email.default.SMTPPass = your_actual_smtp_password_here email.default.SMTPPort = 587 email.default.SMTPCrypto = tls email.default.fromEmail = postmaster@sandbox123456789.mailgun.org email.default.fromName = "My App"
关键陷阱:
- key 名必须是
email.default.*,写成email.production.*或email.smtp.*全无效 -
SMTPHost不能带ssl://前缀(那是 CI3 旧写法),CI4 内部自动处理协议升级 - 确保
app/Config/Boot/environment.php中有DotEnv::load()调用,否则 .env 根本不加载
Mailgun 的真正难点不在集成,而在验证链:sandbox 域名 → 验证邮箱 → 配置匹配 → 发信地址白名单,漏一环就卡在连接层,debugger 也不报具体原因。


















