diff --git a/mod/forum/report/summary/classes/summary_table.php b/mod/forum/report/summary/classes/summary_table.php
index 551cb8e1d93..d47f6478a0e 100644
--- a/mod/forum/report/summary/classes/summary_table.php
+++ b/mod/forum/report/summary/classes/summary_table.php
@@ -89,9 +89,10 @@ class summary_table extends table_sql {
      *
      * @param int $courseid The ID of the course the forum(s) exist within.
      * @param array $filters Report filters in the format 'type' => [values].
+     * @param bool $bulkoperations Is the user allowed to perform bulk operations?
      */
-    public function __construct(int $courseid, array $filters) {
-        global $USER;
+    public function __construct(int $courseid, array $filters, bool $bulkoperations) {
+        global $USER, $OUTPUT;
 
         $forumid = $filters['forums'][0];
 
@@ -107,7 +108,21 @@ class summary_table extends table_sql {
 
         $this->courseid = intval($courseid);
 
-        $columnheaders = [
+        $columnheaders = [];
+
+        if ($bulkoperations) {
+            $mastercheckbox = new \core\output\checkbox_toggleall('summaryreport-table', true, [
+                'id' => 'select-all-users',
+                'name' => 'select-all-users',
+                'label' => get_string('selectall'),
+                'labelclasses' => 'sr-only',
+                'classes' => 'm-1',
+                'checked' => false
+            ]);
+            $columnheaders['select'] = $OUTPUT->render($mastercheckbox);
+        }
+
+        $columnheaders += [
             'fullname' => get_string('fullnameuser'),
             'postcount' => get_string('postcount', 'forumreport_summary'),
             'replycount' => get_string('replycount', 'forumreport_summary'),
@@ -153,6 +168,27 @@ class summary_table extends table_sql {
         return $filternames[$filtertype];
     }
 
+    /**
+     * Generate the select column.
+     *
+     * @param \stdClass $data
+     * @return string
+     */
+    public function col_select($data) {
+        global $OUTPUT;
+
+        $checkbox = new \core\output\checkbox_toggleall('summaryreport-table', false, [
+            'classes' => 'usercheckbox m-1',
+            'id' => 'user' . $data->userid,
+            'name' => 'user' . $data->userid,
+            'checked' => false,
+            'label' => get_string('selectitem', 'moodle', fullname($data)),
+            'labelclasses' => 'accesshide',
+        ]);
+
+        return $OUTPUT->render($checkbox);
+    }
+
     /**
      * Generate the fullname column.
      *
diff --git a/mod/forum/report/summary/index.php b/mod/forum/report/summary/index.php
index dc8daa29690..b62102cf85d 100644
--- a/mod/forum/report/summary/index.php
+++ b/mod/forum/report/summary/index.php
@@ -84,8 +84,15 @@ $renderer = $PAGE->get_renderer('forumreport_summary');
 echo $renderer->render_filters_form($cm, $url, $filters);
 
 // Prepare and display the report.
-$table = new \forumreport_summary\summary_table($courseid, $filters);
+$bulkoperations = !empty($CFG->messaging) && has_capability('moodle/course:bulkmessaging', $context);
+
+$table = new \forumreport_summary\summary_table($courseid, $filters, $bulkoperations);
 $table->baseurl = $url;
+
 echo $renderer->render_summary_table($table, $perpage);
 
+if ($bulkoperations) {
+    echo $renderer->render_bulk_action_menu();
+}
+
 echo $OUTPUT->footer();
diff --git a/mod/forum/report/summary/renderer.php b/mod/forum/report/summary/renderer.php
index e07b759044f..0ee81e83625 100644
--- a/mod/forum/report/summary/renderer.php
+++ b/mod/forum/report/summary/renderer.php
@@ -69,4 +69,39 @@ class forumreport_summary_renderer extends plugin_renderer_base {
 
         return $this->render_from_template('forumreport_summary/report', ['tablehtml' => $tablehtml, 'placeholdertext' => false]);
     }
+
+    /**
+     * Render the bulk action menu for the forum summary report.
+     * @return string
+     */
+    public function render_bulk_action_menu(): string {
+        $data = new stdClass();
+        $data->id = 'formactionid';
+        $data->attributes = [
+            [
+                'name' => 'data-action',
+                'value' => 'toggle'
+            ],
+            [
+                'name' => 'data-togglegroup',
+                'value' => 'summaryreport-table'
+            ],
+            [
+                'name' => 'data-toggle',
+                'value' => 'action'
+            ],
+            [
+                'name' => 'disabled',
+                'value' => true
+            ]
+        ];
+        $data->actions = [
+            [
+                'value' => '#messageselect',
+                'name' => get_string('messageselectadd')
+            ]
+        ];
+
+        return $this->render_from_template('forumreport_summary/bulk_action_menu', $data);
+    }
 }
diff --git a/mod/forum/report/summary/templates/bulk_action_menu.mustache b/mod/forum/report/summary/templates/bulk_action_menu.mustache
new file mode 100644
index 00000000000..aa36045075d
--- /dev/null
+++ b/mod/forum/report/summary/templates/bulk_action_menu.mustache
@@ -0,0 +1,31 @@
+<br /><div class="buttons"><div class="form-inline">
+    <label for="{{id}}">{{#str}}withselectedusers{{/str}}</label>
+    <select id="{{id}}" class="select custom-select ml-2" {{#attributes}}{{name}}="{{value}}" {{/attributes}}>
+        <option value="">{{#str}}choosedots{{/str}}</option>
+    {{#actions}}
+        <option value="{{value}}">{{name}}</option>
+    {{/actions}}
+    </select>
+</div></div>
+{{#js}}
+require(['jquery', 'core_message/message_send_bulk'], function($, BulkSender) {
+    $('#{{id}}').on('change', function(e) {
+        var action = $(e.target).val();
+        if (action.indexOf('#') !== -1) {
+            e.preventDefault();
+
+            var ids = $('#summaryreport input.usercheckbox:checked').map(function(index, element) {
+                return element.name.replace('user', '');
+            }).get();
+
+            if (action == '#messageselect') {
+                BulkSender.showModal(ids, function() {
+                    $('#{{id}}').focus();
+                });
+            }
+
+            $('#{{id}} option[value=""]').prop('selected', 'selected');
+        }
+    });
+});
+{{/js}}
\ No newline at end of file
diff --git a/mod/forum/report/summary/tests/behat/bulk_message.feature b/mod/forum/report/summary/tests/behat/bulk_message.feature
new file mode 100644
index 00000000000..beac0d5b3ef
--- /dev/null
+++ b/mod/forum/report/summary/tests/behat/bulk_message.feature
@@ -0,0 +1,84 @@
+@mod @mod_forum @forumreport @forumreport_summary
+Feature: Message users in the summary report
+  In order to encourage users to participate
+  As a teacher
+  I should be able to send messages to those who are not taking part
+
+  Background:
+    Given the following "users" exist:
+      | username | firstname | lastname | email                |
+      | teacher1 | Teacher   | 1        | teacher1@example.com |
+      | student1 | Student   | 1        | student1@example.com |
+      | student2 | Student   | 2        | student1@example.com |
+    And the following "courses" exist:
+      | fullname | shortname |
+      | Course 1 | C1        |
+    And the following "course enrolments" exist:
+      | user     | course | role           |
+      | teacher1 | C1     | editingteacher |
+      | student1 | C1     | student        |
+      | student2 | C1     | student        |
+    And the following "activities" exist:
+      | activity | name   | description     | course | idnumber |
+      | forum    | forum1 | C1 first forum  | C1     | forum1   |
+    And the following forum discussions exist in course "Course 1":
+      | user     | forum  | name        | message         |
+      | teacher1 | forum1 | discussion1 | t1 earliest     |
+      | teacher1 | forum1 | discussion2 | t1 between      |
+      | student1 | forum1 | discussion3 | s1 latest       |
+    And the following forum replies exist in course "Course 1":
+      | user     | forum  | discussion  | message         |
+      | teacher1 | forum1 | discussion1 | t1 between      |
+      | teacher1 | forum1 | discussion2 | t1 latest       |
+      | student1 | forum1 | discussion1 | s1 earliest     |
+
+  @javascript
+  Scenario: Message some users
+    Given the following "users" exist:
+      | username | firstname | lastname | email                |
+      | student3 | Student   | 3        | student3@example.com |
+    And the following "course enrolments" exist:
+      | user     | course | role    |
+      | student3 | C1     | student |
+    When I log in as "teacher1"
+    And I am on "Course 1" course homepage
+    And I follow "forum1"
+    And I navigate to "Summary report" in current page administration
+    And I click on "Select 'Student 1'" "checkbox"
+    And I click on "Select 'Student 3'" "checkbox"
+    And I set the field "With selected users..." to "Send a message"
+    And I set the field "bulk-message" to "blah blah"
+    And I click on "Send message to 2 people" "button"
+    Then I should see "Message sent to 2 people"
+    And I log out
+    And I log in as "student1"
+    And I should see "1" in the "//*[@title='Toggle messaging drawer']/../*[@data-region='count-container']" "xpath_element"
+    And I log out
+    And I log in as "student3"
+    And I should see "1" in the "//*[@title='Toggle messaging drawer']/../*[@data-region='count-container']" "xpath_element"
+    And I log out
+    And I log in as "student2"
+    And I should not see "1" in the "//*[@title='Toggle messaging drawer']/../*[@data-region='count-container']" "xpath_element"
+
+  @javascript
+  Scenario: Message all users
+    When I log in as "teacher1"
+    And I am on "Course 1" course homepage
+    And I follow "forum1"
+    And I navigate to "Summary report" in current page administration
+    And I click on "Select all" "checkbox"
+    And I set the field "With selected users..." to "Send a message"
+    Then I should see "Send message to 3 people"
+
+  @javascript
+  Scenario: Ensure no message options when messaging is disabled
+    Given I log in as "admin"
+    And I set the following administration settings values:
+      | messaging | 0 |
+    And I log out
+    And I log in as "teacher1"
+    And I am on "Course 1" course homepage
+    And I follow "forum1"
+    And I navigate to "Summary report" in current page administration
+    Then I should not see "With selected users..."
+    And I should not see "Select all"