parts/django/docs/topics/email.txt
changeset 307 c6bca38c1cbf
equal deleted inserted replaced
306:5ff1fc726848 307:c6bca38c1cbf
       
     1 ==============
       
     2 Sending e-mail
       
     3 ==============
       
     4 
       
     5 .. module:: django.core.mail
       
     6    :synopsis: Helpers to easily send e-mail.
       
     7 
       
     8 Although Python makes sending e-mail relatively easy via the `smtplib
       
     9 library`_, Django provides a couple of light wrappers over it. These wrappers
       
    10 are provided to make sending e-mail extra quick, to make it easy to test
       
    11 e-mail sending during development, and to provide support for platforms that
       
    12 can't use SMTP.
       
    13 
       
    14 The code lives in the ``django.core.mail`` module.
       
    15 
       
    16 .. _smtplib library: http://docs.python.org/library/smtplib.html
       
    17 
       
    18 Quick example
       
    19 =============
       
    20 
       
    21 In two lines::
       
    22 
       
    23     from django.core.mail import send_mail
       
    24 
       
    25     send_mail('Subject here', 'Here is the message.', 'from@example.com',
       
    26         ['to@example.com'], fail_silently=False)
       
    27 
       
    28 Mail is sent using the SMTP host and port specified in the
       
    29 :setting:`EMAIL_HOST` and :setting:`EMAIL_PORT` settings. The
       
    30 :setting:`EMAIL_HOST_USER` and :setting:`EMAIL_HOST_PASSWORD` settings, if
       
    31 set, are used to authenticate to the SMTP server, and the
       
    32 :setting:`EMAIL_USE_TLS` setting controls whether a secure connection is used.
       
    33 
       
    34 .. note::
       
    35 
       
    36     The character set of e-mail sent with ``django.core.mail`` will be set to
       
    37     the value of your :setting:`DEFAULT_CHARSET` setting.
       
    38 
       
    39 send_mail()
       
    40 ===========
       
    41 
       
    42 .. function:: send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None, connection=None)
       
    43 
       
    44 The simplest way to send e-mail is using
       
    45 ``django.core.mail.send_mail()``.
       
    46 
       
    47 The ``subject``, ``message``, ``from_email`` and ``recipient_list`` parameters
       
    48 are required.
       
    49 
       
    50     * ``subject``: A string.
       
    51     * ``message``: A string.
       
    52     * ``from_email``: A string.
       
    53     * ``recipient_list``: A list of strings, each an e-mail address. Each
       
    54       member of ``recipient_list`` will see the other recipients in the "To:"
       
    55       field of the e-mail message.
       
    56     * ``fail_silently``: A boolean. If it's ``False``, ``send_mail`` will raise
       
    57       an ``smtplib.SMTPException``. See the `smtplib docs`_ for a list of
       
    58       possible exceptions, all of which are subclasses of ``SMTPException``.
       
    59     * ``auth_user``: The optional username to use to authenticate to the SMTP
       
    60       server. If this isn't provided, Django will use the value of the
       
    61       :setting:`EMAIL_HOST_USER` setting.
       
    62     * ``auth_password``: The optional password to use to authenticate to the
       
    63       SMTP server. If this isn't provided, Django will use the value of the
       
    64       :setting:`EMAIL_HOST_PASSWORD` setting.
       
    65     * ``connection``: The optional e-mail backend to use to send the mail.
       
    66       If unspecified, an instance of the default backend will be used.
       
    67       See the documentation on :ref:`E-mail backends <topic-email-backends>`
       
    68       for more details.
       
    69 
       
    70 .. _smtplib docs: http://docs.python.org/library/smtplib.html
       
    71 
       
    72 send_mass_mail()
       
    73 ================
       
    74 
       
    75 .. function:: send_mass_mail(datatuple, fail_silently=False, auth_user=None, auth_password=None, connection=None)
       
    76 
       
    77 ``django.core.mail.send_mass_mail()`` is intended to handle mass e-mailing.
       
    78 
       
    79 ``datatuple`` is a tuple in which each element is in this format::
       
    80 
       
    81     (subject, message, from_email, recipient_list)
       
    82 
       
    83 ``fail_silently``, ``auth_user`` and ``auth_password`` have the same functions
       
    84 as in :meth:`~django.core.mail.send_mail()`.
       
    85 
       
    86 Each separate element of ``datatuple`` results in a separate e-mail message.
       
    87 As in :meth:`~django.core.mail.send_mail()`, recipients in the same
       
    88 ``recipient_list`` will all see the other addresses in the e-mail messages'
       
    89 "To:" field.
       
    90 
       
    91 For example, the following code would send two different messages to
       
    92 two different sets of recipients; however, only one connection to the
       
    93 mail server would be opened::
       
    94 
       
    95     message1 = ('Subject here', 'Here is the message', 'from@example.com, ['first@example.com', 'other@example.com'])
       
    96     message2 = ('Another Subject', 'Here is another message', 'from@example.com', ['second@test.com'])
       
    97     send_mass_mail((message1, message2), fail_silently=False)
       
    98 
       
    99 send_mass_mail() vs. send_mail()
       
   100 --------------------------------
       
   101 
       
   102 The main difference between :meth:`~django.core.mail.send_mass_mail()` and
       
   103 :meth:`~django.core.mail.send_mail()` is that
       
   104 :meth:`~django.core.mail.send_mail()` opens a connection to the mail server
       
   105 each time it's executed, while :meth:`~django.core.mail.send_mass_mail()` uses
       
   106 a single connection for all of its messages. This makes
       
   107 :meth:`~django.core.mail.send_mass_mail()` slightly more efficient.
       
   108 
       
   109 mail_admins()
       
   110 =============
       
   111 
       
   112 .. function:: mail_admins(subject, message, fail_silently=False, connection=None)
       
   113 
       
   114 ``django.core.mail.mail_admins()`` is a shortcut for sending an e-mail to the
       
   115 site admins, as defined in the :setting:`ADMINS` setting.
       
   116 
       
   117 ``mail_admins()`` prefixes the subject with the value of the
       
   118 :setting:`EMAIL_SUBJECT_PREFIX` setting, which is ``"[Django] "`` by default.
       
   119 
       
   120 The "From:" header of the e-mail will be the value of the
       
   121 :setting:`SERVER_EMAIL` setting.
       
   122 
       
   123 This method exists for convenience and readability.
       
   124 
       
   125 mail_managers()
       
   126 ===============
       
   127 
       
   128 .. function:: mail_managers(subject, message, fail_silently=False, connection=None)
       
   129 
       
   130 ``django.core.mail.mail_managers()`` is just like ``mail_admins()``, except it
       
   131 sends an e-mail to the site managers, as defined in the :setting:`MANAGERS`
       
   132 setting.
       
   133 
       
   134 Examples
       
   135 ========
       
   136 
       
   137 This sends a single e-mail to john@example.com and jane@example.com, with them
       
   138 both appearing in the "To:"::
       
   139 
       
   140     send_mail('Subject', 'Message.', 'from@example.com',
       
   141         ['john@example.com', 'jane@example.com'])
       
   142 
       
   143 This sends a message to john@example.com and jane@example.com, with them both
       
   144 receiving a separate e-mail::
       
   145 
       
   146     datatuple = (
       
   147         ('Subject', 'Message.', 'from@example.com', ['john@example.com']),
       
   148         ('Subject', 'Message.', 'from@example.com', ['jane@example.com']),
       
   149     )
       
   150     send_mass_mail(datatuple)
       
   151 
       
   152 Preventing header injection
       
   153 ===========================
       
   154 
       
   155 `Header injection`_ is a security exploit in which an attacker inserts extra
       
   156 e-mail headers to control the "To:" and "From:" in e-mail messages that your
       
   157 scripts generate.
       
   158 
       
   159 The Django e-mail functions outlined above all protect against header injection
       
   160 by forbidding newlines in header values. If any ``subject``, ``from_email`` or
       
   161 ``recipient_list`` contains a newline (in either Unix, Windows or Mac style),
       
   162 the e-mail function (e.g. :meth:`~django.core.mail.send_mail()`) will raise
       
   163 ``django.core.mail.BadHeaderError`` (a subclass of ``ValueError``) and, hence,
       
   164 will not send the e-mail. It's your responsibility to validate all data before
       
   165 passing it to the e-mail functions.
       
   166 
       
   167 If a ``message`` contains headers at the start of the string, the headers will
       
   168 simply be printed as the first bit of the e-mail message.
       
   169 
       
   170 Here's an example view that takes a ``subject``, ``message`` and ``from_email``
       
   171 from the request's POST data, sends that to admin@example.com and redirects to
       
   172 "/contact/thanks/" when it's done::
       
   173 
       
   174     from django.core.mail import send_mail, BadHeaderError
       
   175 
       
   176     def send_email(request):
       
   177         subject = request.POST.get('subject', '')
       
   178         message = request.POST.get('message', '')
       
   179         from_email = request.POST.get('from_email', '')
       
   180         if subject and message and from_email:
       
   181             try:
       
   182                 send_mail(subject, message, from_email, ['admin@example.com'])
       
   183             except BadHeaderError:
       
   184                 return HttpResponse('Invalid header found.')
       
   185             return HttpResponseRedirect('/contact/thanks/')
       
   186         else:
       
   187             # In reality we'd use a form class
       
   188             # to get proper validation errors.
       
   189             return HttpResponse('Make sure all fields are entered and valid.')
       
   190 
       
   191 .. _Header injection: http://www.nyphp.org/phundamentals/email_header_injection.php
       
   192 
       
   193 .. _emailmessage-and-smtpconnection:
       
   194 
       
   195 The EmailMessage class
       
   196 ======================
       
   197 
       
   198 .. versionadded:: 1.0
       
   199 
       
   200 Django's :meth:`~django.core.mail.send_mail()` and
       
   201 :meth:`~django.core.mail.send_mass_mail()` functions are actually thin
       
   202 wrappers that make use of the :class:`~django.core.mail.EmailMessage` class.
       
   203 
       
   204 Not all features of the :class:`~django.core.mail.EmailMessage` class are
       
   205 available through the :meth:`~django.core.mail.send_mail()` and related
       
   206 wrapper functions. If you wish to use advanced features, such as BCC'ed
       
   207 recipients, file attachments, or multi-part e-mail, you'll need to create
       
   208 :class:`~django.core.mail.EmailMessage` instances directly.
       
   209 
       
   210 .. note::
       
   211     This is a design feature. :meth:`~django.core.mail.send_mail()` and
       
   212     related functions were originally the only interface Django provided.
       
   213     However, the list of parameters they accepted was slowly growing over
       
   214     time. It made sense to move to a more object-oriented design for e-mail
       
   215     messages and retain the original functions only for backwards
       
   216     compatibility.
       
   217 
       
   218 :class:`~django.core.mail.EmailMessage` is responsible for creating the e-mail
       
   219 message itself. The :ref:`e-mail backend <topic-email-backends>` is then
       
   220 responsible for sending the e-mail.
       
   221 
       
   222 For convenience, :class:`~django.core.mail.EmailMessage` provides a simple
       
   223 ``send()`` method for sending a single e-mail. If you need to send multiple
       
   224 messages, the e-mail backend API :ref:`provides an alternative
       
   225 <topics-sending-multiple-emails>`.
       
   226 
       
   227 EmailMessage Objects
       
   228 --------------------
       
   229 
       
   230 .. class:: EmailMessage
       
   231 
       
   232 The :class:`~django.core.mail.EmailMessage` class is initialized with the
       
   233 following parameters (in the given order, if positional arguments are used).
       
   234 All parameters are optional and can be set at any time prior to calling the
       
   235 ``send()`` method.
       
   236 
       
   237     * ``subject``: The subject line of the e-mail.
       
   238 
       
   239     * ``body``: The body text. This should be a plain text message.
       
   240 
       
   241     * ``from_email``: The sender's address. Both ``fred@example.com`` and
       
   242       ``Fred <fred@example.com>`` forms are legal. If omitted, the
       
   243       :setting:`DEFAULT_FROM_EMAIL` setting is used.
       
   244 
       
   245     * ``to``: A list or tuple of recipient addresses.
       
   246 
       
   247     * ``bcc``: A list or tuple of addresses used in the "Bcc" header when
       
   248       sending the e-mail.
       
   249 
       
   250     * ``connection``: An e-mail backend instance. Use this parameter if
       
   251       you want to use the same connection for multiple messages. If omitted, a
       
   252       new connection is created when ``send()`` is called.
       
   253 
       
   254     * ``attachments``: A list of attachments to put on the message. These can
       
   255       be either ``email.MIMEBase.MIMEBase`` instances, or ``(filename,
       
   256       content, mimetype)`` triples.
       
   257 
       
   258     * ``headers``: A dictionary of extra headers to put on the message. The
       
   259       keys are the header name, values are the header values. It's up to the
       
   260       caller to ensure header names and values are in the correct format for
       
   261       an e-mail message.
       
   262 
       
   263 For example::
       
   264 
       
   265     email = EmailMessage('Hello', 'Body goes here', 'from@example.com',
       
   266                 ['to1@example.com', 'to2@example.com'], ['bcc@example.com'],
       
   267                 headers = {'Reply-To': 'another@example.com'})
       
   268 
       
   269 The class has the following methods:
       
   270 
       
   271     * ``send(fail_silently=False)`` sends the message. If a connection was
       
   272       specified when the e-mail was constructed, that connection will be used.
       
   273       Otherwise, an instance of the default backend will be instantiated and
       
   274       used. If the keyword argument ``fail_silently`` is ``True``, exceptions
       
   275       raised while sending the message will be quashed.
       
   276 
       
   277     * ``message()`` constructs a ``django.core.mail.SafeMIMEText`` object (a
       
   278       subclass of Python's ``email.MIMEText.MIMEText`` class) or a
       
   279       ``django.core.mail.SafeMIMEMultipart`` object holding the message to be
       
   280       sent. If you ever need to extend the
       
   281       :class:`~django.core.mail.EmailMessage` class, you'll probably want to
       
   282       override this method to put the content you want into the MIME object.
       
   283 
       
   284     * ``recipients()`` returns a list of all the recipients of the message,
       
   285       whether they're recorded in the ``to`` or ``bcc`` attributes. This is
       
   286       another method you might need to override when subclassing, because the
       
   287       SMTP server needs to be told the full list of recipients when the message
       
   288       is sent. If you add another way to specify recipients in your class, they
       
   289       need to be returned from this method as well.
       
   290 
       
   291     * ``attach()`` creates a new file attachment and adds it to the message.
       
   292       There are two ways to call ``attach()``:
       
   293 
       
   294        * You can pass it a single argument that is an
       
   295          ``email.MIMEBase.MIMEBase`` instance. This will be inserted directly
       
   296          into the resulting message.
       
   297 
       
   298        * Alternatively, you can pass ``attach()`` three arguments:
       
   299          ``filename``, ``content`` and ``mimetype``. ``filename`` is the name
       
   300          of the file attachment as it will appear in the e-mail, ``content`` is
       
   301          the data that will be contained inside the attachment and
       
   302          ``mimetype`` is the optional MIME type for the attachment. If you
       
   303          omit ``mimetype``, the MIME content type will be guessed from the
       
   304          filename of the attachment.
       
   305 
       
   306          For example::
       
   307 
       
   308             message.attach('design.png', img_data, 'image/png')
       
   309 
       
   310     * ``attach_file()`` creates a new attachment using a file from your
       
   311       filesystem. Call it with the path of the file to attach and, optionally,
       
   312       the MIME type to use for the attachment. If the MIME type is omitted, it
       
   313       will be guessed from the filename. The simplest use would be::
       
   314 
       
   315         message.attach_file('/images/weather_map.png')
       
   316 
       
   317 .. _DEFAULT_FROM_EMAIL: ../settings/#default-from-email
       
   318 
       
   319 Sending alternative content types
       
   320 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       
   321 
       
   322 It can be useful to include multiple versions of the content in an e-mail; the
       
   323 classic example is to send both text and HTML versions of a message. With
       
   324 Django's e-mail library, you can do this using the ``EmailMultiAlternatives``
       
   325 class. This subclass of :class:`~django.core.mail.EmailMessage` has an
       
   326 ``attach_alternative()`` method for including extra versions of the message
       
   327 body in the e-mail. All the other methods (including the class initialization)
       
   328 are inherited directly from :class:`~django.core.mail.EmailMessage`.
       
   329 
       
   330 To send a text and HTML combination, you could write::
       
   331 
       
   332     from django.core.mail import EmailMultiAlternatives
       
   333 
       
   334     subject, from_email, to = 'hello', 'from@example.com', 'to@example.com'
       
   335     text_content = 'This is an important message.'
       
   336     html_content = '<p>This is an <strong>important</strong> message.</p>'
       
   337     msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
       
   338     msg.attach_alternative(html_content, "text/html")
       
   339     msg.send()
       
   340 
       
   341 By default, the MIME type of the ``body`` parameter in an
       
   342 :class:`~django.core.mail.EmailMessage` is ``"text/plain"``. It is good
       
   343 practice to leave this alone, because it guarantees that any recipient will be
       
   344 able to read the e-mail, regardless of their mail client. However, if you are
       
   345 confident that your recipients can handle an alternative content type, you can
       
   346 use the ``content_subtype`` attribute on the
       
   347 :class:`~django.core.mail.EmailMessage` class to change the main content type.
       
   348 The major type will always be ``"text"``, but you can change the
       
   349 subtype. For example::
       
   350 
       
   351     msg = EmailMessage(subject, html_content, from_email, [to])
       
   352     msg.content_subtype = "html"  # Main content is now text/html
       
   353     msg.send()
       
   354 
       
   355 .. _topic-email-backends:
       
   356 
       
   357 E-Mail Backends
       
   358 ===============
       
   359 
       
   360 .. versionadded:: 1.2
       
   361 
       
   362 The actual sending of an e-mail is handled by the e-mail backend.
       
   363 
       
   364 The e-mail backend class has the following methods:
       
   365 
       
   366     * ``open()`` instantiates an long-lived e-mail-sending connection.
       
   367 
       
   368     * ``close()`` closes the current e-mail-sending connection.
       
   369 
       
   370     * ``send_messages(email_messages)`` sends a list of
       
   371       :class:`~django.core.mail.EmailMessage` objects. If the connection is
       
   372       not open, this call will implicitly open the connection, and close the
       
   373       connection afterwards. If the connection is already open, it will be
       
   374       left open after mail has been sent.
       
   375 
       
   376 Obtaining an instance of an e-mail backend
       
   377 ------------------------------------------
       
   378 
       
   379 The :meth:`get_connection` function in ``django.core.mail`` returns an
       
   380 instance of the e-mail backend that you can use.
       
   381 
       
   382 .. currentmodule:: django.core.mail
       
   383 
       
   384 .. function:: get_connection(backend=None, fail_silently=False, *args, **kwargs)
       
   385 
       
   386 By default, a call to ``get_connection()`` will return an instance of the
       
   387 e-mail backend specified in :setting:`EMAIL_BACKEND`. If you specify the
       
   388 ``backend`` argument, an instance of that backend will be instantiated.
       
   389 
       
   390 The ``fail_silently`` argument controls how the backend should handle errors.
       
   391 If ``fail_silently`` is True, exceptions during the e-mail sending process
       
   392 will be silently ignored.
       
   393 
       
   394 All other arguments are passed directly to the constructor of the
       
   395 e-mail backend.
       
   396 
       
   397 Django ships with several e-mail sending backends. With the exception of the
       
   398 SMTP backend (which is the default), these backends are only useful during
       
   399 testing and development. If you have special e-mail sending requirements, you
       
   400 can :ref:`write your own e-mail backend <topic-custom-email-backend>`.
       
   401 
       
   402 .. _topic-email-smtp-backend:
       
   403 
       
   404 SMTP backend
       
   405 ~~~~~~~~~~~~
       
   406 
       
   407 This is the default backend. E-mail will be sent through a SMTP server.
       
   408 The server address and authentication credentials are set in the
       
   409 :setting:`EMAIL_HOST`, :setting:`EMAIL_PORT`, :setting:`EMAIL_HOST_USER`,
       
   410 :setting:`EMAIL_HOST_PASSWORD` and :setting:`EMAIL_USE_TLS` settings in your
       
   411 settings file.
       
   412 
       
   413 The SMTP backend is the default configuration inherited by Django. If you
       
   414 want to specify it explicitly, put the following in your settings::
       
   415 
       
   416     EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
       
   417 
       
   418 .. admonition:: SMTPConnection objects
       
   419 
       
   420     Prior to version 1.2, Django provided a
       
   421     :class:`~django.core.mail.SMTPConnection` class. This class provided a way
       
   422     to directly control the use of SMTP to send e-mail. This class has been
       
   423     deprecated in favor of the generic e-mail backend API.
       
   424 
       
   425     For backwards compatibility :class:`~django.core.mail.SMTPConnection` is
       
   426     still available in ``django.core.mail`` as an alias for the SMTP backend.
       
   427     New code should use :meth:`~django.core.mail.get_connection` instead.
       
   428 
       
   429 .. _topic-email-console-backend:
       
   430 
       
   431 Console backend
       
   432 ~~~~~~~~~~~~~~~
       
   433 
       
   434 Instead of sending out real e-mails the console backend just writes the
       
   435 e-mails that would be send to the standard output. By default, the console
       
   436 backend writes to ``stdout``. You can use a different stream-like object by
       
   437 providing the ``stream`` keyword argument when constructing the connection.
       
   438 
       
   439 To specify this backend, put the following in your settings::
       
   440 
       
   441     EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
       
   442 
       
   443 This backend is not intended for use in production -- it is provided as a
       
   444 convenience that can be used during development.
       
   445 
       
   446 .. _topic-email-file-backend:
       
   447 
       
   448 File backend
       
   449 ~~~~~~~~~~~~
       
   450 
       
   451 The file backend writes e-mails to a file. A new file is created for each new
       
   452 session that is opened on this backend. The directory to which the files are
       
   453 written is either taken from the :setting:`EMAIL_FILE_PATH` setting or from
       
   454 the ``file_path`` keyword when creating a connection with
       
   455 :meth:`~django.core.mail.get_connection`.
       
   456 
       
   457 To specify this backend, put the following in your settings::
       
   458 
       
   459     EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
       
   460     EMAIL_FILE_PATH = '/tmp/app-messages' # change this to a proper location
       
   461 
       
   462 This backend is not intended for use in production -- it is provided as a
       
   463 convenience that can be used during development.
       
   464 
       
   465 .. _topic-email-memory-backend:
       
   466 
       
   467 In-memory backend
       
   468 ~~~~~~~~~~~~~~~~~
       
   469 
       
   470 The ``'locmem'`` backend stores messages in a special attribute of the
       
   471 ``django.core.mail`` module. The ``outbox`` attribute is created when the
       
   472 first message is sent. It's a list with an
       
   473 :class:`~django.core.mail.EmailMessage` instance for each message that would
       
   474 be send.
       
   475 
       
   476 To specify this backend, put the following in your settings::
       
   477 
       
   478   EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'
       
   479 
       
   480 This backend is not intended for use in production -- it is provided as a
       
   481 convenience that can be used during development and testing.
       
   482 
       
   483 .. _topic-email-dummy-backend:
       
   484 
       
   485 Dummy backend
       
   486 ~~~~~~~~~~~~~
       
   487 
       
   488 As the name suggests the dummy backend does nothing with your messages. To
       
   489 specify this backend, put the following in your settings::
       
   490 
       
   491    EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'
       
   492 
       
   493 This backend is not intended for use in production -- it is provided as a
       
   494 convenience that can be used during development.
       
   495 
       
   496 .. _topic-custom-email-backend:
       
   497 
       
   498 Defining a custom e-mail backend
       
   499 --------------------------------
       
   500 
       
   501 If you need to change how e-mails are sent you can write your own e-mail
       
   502 backend. The ``EMAIL_BACKEND`` setting in your settings file is then the
       
   503 Python import path for your backend class.
       
   504 
       
   505 Custom e-mail backends should subclass ``BaseEmailBackend`` that is located in
       
   506 the ``django.core.mail.backends.base`` module. A custom e-mail backend must
       
   507 implement the ``send_messages(email_messages)`` method. This method receives a
       
   508 list of :class:`~django.core.mail.EmailMessage` instances and returns the
       
   509 number of successfully delivered messages. If your backend has any concept of
       
   510 a persistent session or connection, you should also implement the ``open()``
       
   511 and ``close()`` methods. Refer to ``smtp.EmailBackend`` for a reference
       
   512 implementation.
       
   513 
       
   514 .. _topics-sending-multiple-emails:
       
   515 
       
   516 Sending multiple e-mails
       
   517 ------------------------
       
   518 
       
   519 Establishing and closing an SMTP connection (or any other network connection,
       
   520 for that matter) is an expensive process. If you have a lot of e-mails to send,
       
   521 it makes sense to reuse an SMTP connection, rather than creating and
       
   522 destroying a connection every time you want to send an e-mail.
       
   523 
       
   524 There are two ways you tell an e-mail backend to reuse a connection.
       
   525 
       
   526 Firstly, you can use the ``send_messages()`` method. ``send_messages()`` takes
       
   527 a list of :class:`~django.core.mail.EmailMessage` instances (or subclasses),
       
   528 and sends them all using a single connection.
       
   529 
       
   530 For example, if you have a function called ``get_notification_email()`` that
       
   531 returns a list of :class:`~django.core.mail.EmailMessage` objects representing
       
   532 some periodic e-mail you wish to send out, you could send these e-mails using
       
   533 a single call to send_messages::
       
   534 
       
   535     from django.core import mail
       
   536     connection = mail.get_connection()   # Use default e-mail connection
       
   537     messages = get_notification_email()
       
   538     connection.send_messages(messages)
       
   539 
       
   540 In this example, the call to ``send_messages()`` opens a connection on the
       
   541 backend, sends the list of messages, and then closes the connection again.
       
   542 
       
   543 The second approach is to use the ``open()`` and ``close()`` methods on the
       
   544 e-mail backend to manually control the connection. ``send_messages()`` will not
       
   545 manually open or close the connection if it is already open, so if you
       
   546 manually open the connection, you can control when it is closed. For example::
       
   547 
       
   548     from django.core import mail
       
   549     connection = mail.get_connection()
       
   550 
       
   551     # Manually open the connection
       
   552     connection.open()
       
   553 
       
   554     # Construct an e-mail message that uses the connection
       
   555     email1 = mail.EmailMessage('Hello', 'Body goes here', 'from@example.com',
       
   556                               ['to1@example.com'], connection=connection)
       
   557     email1.send() # Send the e-mail
       
   558 
       
   559     # Construct two more messages
       
   560     email2 = mail.EmailMessage('Hello', 'Body goes here', 'from@example.com',
       
   561                               ['to2@example.com'])
       
   562     email3 = mail.EmailMessage('Hello', 'Body goes here', 'from@example.com',
       
   563                               ['to3@example.com'])
       
   564 
       
   565     # Send the two e-mails in a single call -
       
   566     connection.send_messages([email2, email3])
       
   567     # The connection was already open so send_messages() doesn't close it.
       
   568     # We need to manually close the connection.
       
   569     connection.close()
       
   570 
       
   571 
       
   572 Testing e-mail sending
       
   573 ======================
       
   574 
       
   575 There are times when you do not want Django to send e-mails at
       
   576 all. For example, while developing a Web site, you probably don't want
       
   577 to send out thousands of e-mails -- but you may want to validate that
       
   578 e-mails will be sent to the right people under the right conditions,
       
   579 and that those e-mails will contain the correct content.
       
   580 
       
   581 The easiest way to test your project's use of e-mail is to use the ``console``
       
   582 e-mail backend. This backend redirects all e-mail to stdout, allowing you to
       
   583 inspect the content of mail.
       
   584 
       
   585 The ``file`` e-mail backend can also be useful during development -- this backend
       
   586 dumps the contents of every SMTP connection to a file that can be inspected
       
   587 at your leisure.
       
   588 
       
   589 Another approach is to use a "dumb" SMTP server that receives the e-mails
       
   590 locally and displays them to the terminal, but does not actually send
       
   591 anything. Python has a built-in way to accomplish this with a single command::
       
   592 
       
   593     python -m smtpd -n -c DebuggingServer localhost:1025
       
   594 
       
   595 This command will start a simple SMTP server listening on port 1025 of
       
   596 localhost. This server simply prints to standard output all e-mail headers and
       
   597 the e-mail body. You then only need to set the :setting:`EMAIL_HOST` and
       
   598 :setting:`EMAIL_PORT` accordingly, and you are set.
       
   599 
       
   600 For a more detailed discussion of testing and processing of e-mails locally,
       
   601 see the Python documentation on the `SMTP Server`_.
       
   602 
       
   603 .. _SMTP Server: http://docs.python.org/library/smtpd.html
       
   604 
       
   605 SMTPConnection
       
   606 ==============
       
   607 
       
   608 .. class:: SMTPConnection
       
   609 
       
   610 .. deprecated:: 1.2
       
   611 
       
   612 The ``SMTPConnection`` class has been deprecated in favor of the generic e-mail
       
   613 backend API.
       
   614 
       
   615 For backwards compatibility ``SMTPConnection`` is still available in
       
   616 ``django.core.mail`` as an alias for the :ref:`SMTP backend
       
   617 <topic-email-smtp-backend>`. New code should use
       
   618 :meth:`~django.core.mail.get_connection` instead.