Commit e7b4bd48 authored by Rolo's avatar Rolo Committed by Tim Graham
Browse files

Fixed #24970 -- Added --managers and --admins options to the sendtestemail management command.

parent 1c90a3dc
Loading
Loading
Loading
Loading
+18 −5
Original line number Diff line number Diff line
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.")
+12 −0
Original line number Diff line number Diff line
@@ -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
-----

+59 −8
Original line number Diff line number Diff line
@@ -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',
        ])