如何解决发送批量邮件时出现的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
相关产品推荐
相关产品推荐

