web-dev-qa-db-ja.com

Wordpressは継続的に電子メールを送信しています。それを止めるには?

最近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';
    } );
1
Ameer Mousavi

問題

ここでの問題は、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クラスの使用に関する私の 回答 に関連しています。

7
birgire