How to use ‘phpmailer_init’ SMTP settings only on certain ‘wp_mail’ actions?

Is there a conditional check I can run for phpmailer_init or a wp_mail parameter that let’s me apply my custom phpmailer_init SMTP settings only on specific wp_mail actions or does phpmailer_init always run sitewide?

1 Answer
1

phpmailer_init will always fire for every wp_mail() call – however, you can hook/unhook it conditionally like so:

function wpse_224496_phpmailer_init( $phpmailer ) {
    // SMTP setup

    // Always remove self at the end
    remove_action( 'phpmailer_init', __function__ );
}

function wpse_224496_wp_mail( $mail ) {
    // Example: only SMTP for emails addressed to foo@example.com
    if ( $mail['to'] === 'foo@example.com' )
        add_action( 'phpmailer_init', 'wpse_224496_phpmailer_init' );

    // Example: only SMTP for subject "Foo"
    if ( $mail['subject'] === 'Foo' )
        add_action( 'phpmailer_init', 'wpse_224496_phpmailer_init' );

    // Other properties
    $mail['message'];
    $mail['headers']; // Could be string or array
    $mail['attachments']; // Could be string or array

    return $mail;
}

add_filter( 'wp_mail', 'wpse_224496_wp_mail' );

Leave a Comment