From 58a10b8e47ab9750fc3e48bf4403c32e56c5522d Mon Sep 17 00:00:00 2001 From: Brendan Heywood Date: Fri, 5 Feb 2016 21:40:40 +1100 Subject: [PATCH] MDL-52997 forum: Add more robust threading email headers --- mod/forum/lib.php | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/mod/forum/lib.php b/mod/forum/lib.php index 96bf3d52829..91d2cee8203 100644 --- a/mod/forum/lib.php +++ b/mod/forum/lib.php @@ -760,12 +760,6 @@ function forum_cron() { 'Auto-Submitted: auto-generated', ); - if ($post->parent) { - // This post is a reply, so add headers for threading (see MDL-22551). - $userfrom->customheaders[] = 'In-Reply-To: ' . forum_get_email_message_id($post->parent, $userto->id, $hostname); - $userfrom->customheaders[] = 'References: ' . forum_get_email_message_id($post->parent, $userto->id, $hostname); - } - $shortname = format_string($course->shortname, true, array('context' => context_course::instance($course->id))); // Generate a reply-to address from using the Inbound Message handler. @@ -804,6 +798,30 @@ function forum_cron() { $a->subject = $data->get_subject(); $postsubject = html_to_text(get_string('postmailsubject', 'forum', $a), 0); + $rootid = forum_get_email_message_id($discussion->firstpost, $userto->id, $hostname); + + if ($post->parent) { + // This post is a reply, so add reply header (RFC 2822). + $parentid = forum_get_email_message_id($post->parent, $userto->id, $hostname); + $userfrom->customheaders[] = "In-Reply-To: $parentid"; + + // If the post is deeply nested we also reference the parent message id and + // the root message id (if different) to aid threading when parts of the email + // conversation have been deleted (RFC1036). + if ($post->parent != $discussion->firstpost) { + $userfrom->customheaders[] = "References: $rootid $parentid"; + } else { + $userfrom->customheaders[] = "References: $parentid"; + } + } + + // MS Outlook / Office uses poorly documented and non standard headers, including + // Thread-Topic which overrides the Subject and shouldn't contain Re: or Fwd: etc. + $a->subject = $discussion->name; + $postsubject = html_to_text(get_string('postmailsubject', 'forum', $a), 0); + $userfrom->customheaders[] = "Thread-Topic: $postsubject"; + $userfrom->customheaders[] = "Thread-Index: " . substr($rootid, 1, 28); + // Send the post now! mtrace('Sending ', '');