You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cron任务脚本无法执行:无输出无报错,调用Mailchimp::campaign()失败

问题解决:Mailchimp::campaign() 方法不存在 + 代码其他问题

核心错误原因

你碰到的致命错误是因为调用了错误的Mailchimp SDK方法。当前引入的是Mailchimp API v2旧版SDK,但代码里用的是v3的链式调用语法(->campaign()->lists()->members(...)),而v2 SDK的Mailchimp类根本没有campaign()方法,直接导致报错。

分步修复方案

1. 升级到Mailchimp API v3 SDK(推荐,v2已废弃)

Mailchimp v2 API早已停止维护,建议直接切换到官方v3 SDK:

  • 用Composer安装的话,执行命令:
    composer require mailchimp/marketing
    
  • 手动安装的话,去官网下载v3 SDK包,替换原有的Mailchimp/目录。

2. 修正SQL查询的参数绑定错误

你的SQL语句写死了INTERVAL 7 DAY,却又调用bind_param("i", $days_before_reminder);,参数根本没生效。应该改成动态绑定:

$sql = "SELECT * FROM `users` WHERE `membership_expiry` <= DATE_ADD(CURDATE(), INTERVAL ? DAY)";
$stmt = $con->prepare($sql);
$stmt->bind_param("i", $days_before_reminder); // 现在参数绑定才真正生效

3. 修正Mailchimp发送逻辑

用v3 SDK的正确调用方式,并且不要在循环里重复初始化Mailchimp实例(完全没必要)。

4. 修正错误日志路径

Cron任务运行时的工作目录和手动执行时可能不同,建议给错误日志配置绝对路径,避免找不到文件。

完整修正后的代码

include('admin/database.php');
// 引入v3 SDK(Composer安装用下面这句,手动安装则调整路径)
require 'vendor/autoload.php';

use MailchimpMarketing\ApiClient;

// 提醒提前天数
$days_before_reminder = 7;

// Mailchimp配置
$api_key = "xxxxxxxxxxxxxxxxxxxxx";
$server_prefix = "usX"; // 你的API key前缀,比如key-us10里的us10
$list_id = "xxxxxxxx";

// 只初始化一次Mailchimp客户端
$mailchimp = new ApiClient();
$mailchimp->setConfig([
    'apiKey' => $api_key,
    'server' => $server_prefix
]);

// 修正后的SQL查询
$sql = "SELECT * FROM `users` WHERE `membership_expiry` <= DATE_ADD(CURDATE(), INTERVAL ? DAY)";
$stmt = $con->prepare($sql);
$stmt->bind_param("i", $days_before_reminder);
$stmt->execute();
$result = $stmt->get_result();

// 循环发送提醒
while ($row = $result->fetch_assoc()) {
    $memberName = $row["first_name"];
    $memberEmail = $row["email"];
    $expiryDate = $row["membership_expiry"];

    $data = [
        'email_address' => $memberEmail,
        'status' => 'subscribed',
        'merge_fields' => [
            'NAME' => $memberName,
            'EXPIRY_DATE' => $expiryDate,
        ]
    ];

    try {
        // v3 SDK添加/更新会员(如果提醒是通过Mailchimp自动化流程触发,这里只需同步会员信息即可)
        $response = $mailchimp->lists->setListMember($list_id, md5(strtolower($memberEmail)), $data);
        
        // 若要直接发送特定营销活动,需先创建活动或使用自动化邮件流程,需符合Mailchimp合规规则
        
        echo "提醒已发送至 $memberName ($memberEmail)\n";
    } catch (Exception $e) {
        // 替换为你的绝对日志路径,比如 /var/www/your_project/error.log
        $errorMessage = date('Y-m-d H:i:s') . " 发送提醒失败 $memberEmail: " . $e->getMessage() . "\n";
        error_log($errorMessage, 3, "/path/to/your/error.log");
        echo "发送失败 $memberEmail: " . $e->getMessage() . "\n";
    }
}

$stmt->close();
$con->close();

额外说明

  • 若坚持用v2 SDK(不推荐),需改用v2的方法,比如$Mailchimp_Lists->subscribe(...),但v2 API已废弃,随时可能失效。
  • Cron无输出问题:修正代码后,可把Cron命令改成输出重定向到日志,比如*/5 * * * * php /path/to/membership_reminder.php >> /path/to/cron.log 2>&1,这样就能查看输出和错误信息。

内容的提问来源于stack exchange,提问作者Mid9it Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 23:34:54