WordPress中,站长为了让自己更加了解站点的运行情况,一般新用户注册、登录或者用户评论时都会发送邮件通知站长本人,或者发送相关的通知给用户,但是由于在WordPress发送邮件的方式是同步的,而我又是使用的qq邮箱的smtp发送邮件,服务器不是在国内,这导致用户登录或者评论文章都要好久的时间,如果可以异步发送邮件就好了,不阻塞用户当前操作,改善用户体验。

然后就找到了这个链接:https://wordpress.stackexchange.com/questions/185295/how-to-make-wordpress-emails-async

主要的异步发送邮件代码如下:

/**
 * 异步发送邮件
 */

if ( ! defined( 'DOING_CRON' ) || ( defined( 'DOING_CRON' ) && ! DOING_CRON ) ) {
    function wp_mail() {

       // 获取 wp_mail 函数的参数
       $args = func_get_args();

       // 添加一个随机值以避免重复发送,参考: http://codex.wordpress.org/Function_Reference/wp_schedule_single_event
       $args[] = mt_rand();

       // 5 秒之后发送邮件
       wp_schedule_single_event( time() + 5, 'cron_send_mail', $args );
    }
 }


add_action( 'cron_send_mail', function () {
    $args = func_get_args();

    // 移除上面添加的随机数
    array_pop( $args );

    call_user_func_array( 'wp_mail', $args );
 }, 10, 10 );

上述代码重写了非CRON请求的wp_mail函数,使用wp_schedule_single_event做定时任务,在5秒之后才发送邮件,这样就可以完美的解决同步发送邮件会阻塞的缺点,是一个非常好的异步解决方案。

参考链接