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

如何解决发送批量邮件时出现的Error 524超时问题?

解决BuddyPress批量发送邮件超时问题

问题根源

你当前的代码在用户发布内容的同步流程里,循环调用wp_mail发送300封邮件,每封邮件都是同步HTTP请求,总耗时远超服务器超时阈值(一般30秒左右),导致页面524超时,邮件还没发完就被中断。另外代码里存在一处错误:获取用户时用了$activity->user_id,但函数参数只有$activity_array,应改为$activity_array['user_id'],否则会导致排除发布者失败甚至报错。

解决方案

方案1:用WP Cron异步发送邮件(推荐)

把邮件发送任务放到WordPress后台定时任务中,用户发布内容时仅触发任务调度,不直接执行发送,避免阻塞前台请求。

代码示例:

// 注册Cron事件钩子
add_action('send_bp_activity_email_cron', 'send_bp_activity_email_to_users', 10, 2);

// 用户发布内容时调度Cron事件
function schedule_bp_activity_email($activity_array, $activity_id) {
    // 避免重复调度
    if (!wp_next_scheduled('send_bp_activity_email_cron', array($activity_array, $activity_id))) {
        wp_schedule_single_event(time(), 'send_bp_activity_email_cron', array($activity_array, $activity_id));
    }
}
add_action('bp_activity_add', 'schedule_bp_activity_email', 10, 2);

// 实际执行邮件发送的函数
function send_bp_activity_email_to_users($activity_array, $activity_id) {
    $username = bp_core_get_username($activity_array['user_id']);
    $view_link = bp_get_root_domain() . '/' . bp_get_activity_root_slug() . '/p/' . $activity_id;
    
    // 获取所有用户,排除发布者
    $users = BP_Core_User::get_users(array(
        'type' => 'alphabetical',
        'exclude' => array($activity_array['user_id']),
    ));
    
    foreach ($users['users'] as $user) {
        $to = $user->user_email;
        $subject = '新动态通知';
        // 配置HTML邮件头
        $headers = array('Content-Type: text/html; charset=UTF-8');
        $message = $username . "发布了新动态<br>你可以点击查看:<a href='{$view_link}'>{$view_link}</a>";
        
        wp_mail($to, $subject, $message, $headers);
        // 每发一封加1秒延迟,避免触发邮件服务商频率限制
        sleep(1);
    }
}

方案2:用BCC批量发送(更高效)

如果允许将所有用户放到密送(BCC)中,只发送一封邮件,速度会大幅提升,不会出现超时问题。

代码示例:

function send_email_to_all_users($activity_array, $activity_id) {
    $username = bp_core_get_username($activity_array['user_id']);
    $view_link = bp_get_root_domain() . '/' . bp_get_activity_root_slug() . '/p/' . $activity_id;
    
    // 仅获取用户邮箱,减少数据量
    $users = BP_Core_User::get_users(array(
        'type' => 'alphabetical',
        'exclude' => array($activity_array['user_id']),
        'fields' => 'user_email'
    ));
    
    $bcc_emails = implode(', ', $users['users']);
    $subject = '新动态通知';
    $headers = array(
        'Content-Type: text/html; charset=UTF-8',
        "Bcc: {$bcc_emails}"
    );
    $message = $username . "发布了新动态<br>你可以点击查看:<a href='{$view_link}'>{$view_link}</a>";
    
    // 发送给站点管理员邮箱作为主收件人,实际用户在BCC中
    wp_mail('admin@your-site.com', $subject, $message, $headers);
}
add_action('bp_activity_add', 'send_email_to_all_users', 10, 2);

注意:部分邮件服务商对BCC收件人数有上限(如Gmail为100人),超过限制可拆分多个BCC批次发送。

额外优化建议

  • 安装SMTP插件(如WP Mail SMTP)替代WordPress默认mail()函数,提升邮件发送成功率和速度
  • 若使用Cron方案,建议配置服务器Cron触发WP Cron,避免依赖前台访问触发,可靠性更高
  • 给邮件添加退订链接,符合邮件合规要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:47:12