web-dev-qa-db-fra.com

Wordpress envoie des emails en continu. Comment l'arrêter?

Récemment, je vais tester la fonction wp_mail. J'ai écrit ci-dessous le code dans un fichier de plugin: wp_mail( '[email protected]', 'The subject', 'The message' );

et j'ai entré mon email à la place de [email protected]. Maintenant, WordPress m'envoie continuellement des courriels. Je ne sais pas comment l'arrêter! Il y a plus de 1000 mails en seulement 15 minutes. Aidez-moi, s'il vous plaît. J'ai désactivé tous les plugins et même supprimer le fichier pluggable.php.

Le contexte est:

function twp_mail_action($result, $to, $cc, $bcc, $subject, $body){
    $nt = new Notifygram();
    $_apikey = get_option('twp_api_key');
    $_apitoken = get_option('twp_api_token');
    $_projectname = get_option('twp_project_name');
    $nt->Notifygram($_apikey,$_apitoken, $_projectname );
    $nt->notify($body);
    wp_mail( '[email protected]', 'The subject', 'The message' );
}
add_action( 'phpmailer_init', function( $phpmailer ){
    $phpmailer->action_function = 'twp_mail_action';
    } );
1
Ameer Mousavi

Le problème

Je pense que le problème ici est que vous générez une boucle infinie, en plaçant wp_mail() dans le callback $phpmailer->action_function, qui se déclenche après chaque email.

Chaque fois que vous envoyez un e-mail avec wp_mail(), vous appelez wp_mail() encore et encore, et encore ... etc.

Contournement possible

Vous devriez plutôt utiliser, par exemple, l'approche suivante:

function twp_mail_action($result, $to, $cc, $bcc, $subject, $body){

    // Here we remove the phpmailer_init action callback, to avoid infinite loop:
    remove_action( 'phpmailer_init', 'wpse_phpmailer_init' );

    // Send the test mail:
    wp_mail( '[email protected]', 'The subject', 'The message' );

    // Here we add it again
    add_action( 'phpmailer_init', 'wpse_phpmailer_init' );

}

add_action( 'phpmailer_init', 'wpse_phpmailer_init' );

function wpse_phpmailer_init( $phpmailer )
{
    $phpmailer->action_function = 'twp_mail_action';
} 

Notez que ceci estuntested, soyez donc prudent de le tester uniquement sur un serveur sur lequel vous pouvez vider vous-même la file d'attente si des erreurs sont commises lors du test ;-)

Meilleur:

Enregistrez vos tests dans un fichier à la place, par exemple.

Limiter la livraison des emails

Il serait intéressant de pouvoir limiter le nombre de courriels envoyés, par chargement de page, lors de tests.

Voici une idée pour un tel plugin:

<?php
/**
 * Plugin Name: Limit Delivered Emails
 * Description: Set an upper limit to number of sent emails per page load.
 * Plugin URI:  https://wordpress.stackexchange.com/a/193455/26350
 */
add_action( 'phpmailer_init', function( $phpmailer )
{
    $max_emails_per_page_load = 10; // <-- Edit this to your needs!

   if( did_action( 'phpmailer_init' ) > $max_emails_per_page_load )
       $phpmailer->ClearAllRecipients();

} );

où nous effaçons les champs vers/cc/bc , avec la méthode ClearAllRecipients(), pour arrêter la livraison du courrier électronique.

Nous pourrions également lancer une erreur non interceptée avec:

throw new \phpmailerException( __( 'Too many emails sent!' ) );

à la place d'utiliser:

$phpmailer->ClearAllRecipients();

Ceci est lié à ma réponse ici concernant l’utilisation de la classe PHPMailer.

7
birgire