如何解决错误 524 发送电子邮件时发生超时

问题描述 投票:0回答:1

对于我的网站,每当有人在博客墙上发布内容时,我都需要向所有用户发送一封电子邮件(我正在使用 BuddyPress 和 Youzify)。 为此,我在 function.php 中编写了一个函数,但问题是我有很多用户(大约 300 个),所以当有人发布一些东西时,加载时间很长,一段时间后控制台出现 524 错误. 如果我重新加载页面,新帖子就在这里,但没有发送电子邮件。

function send_email_to_all_users($activity_array, $activity_id) {
//get the post user's id 
    $username = bp_core_get_username( $activity_array['user_id']);
//get the link of the new post
    $view_link = bp_get_root_domain() . '/' . bp_get_activity_root_slug() . '/p/' . $activity_id;
//get every user but not the one who posted
    $users = BP_Core_User::get_users( array(
            'type' => 'alphabetical',
            'exclude' => array( $activity->user_id ),
        ) );
//for every user send an email
    foreach ( $users['users'] as $user ) {
        $to = $user->user_email;
           $subject = 'mail test subject';
            $message = $username .  " published <br> You can see " . $username . ', post here: ' . $view_link;
        
         wp_mail( $to, $subject, $message );
            
    }
}
add_action( 'bp_activity_add', 'send_email_to_all_users', 10, 4 );

当我只尝试使用一封电子邮件时,效果很好

function send_email_to_all_users($activity_array, $activity_id) {
//get the post user's id 
    $username = bp_core_get_username( $activity_array['user_id']);
//get the link of the new post
    $view_link = bp_get_root_domain() . '/' . bp_get_activity_root_slug() . '/p/' . $activity_id;

   
        $to = '[email protected]';
           $subject = 'mail test subject';
            $message = $username .  " published <br> You can see " . $username . ', post here: ' . $view_link;
        
         wp_mail( $to, $subject, $message );
            
    
}
add_action( 'bp_activity_add', 'send_email_to_all_users', 10, 4 );

有人知道如何解决这个问题吗?

php wordpress email lazy-loading buddypress
1个回答
0
投票

300 封电子邮件并不算多,除非您的托管“较弱”或有很多并发活动帖子。 一些托管公司限制每天、每小时等可以发送的电子邮件数量。请询问您的主机。

队列插件可能有帮助,但你可以加快你的过滤功能......

这对您的需求来说效率很低:

$users = BP_Core_User::get_users...

它收集了各种你不需要的东西。您只需要电子邮件地址。而且顺序无关紧要。

所有你需要的是 WP 功能get_users.

例如,像这样的东西:

$users = get_users( array( 'fields' => array( 'user_email' ) ) );
foreach ( $users as $user ) {
    $to = $user->user_email;
    //...etc
}

如果您真的需要阻止作者收到电子邮件,请先获取他们的电子邮件:

$current_user = wp_get_current_user();
$current_user_email = $current_user->user_email;

然后在开始循环之前使用 unset 将其从

$users
数组中删除。

© www.soinside.com 2019 - 2024. All rights reserved.