最近wp_mail関数をテストします。以下のコードをプラグインファイルに書きました:wp_mail( '[email protected]', 'The subject', 'The message' );
そして私は[email protected]の代わりに私のメールアドレスを入力しました。今WordPressは絶えず私に電子メールを送ります。止める方法がわかりません!わずか15分で1000以上のメールがあります。私を助けてください。私はすべてのプラグインを無効にし、さらにはpluggable.phpファイルを削除しました。
コンテキストは以下のとおりです。
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';
} );
ここでの問題は、wp_mail()
を$phpmailer->action_function
コールバックの内側に置くことによって無限ループを生成していることであると思います。
wp_mail()
と一緒にEメールを送信するたびに、wp_mail()
を何度も呼び出します。
代わりに、たとえば次のようにします。
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';
}
これはテストされていないので注意してください。テストで間違いが発生した場合は、メールキューを自分でクリアできるサーバー上でのみ慎重にテストしてください。
たとえば、テストをファイルに記録してください。
テストをしている間に、1ページの読み込みあたりの送信電子メール数を制限できれば、それは面白いでしょう。
これがそのようなプラグインのための一つのアイデアです:
<?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();
} );
ここで、ClearAllRecipients()
メソッドを使って、から/ cc/bcまでのフィールドをクリアして、Eメール配信を停止します。
また、キャッチされていないエラーをスローする可能性があります。
throw new \phpmailerException( __( 'Too many emails sent!' ) );
代わりに:
$phpmailer->ClearAllRecipients();
これはPHPMailer
クラスの使用に関する私の 回答 に関連しています。