mandrill已停服,其api端点不可达,旧库mandrill_codeigniter因依赖下线接口、php版本不兼容及ci加载机制变更而彻底失效;应迁移至mailchimp transactional api,推荐smtp配置或guzzle调用官方sdk,并确保api key具备transactional权限且账户为付费计划。

Mandrill 已于 2016 年停止独立服务,其功能完全并入 Mailchimp,官方 SDK(mandrill-api-php)不再维护,且 Mandrill_CodeIgniter 这类第三方库早已失效或无法兼容现代 PHP/CodeIgniter 版本。直接使用它发邮件会失败,不是配置问题,而是底层 API 已不可达。
为什么 Mandrill_CodeIgniter 现在根本跑不起来
这个库依赖已下线的 https://mandrillapp.com/api/1.0/ 端点,所有请求都会返回 404 或 cURL error 7(无法连接)。即使你填对了 API key、改对了 config/email.php,也会卡在 Mandrill->messages->send() 这一步——因为服务器早就不认这个地址了。
- PHP 7.4+ 下,库中大量
mysql_*风格写法或过时的 cURL 选项会直接报Fatal error - CodeIgniter 3.1.11+ 和 CI4 完全不兼容该库的加载机制(它试图用
$this->load->library('mandrill'),但没定义__construct()参数注入逻辑) - Mailchimp 新的 Transactional API 使用
https://mandrillapp.com/api/docs/→ 实际是重定向到https://mailchimp.com/developer/transactional/,认证方式也从 API key 改为 Bearer Token + 更严格的 scope 控制
替代方案:用 CodeIgniter 原生 Email 类对接 Mailchimp Transactional(推荐)
不用额外装库,只改几行配置就能用上 Mailchimp 的现役邮件通道。关键是把发送逻辑从 Mandrill 切到 Mailchimp 的 SMTP 或 HTTP API。
- SMTP 方式最简单:在
application/config/email.php中设:$config['protocol'] = 'smtp'; $config['smtp_host'] = 'smtp.mailchimp.com'; $config['smtp_port'] = 587; $config['smtp_user'] = 'default'; // 不是邮箱,是 Mailchimp 提供的 username(在 Dashboard → Account → Extras → SMTP Settings 查) $config['smtp_pass'] = 'your_api_key_here'; // 注意:这里填的是 Mailchimp 的 API key,不是旧 Mandrill key $config['smtp_crypto'] = 'tls'; $config['mailtype'] = 'html';
- HTTP API 方式更可控(比如要带模板、跟踪参数):用 CodeIgniter 的
curl_request()或file_get_contents()调https://mandrillapp.com/api/2.0/messages/send.json→ 实际会 301 跳转到https://usX.api.mailchimp.com/3.0/messages/send,但官方明确要求用新 endpoint:https://mandrillapp.com/api/2.0/messages/send.json已废弃,必须用https://usX.api.mailchimp.com/3.0/messages/send(X 是你的数据中心号,如 us10) - 调用时 header 必须带:
Authorization: Bearer <your_mailchimp_api_key></your_mailchimp_api_key>,body 是 JSON,格式和旧 Mandrill 几乎一样,但字段名有微调(例如from_email→from_email保留,但track_opens改为tracking对象)
CI4 下更干净的做法:弃用 Email 类,直接用 Guzzle + Mailchimp SDK
CodeIgniter 4 自带 PSR-4 加载,可以直接 composer require mailchimp/marketing(注意不是 mailchimp/transactional,那个是旧包),然后用官方支持的 PHP SDK:
- 初始化 client:
$client = new \MailchimpMarketing\ApiClient(); $client->setConfig(['apiKey' => 'your-us10-key', 'server' => 'us10']); - 发信调用:
$response = $client->messages->send(['message' => ['from_email' => 'x@y.z', 'to' => [['email' => 'a@b.c']], 'subject' => 'hi', 'text' => 'plain']]); - 错误处理必须加:
if ($response->status !== 200) { log_message('error', 'Mailchimp send failed: ' . $response->body); }—— 因为 Mailchimp 返回 400 时 body 是 JSON 错误详情,不是字符串 - 别把 API key 写死,从
.env读:getenv('MAILCHIMP_API_KEY')
真正麻烦的不是代码怎么写,而是 Mailchimp 后台的权限设置:API key 必须有 Transactional scope,且账户得是付费计划(Free tier 不开放 transactional 发信)。这点很容易被忽略,测来测去都提示 Unauthorized,其实只是 key 没开权限。











