首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wp_mail没有在Cron内运行

wp_mail没有在Cron内运行
EN

WordPress Development用户
提问于 2019-12-03 21:33:24
回答 2查看 677关注 0票数 2

在cron函数中调度时,wp_mail()函数没有运行。我增加了以下功能:

代码语言:javascript
复制
add_filter( 'cron_schedules', 'isa_add_every_one_minutes' );
function isa_add_every_one_minutes( $schedules ) {
    $schedules['every_sixty_seconds'] = array(
            'interval'  => 60,
            'display'   => __( 'Every 1 Minutes', 'textdomain' )
    );
    return $schedules;
}

// Schedule an action if it's not already scheduled
if ( ! wp_next_scheduled( 'isa_add_every_one_minutes' ) ) {
    wp_schedule_event( time(), 'every_sixty_seconds', 'isa_add_every_one_minutes' );
}

// Hook into that action that'll fire every three minutes
add_action( 'isa_add_every_one_minutes', 'only_debug_admin' );


function only_debug_admin(){
    $message = "Test message";

wp_mail( 'email@example.com', $message, $message );

update_option('default_role','customer');   
    }

当我通过wp控制插件手动运行cron时,我收到一封邮件,wp-mail工作正常。但是,当运行cron作业时。为了进行调试,我在mail函数下面添加了这一行:

代码语言:javascript
复制
update_option('default_role','customer'); 

我在WordPress设置中将默认角色设置为订户。在cron运行时,该设置将被更新为“customer”,但没有收到邮件。在手动运行该函数时,将接收邮件。知道为什么会这样吗?

EN

回答 2

WordPress Development用户

发布于 2019-12-04 13:00:18

这个有点令人费解。我本来想说的是,在发送邮件之后,您需要确定是否有问题,因为您在下一次操作中受到了攻击。但后来我重读了一遍,并捕捉到了当电子邮件手动运行时收到的部分。

您需要做的是找出是否发生了错误。因为这不是一个手动的过程,所以这并不是很直接;但是有一些方法可以做到。这个答案不会具体地解决所遇到的问题,但是它应该为您提供方法来确定实际问题是什么。

我会设置好捕捉任何错误,然后记录它们。您可以通过确保为调试设置WP并记录任何错误来做到这一点。确保wp-config.php中有以下内容:

代码语言:javascript
复制
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );

现在,您可以使用WP的error_log()函数将任何错误写入日志文件。

运行时,wp_mail()返回一个真正的“假布尔值”。如果有任何错误,它将返回false。因此,我们可以根据结果写入日志。

因此,在您的函数中,根据返回的结果写入错误日志。

代码语言:javascript
复制
function only_debug_admin(){
    $message = "Test message";

    $wp_mail_result = wp_mail( 'email@example.com', $message, $message );

    if ( true === $wp_mail_result ) {
        error_log( 'wp_mail returned true!' );
    } else {
        error_log( 'wp_mail had an error!' );
    }
}

如果wp_mail()错误(返回false),那么您希望能够捕获phpMailer中的任何错误,以查看这是否让您了解原因。

代码语言:javascript
复制
add_action( 'phpmailer_init', 'my_log_phpmailer_init' );
function my_log_phpmailer_init( $phpmailer ) {
    error_log( print_r( $phpmailer, true ) );
}

现在,当cron运行时,您可以检查错误日志(/ when /调试器日志)发生了什么。如果wp_mail()返回为真,则该问题是发送主机或接收方(WP之外)的电子邮件问题。如果错误,请检查来自phpMailer的错误(这也应该在日志中)。

这并不能解决您的问题,但是它可以帮助您了解问题的实质。

票数 2
EN

WordPress Development用户

发布于 2022-01-10 09:49:10

在使用CLI运行cron作业(首选)时,这种情况非常常见。Wordpress使用PHPMailer,它试图从未定义的$_SERVER变量中获取SERVER_NAME,然后尝试很少回调,从而导致无效的电子邮件地址。我能想到的最简单的hacky修复,例如在wp-config.php中定义它。

代码语言:javascript
复制
if(empty($_SERVER['SERVER_NAME'])) $_SERVER['SERVER_NAME']='www.yourdomain.tld';
票数 0
EN
页面原文内容由WordPress Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://wordpress.stackexchange.com/questions/353865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档