| ============= |
| Sending email |
| ============= |
| |
| .. module:: django.core.mail |
| :synopsis: Helpers to easily send email. |
| |
| Although Python makes sending email relatively easy via the :mod:`smtplib` |
| module, Django provides a couple of light wrappers over it. These wrappers are |
| provided to make sending email extra quick, to make it easy to test email |
| sending during development, and to provide support for platforms that can't use |
| SMTP. |
| |
| The code lives in the ``django.core.mail`` module. |
| |
| Quick example |
| ============= |
| |
| In two lines:: |
| |
| from django.core.mail import send_mail |
| |
| send_mail('Subject here', 'Here is the message.', 'from@example.com', |
| ['to@example.com'], fail_silently=False) |
| |
| Mail is sent using the SMTP host and port specified in the |
| :setting:`EMAIL_HOST` and :setting:`EMAIL_PORT` settings. The |
| :setting:`EMAIL_HOST_USER` and :setting:`EMAIL_HOST_PASSWORD` settings, if |
| set, are used to authenticate to the SMTP server, and the |
| :setting:`EMAIL_USE_TLS` setting controls whether a secure connection is used. |
| |
| .. note:: |
| |
| The character set of email sent with ``django.core.mail`` will be set to |
| the value of your :setting:`DEFAULT_CHARSET` setting. |
| |
| send_mail() |
| =========== |
| |
| .. function:: send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None, connection=None) |
| |
| The simplest way to send email is using |
| ``django.core.mail.send_mail()``. |
| |
| The ``subject``, ``message``, ``from_email`` and ``recipient_list`` parameters |
| are required. |
| |
| * ``subject``: A string. |
| * ``message``: A string. |
| * ``from_email``: A string. |
| * ``recipient_list``: A list of strings, each an email address. Each |
| member of ``recipient_list`` will see the other recipients in the "To:" |
| field of the email message. |
| * ``fail_silently``: A boolean. If it's ``False``, ``send_mail`` will raise |
| an :exc:`smtplib.SMTPException`. See the :mod:`smtplib` docs for a list of |
| possible exceptions, all of which are subclasses of |
| :exc:`~smtplib.SMTPException`. |
| * ``auth_user``: The optional username to use to authenticate to the SMTP |
| server. If this isn't provided, Django will use the value of the |
| :setting:`EMAIL_HOST_USER` setting. |
| * ``auth_password``: The optional password to use to authenticate to the |
| SMTP server. If this isn't provided, Django will use the value of the |
| :setting:`EMAIL_HOST_PASSWORD` setting. |
| * ``connection``: The optional email backend to use to send the mail. |
| If unspecified, an instance of the default backend will be used. |
| See the documentation on :ref:`Email backends <topic-email-backends>` |
| for more details. |
| |
| send_mass_mail() |
| ================ |
| |
| .. function:: send_mass_mail(datatuple, fail_silently=False, auth_user=None, auth_password=None, connection=None) |
| |
| ``django.core.mail.send_mass_mail()`` is intended to handle mass emailing. |
| |
| ``datatuple`` is a tuple in which each element is in this format:: |
| |
| (subject, message, from_email, recipient_list) |
| |
| ``fail_silently``, ``auth_user`` and ``auth_password`` have the same functions |
| as in :meth:`~django.core.mail.send_mail()`. |
| |
| Each separate element of ``datatuple`` results in a separate email message. |
| As in :meth:`~django.core.mail.send_mail()`, recipients in the same |
| ``recipient_list`` will all see the other addresses in the email messages' |
| "To:" field. |
| |
| For example, the following code would send two different messages to |
| two different sets of recipients; however, only one connection to the |
| mail server would be opened:: |
| |
| message1 = ('Subject here', 'Here is the message', 'from@example.com', ['first@example.com', 'other@example.com']) |
| message2 = ('Another Subject', 'Here is another message', 'from@example.com', ['second@test.com']) |
| send_mass_mail((message1, message2), fail_silently=False) |
| |
| send_mass_mail() vs. send_mail() |
| -------------------------------- |
| |
| The main difference between :meth:`~django.core.mail.send_mass_mail()` and |
| :meth:`~django.core.mail.send_mail()` is that |
| :meth:`~django.core.mail.send_mail()` opens a connection to the mail server |
| each time it's executed, while :meth:`~django.core.mail.send_mass_mail()` uses |
| a single connection for all of its messages. This makes |
| :meth:`~django.core.mail.send_mass_mail()` slightly more efficient. |
| |
| mail_admins() |
| ============= |
| |
| .. function:: mail_admins(subject, message, fail_silently=False, connection=None, html_message=None) |
| |
| ``django.core.mail.mail_admins()`` is a shortcut for sending an email to the |
| site admins, as defined in the :setting:`ADMINS` setting. |
| |
| ``mail_admins()`` prefixes the subject with the value of the |
| :setting:`EMAIL_SUBJECT_PREFIX` setting, which is ``"[Django] "`` by default. |
| |
| The "From:" header of the email will be the value of the |
| :setting:`SERVER_EMAIL` setting. |
| |
| This method exists for convenience and readability. |
| |
| .. versionchanged:: 1.3 |
| |
| If ``html_message`` is provided, the resulting email will be a |
| :mimetype:`multipart/alternative` email with ``message`` as the |
| :mimetype:`text/plain` content type and ``html_message`` as the |
| :mimetype:`text/html` content type. |
| |
| mail_managers() |
| =============== |
| |
| .. function:: mail_managers(subject, message, fail_silently=False, connection=None, html_message=None) |
| |
| ``django.core.mail.mail_managers()`` is just like ``mail_admins()``, except it |
| sends an email to the site managers, as defined in the :setting:`MANAGERS` |
| setting. |
| |
| Examples |
| ======== |
| |
| This sends a single email to john@example.com and jane@example.com, with them |
| both appearing in the "To:":: |
| |
| send_mail('Subject', 'Message.', 'from@example.com', |
| ['john@example.com', 'jane@example.com']) |
| |
| This sends a message to john@example.com and jane@example.com, with them both |
| receiving a separate email:: |
| |
| datatuple = ( |
| ('Subject', 'Message.', 'from@example.com', ['john@example.com']), |
| ('Subject', 'Message.', 'from@example.com', ['jane@example.com']), |
| ) |
| send_mass_mail(datatuple) |
| |
| Preventing header injection |
| =========================== |
| |
| `Header injection`_ is a security exploit in which an attacker inserts extra |
| email headers to control the "To:" and "From:" in email messages that your |
| scripts generate. |
| |
| The Django email functions outlined above all protect against header injection |
| by forbidding newlines in header values. If any ``subject``, ``from_email`` or |
| ``recipient_list`` contains a newline (in either Unix, Windows or Mac style), |
| the email function (e.g. :meth:`~django.core.mail.send_mail()`) will raise |
| ``django.core.mail.BadHeaderError`` (a subclass of ``ValueError``) and, hence, |
| will not send the email. It's your responsibility to validate all data before |
| passing it to the email functions. |
| |
| If a ``message`` contains headers at the start of the string, the headers will |
| simply be printed as the first bit of the email message. |
| |
| Here's an example view that takes a ``subject``, ``message`` and ``from_email`` |
| from the request's POST data, sends that to admin@example.com and redirects to |
| "/contact/thanks/" when it's done:: |
| |
| from django.core.mail import send_mail, BadHeaderError |
| |
| def send_email(request): |
| subject = request.POST.get('subject', '') |
| message = request.POST.get('message', '') |
| from_email = request.POST.get('from_email', '') |
| if subject and message and from_email: |
| try: |
| send_mail(subject, message, from_email, ['admin@example.com']) |
| except BadHeaderError: |
| return HttpResponse('Invalid header found.') |
| return HttpResponseRedirect('/contact/thanks/') |
| else: |
| # In reality we'd use a form class |
| # to get proper validation errors. |
| return HttpResponse('Make sure all fields are entered and valid.') |
| |
| .. _Header injection: http://www.nyphp.org/phundamentals/8_Preventing-Email-Header-Injection |
| |
| .. _emailmessage-and-smtpconnection: |
| |
| The EmailMessage class |
| ====================== |
| |
| Django's :meth:`~django.core.mail.send_mail()` and |
| :meth:`~django.core.mail.send_mass_mail()` functions are actually thin |
| wrappers that make use of the :class:`~django.core.mail.EmailMessage` class. |
| |
| Not all features of the :class:`~django.core.mail.EmailMessage` class are |
| available through the :meth:`~django.core.mail.send_mail()` and related |
| wrapper functions. If you wish to use advanced features, such as BCC'ed |
| recipients, file attachments, or multi-part email, you'll need to create |
| :class:`~django.core.mail.EmailMessage` instances directly. |
| |
| .. note:: |
| This is a design feature. :meth:`~django.core.mail.send_mail()` and |
| related functions were originally the only interface Django provided. |
| However, the list of parameters they accepted was slowly growing over |
| time. It made sense to move to a more object-oriented design for email |
| messages and retain the original functions only for backwards |
| compatibility. |
| |
| :class:`~django.core.mail.EmailMessage` is responsible for creating the email |
| message itself. The :ref:`email backend <topic-email-backends>` is then |
| responsible for sending the email. |
| |
| For convenience, :class:`~django.core.mail.EmailMessage` provides a simple |
| ``send()`` method for sending a single email. If you need to send multiple |
| messages, the email backend API :ref:`provides an alternative |
| <topics-sending-multiple-emails>`. |
| |
| EmailMessage Objects |
| -------------------- |
| |
| .. class:: EmailMessage |
| |
| The :class:`~django.core.mail.EmailMessage` class is initialized with the |
| following parameters (in the given order, if positional arguments are used). |
| All parameters are optional and can be set at any time prior to calling the |
| ``send()`` method. |
| |
| .. versionchanged:: 1.3 |
| The ``cc`` argument was added. |
| |
| * ``subject``: The subject line of the email. |
| |
| * ``body``: The body text. This should be a plain text message. |
| |
| * ``from_email``: The sender's address. Both ``fred@example.com`` and |
| ``Fred <fred@example.com>`` forms are legal. If omitted, the |
| :setting:`DEFAULT_FROM_EMAIL` setting is used. |
| |
| * ``to``: A list or tuple of recipient addresses. |
| |
| * ``bcc``: A list or tuple of addresses used in the "Bcc" header when |
| sending the email. |
| |
| * ``connection``: An email backend instance. Use this parameter if |
| you want to use the same connection for multiple messages. If omitted, a |
| new connection is created when ``send()`` is called. |
| |
| * ``attachments``: A list of attachments to put on the message. These can |
| be either ``email.MIMEBase.MIMEBase`` instances, or ``(filename, |
| content, mimetype)`` triples. |
| |
| * ``headers``: A dictionary of extra headers to put on the message. The |
| keys are the header name, values are the header values. It's up to the |
| caller to ensure header names and values are in the correct format for |
| an email message. |
| |
| * ``cc``: A list or tuple of recipient addresses used in the "Cc" header |
| when sending the email. |
| |
| For example:: |
| |
| email = EmailMessage('Hello', 'Body goes here', 'from@example.com', |
| ['to1@example.com', 'to2@example.com'], ['bcc@example.com'], |
| headers = {'Reply-To': 'another@example.com'}) |
| |
| The class has the following methods: |
| |
| * ``send(fail_silently=False)`` sends the message. If a connection was |
| specified when the email was constructed, that connection will be used. |
| Otherwise, an instance of the default backend will be instantiated and |
| used. If the keyword argument ``fail_silently`` is ``True``, exceptions |
| raised while sending the message will be quashed. |
| |
| * ``message()`` constructs a ``django.core.mail.SafeMIMEText`` object (a |
| subclass of Python's ``email.MIMEText.MIMEText`` class) or a |
| ``django.core.mail.SafeMIMEMultipart`` object holding the message to be |
| sent. If you ever need to extend the |
| :class:`~django.core.mail.EmailMessage` class, you'll probably want to |
| override this method to put the content you want into the MIME object. |
| |
| * ``recipients()`` returns a list of all the recipients of the message, |
| whether they're recorded in the ``to``, ``cc`` or ``bcc`` attributes. This |
| is another method you might need to override when subclassing, because the |
| SMTP server needs to be told the full list of recipients when the message |
| is sent. If you add another way to specify recipients in your class, they |
| need to be returned from this method as well. |
| |
| * ``attach()`` creates a new file attachment and adds it to the message. |
| There are two ways to call ``attach()``: |
| |
| * You can pass it a single argument that is an |
| ``email.MIMEBase.MIMEBase`` instance. This will be inserted directly |
| into the resulting message. |
| |
| * Alternatively, you can pass ``attach()`` three arguments: |
| ``filename``, ``content`` and ``mimetype``. ``filename`` is the name |
| of the file attachment as it will appear in the email, ``content`` is |
| the data that will be contained inside the attachment and |
| ``mimetype`` is the optional MIME type for the attachment. If you |
| omit ``mimetype``, the MIME content type will be guessed from the |
| filename of the attachment. |
| |
| For example:: |
| |
| message.attach('design.png', img_data, 'image/png') |
| |
| * ``attach_file()`` creates a new attachment using a file from your |
| filesystem. Call it with the path of the file to attach and, optionally, |
| the MIME type to use for the attachment. If the MIME type is omitted, it |
| will be guessed from the filename. The simplest use would be:: |
| |
| message.attach_file('/images/weather_map.png') |
| |
| .. _DEFAULT_FROM_EMAIL: ../settings/#default-from-email |
| |
| Sending alternative content types |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| It can be useful to include multiple versions of the content in an email; the |
| classic example is to send both text and HTML versions of a message. With |
| Django's email library, you can do this using the ``EmailMultiAlternatives`` |
| class. This subclass of :class:`~django.core.mail.EmailMessage` has an |
| ``attach_alternative()`` method for including extra versions of the message |
| body in the email. All the other methods (including the class initialization) |
| are inherited directly from :class:`~django.core.mail.EmailMessage`. |
| |
| To send a text and HTML combination, you could write:: |
| |
| from django.core.mail import EmailMultiAlternatives |
| |
| subject, from_email, to = 'hello', 'from@example.com', 'to@example.com' |
| text_content = 'This is an important message.' |
| html_content = '<p>This is an <strong>important</strong> message.</p>' |
| msg = EmailMultiAlternatives(subject, text_content, from_email, [to]) |
| msg.attach_alternative(html_content, "text/html") |
| msg.send() |
| |
| By default, the MIME type of the ``body`` parameter in an |
| :class:`~django.core.mail.EmailMessage` is ``"text/plain"``. It is good |
| practice to leave this alone, because it guarantees that any recipient will be |
| able to read the email, regardless of their mail client. However, if you are |
| confident that your recipients can handle an alternative content type, you can |
| use the ``content_subtype`` attribute on the |
| :class:`~django.core.mail.EmailMessage` class to change the main content type. |
| The major type will always be ``"text"``, but you can change the |
| subtype. For example:: |
| |
| msg = EmailMessage(subject, html_content, from_email, [to]) |
| msg.content_subtype = "html" # Main content is now text/html |
| msg.send() |
| |
| .. _topic-email-backends: |
| |
| Email backends |
| ============== |
| |
| .. versionadded:: 1.2 |
| |
| The actual sending of an email is handled by the email backend. |
| |
| The email backend class has the following methods: |
| |
| * ``open()`` instantiates an long-lived email-sending connection. |
| |
| * ``close()`` closes the current email-sending connection. |
| |
| * ``send_messages(email_messages)`` sends a list of |
| :class:`~django.core.mail.EmailMessage` objects. If the connection is |
| not open, this call will implicitly open the connection, and close the |
| connection afterwards. If the connection is already open, it will be |
| left open after mail has been sent. |
| |
| Obtaining an instance of an email backend |
| ----------------------------------------- |
| |
| The :meth:`get_connection` function in ``django.core.mail`` returns an |
| instance of the email backend that you can use. |
| |
| .. currentmodule:: django.core.mail |
| |
| .. function:: get_connection(backend=None, fail_silently=False, *args, **kwargs) |
| |
| By default, a call to ``get_connection()`` will return an instance of the |
| email backend specified in :setting:`EMAIL_BACKEND`. If you specify the |
| ``backend`` argument, an instance of that backend will be instantiated. |
| |
| The ``fail_silently`` argument controls how the backend should handle errors. |
| If ``fail_silently`` is True, exceptions during the email sending process |
| will be silently ignored. |
| |
| All other arguments are passed directly to the constructor of the |
| email backend. |
| |
| Django ships with several email sending backends. With the exception of the |
| SMTP backend (which is the default), these backends are only useful during |
| testing and development. If you have special email sending requirements, you |
| can :ref:`write your own email backend <topic-custom-email-backend>`. |
| |
| .. _topic-email-smtp-backend: |
| |
| SMTP backend |
| ~~~~~~~~~~~~ |
| |
| This is the default backend. Email will be sent through a SMTP server. |
| The server address and authentication credentials are set in the |
| :setting:`EMAIL_HOST`, :setting:`EMAIL_PORT`, :setting:`EMAIL_HOST_USER`, |
| :setting:`EMAIL_HOST_PASSWORD` and :setting:`EMAIL_USE_TLS` settings in your |
| settings file. |
| |
| The SMTP backend is the default configuration inherited by Django. If you |
| want to specify it explicitly, put the following in your settings:: |
| |
| EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' |
| |
| .. _topic-email-console-backend: |
| |
| Console backend |
| ~~~~~~~~~~~~~~~ |
| |
| Instead of sending out real emails the console backend just writes the |
| emails that would be send to the standard output. By default, the console |
| backend writes to ``stdout``. You can use a different stream-like object by |
| providing the ``stream`` keyword argument when constructing the connection. |
| |
| To specify this backend, put the following in your settings:: |
| |
| EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' |
| |
| This backend is not intended for use in production -- it is provided as a |
| convenience that can be used during development. |
| |
| .. _topic-email-file-backend: |
| |
| File backend |
| ~~~~~~~~~~~~ |
| |
| The file backend writes emails to a file. A new file is created for each new |
| session that is opened on this backend. The directory to which the files are |
| written is either taken from the :setting:`EMAIL_FILE_PATH` setting or from |
| the ``file_path`` keyword when creating a connection with |
| :meth:`~django.core.mail.get_connection`. |
| |
| To specify this backend, put the following in your settings:: |
| |
| EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend' |
| EMAIL_FILE_PATH = '/tmp/app-messages' # change this to a proper location |
| |
| This backend is not intended for use in production -- it is provided as a |
| convenience that can be used during development. |
| |
| .. _topic-email-memory-backend: |
| |
| In-memory backend |
| ~~~~~~~~~~~~~~~~~ |
| |
| The ``'locmem'`` backend stores messages in a special attribute of the |
| ``django.core.mail`` module. The ``outbox`` attribute is created when the |
| first message is sent. It's a list with an |
| :class:`~django.core.mail.EmailMessage` instance for each message that would |
| be send. |
| |
| To specify this backend, put the following in your settings:: |
| |
| EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend' |
| |
| This backend is not intended for use in production -- it is provided as a |
| convenience that can be used during development and testing. |
| |
| .. _topic-email-dummy-backend: |
| |
| Dummy backend |
| ~~~~~~~~~~~~~ |
| |
| As the name suggests the dummy backend does nothing with your messages. To |
| specify this backend, put the following in your settings:: |
| |
| EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend' |
| |
| This backend is not intended for use in production -- it is provided as a |
| convenience that can be used during development. |
| |
| .. _topic-custom-email-backend: |
| |
| Defining a custom email backend |
| ------------------------------- |
| |
| If you need to change how emails are sent you can write your own email |
| backend. The :setting:`EMAIL_BACKEND` setting in your settings file is then |
| the Python import path for your backend class. |
| |
| Custom email backends should subclass ``BaseEmailBackend`` that is located in |
| the ``django.core.mail.backends.base`` module. A custom email backend must |
| implement the ``send_messages(email_messages)`` method. This method receives a |
| list of :class:`~django.core.mail.EmailMessage` instances and returns the |
| number of successfully delivered messages. If your backend has any concept of |
| a persistent session or connection, you should also implement the ``open()`` |
| and ``close()`` methods. Refer to ``smtp.EmailBackend`` for a reference |
| implementation. |
| |
| .. _topics-sending-multiple-emails: |
| |
| Sending multiple emails |
| ----------------------- |
| |
| Establishing and closing an SMTP connection (or any other network connection, |
| for that matter) is an expensive process. If you have a lot of emails to send, |
| it makes sense to reuse an SMTP connection, rather than creating and |
| destroying a connection every time you want to send an email. |
| |
| There are two ways you tell an email backend to reuse a connection. |
| |
| Firstly, you can use the ``send_messages()`` method. ``send_messages()`` takes |
| a list of :class:`~django.core.mail.EmailMessage` instances (or subclasses), |
| and sends them all using a single connection. |
| |
| For example, if you have a function called ``get_notification_email()`` that |
| returns a list of :class:`~django.core.mail.EmailMessage` objects representing |
| some periodic email you wish to send out, you could send these emails using |
| a single call to send_messages:: |
| |
| from django.core import mail |
| connection = mail.get_connection() # Use default email connection |
| messages = get_notification_email() |
| connection.send_messages(messages) |
| |
| In this example, the call to ``send_messages()`` opens a connection on the |
| backend, sends the list of messages, and then closes the connection again. |
| |
| The second approach is to use the ``open()`` and ``close()`` methods on the |
| email backend to manually control the connection. ``send_messages()`` will not |
| manually open or close the connection if it is already open, so if you |
| manually open the connection, you can control when it is closed. For example:: |
| |
| from django.core import mail |
| connection = mail.get_connection() |
| |
| # Manually open the connection |
| connection.open() |
| |
| # Construct an email message that uses the connection |
| email1 = mail.EmailMessage('Hello', 'Body goes here', 'from@example.com', |
| ['to1@example.com'], connection=connection) |
| email1.send() # Send the email |
| |
| # Construct two more messages |
| email2 = mail.EmailMessage('Hello', 'Body goes here', 'from@example.com', |
| ['to2@example.com']) |
| email3 = mail.EmailMessage('Hello', 'Body goes here', 'from@example.com', |
| ['to3@example.com']) |
| |
| # Send the two emails in a single call - |
| connection.send_messages([email2, email3]) |
| # The connection was already open so send_messages() doesn't close it. |
| # We need to manually close the connection. |
| connection.close() |
| |
| |
| Testing email sending |
| ===================== |
| |
| There are times when you do not want Django to send emails at |
| all. For example, while developing a Web site, you probably don't want |
| to send out thousands of emails -- but you may want to validate that |
| emails will be sent to the right people under the right conditions, |
| and that those emails will contain the correct content. |
| |
| The easiest way to test your project's use of email is to use the ``console`` |
| email backend. This backend redirects all email to stdout, allowing you to |
| inspect the content of mail. |
| |
| The ``file`` email backend can also be useful during development -- this backend |
| dumps the contents of every SMTP connection to a file that can be inspected |
| at your leisure. |
| |
| Another approach is to use a "dumb" SMTP server that receives the emails |
| locally and displays them to the terminal, but does not actually send |
| anything. Python has a built-in way to accomplish this with a single command:: |
| |
| python -m smtpd -n -c DebuggingServer localhost:1025 |
| |
| This command will start a simple SMTP server listening on port 1025 of |
| localhost. This server simply prints to standard output all email headers and |
| the email body. You then only need to set the :setting:`EMAIL_HOST` and |
| :setting:`EMAIL_PORT` accordingly, and you are set. |
| |
| For a more detailed discussion of testing and processing of emails locally, |
| see the Python documentation for the :mod:`smtpd` module. |