5

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.

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.

3 Answers 3

6

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
  • Thanks, this looks promising! I tried changed get_the_id() to $post->ID as it wasnt inside of a loop, but thats not working either. I think it doesn't have access to the $post object when called as a filter like this? Commented May 18, 2012 at 15:55
  • @JamesBruce you can make the $post global to use it in the function: global $post; Commented Aug 9, 2023 at 8:34
0

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';
}
0

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

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.