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 [email protected]
    if ( $mail['to'] === '[email protected]' )
        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['headers']; // Could be string or array
    $mail['attachments']; // Could be string or array

    return $mail;

add_filter( 'wp_mail', 'wpse_224496_wp_mail' );
  • Your code pointed me in the right direction, thank you. I also had to add a foreach loop for the $headers array, searching for a match via strpos, as my SMTP condition depends on the "From" email address.
    – tomyam
    Commented Apr 22, 2016 at 12:54
  • Then you should give code here. Otherwise your answer should be removed and added as a comment to the relevant answer Commented May 4, 2017 at 23:33

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.