From e7b4bd48c7b81718cfae6f30f1868cf45311ca86 Mon Sep 17 00:00:00 2001
From: Rolo <rolo@wildfish.com>
Date: Tue, 16 Jun 2015 13:46:56 +0100
Subject: [PATCH] Fixed #24970 -- Added --managers and --admins options to the
 sendtestemail management command.

---
 .../core/management/commands/sendtestemail.py | 23 +++++--
 docs/ref/django-admin.txt                     | 12 ++++
 tests/mail/test_sendtestemail.py              | 67 ++++++++++++++++---
 3 files changed, 89 insertions(+), 13 deletions(-)

diff --git a/django/core/management/commands/sendtestemail.py b/django/core/management/commands/sendtestemail.py
index 36e33ffa2f..3e3b40a959 100644
--- a/django/core/management/commands/sendtestemail.py
+++ b/django/core/management/commands/sendtestemail.py
@@ -1,21 +1,34 @@
-import datetime
 import socket
 
-from django.core.mail import send_mail
+from django.core.mail import mail_admins, mail_managers, send_mail
 from django.core.management.base import BaseCommand
+from django.utils import timezone
 
 
 class Command(BaseCommand):
     help = "Sends a test email to the email addresses specified as arguments."
+    missing_args_message = "You must specify some email recipients, or pass the --managers or --admin options."
 
     def add_arguments(self, parser):
-        parser.add_argument('email', nargs='+',
-            help='One or more email addresses to send the test mail to.')
+        parser.add_argument('email', nargs='*',
+            help='One or more email addresses to send a test email to.')
+        parser.add_argument('--managers', action='store_true', dest='managers', default=False,
+            help='Send a test email to the addresses specified in settings.MANAGERS.')
+        parser.add_argument('--admins', action='store_true', dest='admins', default=False,
+            help='Send a test email to the addresses specified in settings.ADMINS.')
 
     def handle(self, *args, **kwargs):
+        subject = 'Test email from %s on %s' % (socket.gethostname(), timezone.now())
+
         send_mail(
-            subject='Test email from %s on %s' % (socket.gethostname(), datetime.datetime.now()),
+            subject=subject,
             message="If you\'re reading this, it was successful.",
             from_email=None,
             recipient_list=kwargs['email'],
         )
+
+        if kwargs['managers']:
+            mail_managers(subject, "This email was sent to the site managers.")
+
+        if kwargs['admins']:
+            mail_admins(subject, "This email was sent to the site admins.")
diff --git a/docs/ref/django-admin.txt b/docs/ref/django-admin.txt
index d55b748eed..59c7cb03cb 100644
--- a/docs/ref/django-admin.txt
+++ b/docs/ref/django-admin.txt
@@ -902,6 +902,18 @@ recipient(s) specified. For example::
 
     django-admin sendtestemail foo@example.com bar@example.com
 
+.. django-admin-option:: --managers
+
+Use the ``--managers`` option to mail the email addresses specified in
+:setting:`MANAGERS` using :meth:`~django.core.mail.mail_managers()`.
+
+.. django-admin-option:: --admins
+
+Use the ``--admins`` option to mail the email addresses specified in
+:setting:`ADMINS` using :meth:`~django.core.mail.mail_admins()`.
+
+Note that you may use any combination of these options together.
+
 shell
 -----
 
diff --git a/tests/mail/test_sendtestemail.py b/tests/mail/test_sendtestemail.py
index ccf04f9d77..b1494bf3df 100644
--- a/tests/mail/test_sendtestemail.py
+++ b/tests/mail/test_sendtestemail.py
@@ -2,32 +2,83 @@ from __future__ import unicode_literals
 
 from django.core import mail
 from django.core.management import call_command
-from django.test import SimpleTestCase
+from django.test import SimpleTestCase, override_settings
 
 
+@override_settings(
+    ADMINS=(('Admin', 'admin@example.com'), ('Admin and Manager', 'admin_and_manager@example.com')),
+    MANAGERS=(('Manager', 'manager@example.com'), ('Admin and Manager', 'admin_and_manager@example.com')),
+)
 class SendTestEmailManagementCommand(SimpleTestCase):
     """
     Test the sending of a test email using the `sendtestemail` command.
     """
 
-    def test_send_test_email(self):
+    def test_single_receiver(self):
         """
         The mail is sent with the correct subject and recipient.
         """
-        recipient = "joe@example.com"
-        call_command("sendtestemail", recipient)
+        recipient = 'joe@example.com'
+        call_command('sendtestemail', recipient)
         self.assertEqual(len(mail.outbox), 1)
         mail_message = mail.outbox[0]
         self.assertEqual(mail_message.subject[0:15], 'Test email from')
         self.assertEqual(mail_message.recipients(), [recipient])
 
-    def test_send_test_email_with_multiple_addresses(self):
+    def test_multiple_receivers(self):
         """
         The mail may be sent with multiple recipients.
         """
-        recipients = ["joe@example.com", "jane@example.com"]
-        call_command("sendtestemail", recipients[0], recipients[1])
+        recipients = ['joe@example.com', 'jane@example.com']
+        call_command('sendtestemail', recipients[0], recipients[1])
         self.assertEqual(len(mail.outbox), 1)
         mail_message = mail.outbox[0]
         self.assertEqual(mail_message.subject[0:15], 'Test email from')
-        self.assertEqual(mail_message.recipients(), recipients)
+        self.assertEqual(sorted(mail_message.recipients()), [
+            'jane@example.com',
+            'joe@example.com',
+        ])
+
+    def test_manager_receivers(self):
+        """
+        The mail should be sent to the email addresses specified in
+        settings.MANAGERS.
+        """
+        call_command('sendtestemail', '--managers')
+        self.assertEqual(len(mail.outbox), 1)
+        mail_message = mail.outbox[0]
+        self.assertEqual(sorted(mail_message.recipients()), [
+            'admin_and_manager@example.com',
+            'manager@example.com',
+        ])
+
+    def test_admin_receivers(self):
+        """
+        The mail should be sent to the email addresses specified in
+        settings.ADMIN.
+        """
+        call_command('sendtestemail', '--admins')
+        self.assertEqual(len(mail.outbox), 1)
+        mail_message = mail.outbox[0]
+        self.assertEqual(sorted(mail_message.recipients()), [
+            'admin@example.com',
+            'admin_and_manager@example.com',
+        ])
+
+    def test_manager_and_admin_receivers(self):
+        """
+        The mail should be sent to the email addresses specified in both
+        settings.MANAGERS and settings.ADMINS.
+        """
+        call_command('sendtestemail', '--managers', '--admins')
+        self.assertEqual(len(mail.outbox), 2)
+        manager_mail = mail.outbox[0]
+        self.assertEqual(sorted(manager_mail.recipients()), [
+            'admin_and_manager@example.com',
+            'manager@example.com',
+        ])
+        admin_mail = mail.outbox[1]
+        self.assertEqual(sorted(admin_mail.recipients()), [
+            'admin@example.com',
+            'admin_and_manager@example.com',
+        ])