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';
} );
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.
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 ;-)
Enregistrez vos tests dans un fichier à la place, par exemple.
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
.