How do I override the Message-ID header of wp_mail function?

I have a custom notification function for our comments editor, who prefers to have all comments from one article threaded together in her email client. To achieve this, I’m creating a custom message-ID for the first comment on an article, then setting that as the In-Reply-To for future comment notifications.

This is working to some extent – I can see the additional headers in the mail client – however, the first message is being created with TWO Message-IDs. In other words, the one I passed into the headers is NOT overriding the one WordPress is autogenerating. Therefore, the threading doesn’t work.

Read More

Is this a bug with WordPress? I don’t want to resort to hunting down the actual WP_mail function and editing core code; and I’m not sure that would even work. Is this something more fundamental with PHP Mail function that I can’t change perhaps?

$messageIDtoCreate = $post->ID.".".time(); // post ID, and current timestamp
add_post_meta( $post->ID, 'messageID', $messageIDtoCreate);
// add to the email headers
$message_headers .= "Message-ID: <".$messageIDtoCreate."@test.com>n";

Thanks in advance.

Related posts

Leave a Reply

3 comments

  1. You can filter the $phpmailer object. Something like this should do the trick (not tested):

    add_action( 'phpmailer_init', 'wpse_52555_msg_id' );
    
    function wpse_52555_msg_id( &$phpmailer )
    {
        $msg_id = get_post_meta( get_the_ID(), 'messageID', TRUE );
        '' !== $msg_id and $phpmailer->MessageID = $msg_id . '@test.com';
    }
    
  2. Anyone looking to just update the hostname inside the messageID, which may be needed for Nginx setup. WordPress documentation.

    add_action('phpmailer_init', 'sender_message_id');
    
    function sender_message_id(&$phpmailer) {
      $phpmailer->Hostname = 'domain.com';
    }
    
  3. I think I found the solution to the initial problem.

    You must, of course, use the phpmailer_init action to change the message-ID property of object phpmailer (used by wp_mail function). Thanks to Fuxia for the answer.

    It is also necessary to respect message-ID format in accordance with the rfc5322 section-3.6.4 otherwise your new message-ID will be rejected (consult here the source file of phpmailer where the message-ID is setted).

    Here is the correct format of a message-ID : <leftpart@rightpart> including brackets

    Here is the code tested that works:

    add_action('phpmailer_init', 'set_message_id');
    
    function set_message_id(&$phpmailer) {
      $leftpart = 'mycustominfo-'.uniqid();
      $domain = 'mydomain.com';
      $messageID = '<'.$leftpart.'@'.$domain.'>';
      $phpmailer->MessageID = $messageID;
    }
    

    I hope it will help