Spec-Zone.ru › Django 5.2

Отправка электронных писем

Хотя Python предоставляет интерфейс для отправки почты через модуль smtplib, Django предоставляет несколько легких обёртки над ним. Эти обёртки предназначены для ускорения отправки электронных писем, для тестирования отправки писем во время разработки и для поддержки платформ, которые не могут использовать SMTP.

Код находится в модуле django.core.mail.

Быстрые примеры

Используйте send_mail() для простой отправки электронных писем. Например, чтобы отправить текстовое сообщение:

from django.core.mail import send_mail

send_mail(
    "Subject here",
    "Here is the message.",
    "from@example.com",
    ["to@example.com"],
    fail_silently=False,
)

Когда требуется дополнительная функциональность для отправки электронных писем, используйте EmailMessage или EmailMultiAlternatives. Например, чтобы отправить многочастьное электронное письмо, которое включает как HTML, так и текстовые версии с определённой шаблоном и пользовательскими заголовками, вы можете использовать следующий подход:

from django.core.mail import EmailMultiAlternatives
from django.template.loader import render_to_string

# First, render the plain text content.
text_content = render_to_string(
    "templates/emails/my_email.txt",
    context={"my_variable": 42},
)

# Secondly, render the HTML content.
html_content = render_to_string(
    "templates/emails/my_email.html",
    context={"my_variable": 42},
)

# Then, create a multipart email instance.
msg = EmailMultiAlternatives(
    "Subject here",
    text_content,
    "from@example.com",
    ["to@example.com"],
    headers={"List-Unsubscribe": "<mailto:unsub@example.com>"},
)

# Lastly, attach the HTML content to the email instance and send.
msg.attach_alternative(html_content, "text/html")
msg.send()

Почта отправляется с использованием SMTP-хоста и порта, указанных в настройках EMAIL_HOST и EMAIL_PORT. Настройки EMAIL_HOST_USER и EMAIL_HOST_PASSWORD, если они установлены, используются для аутентификации на SMTP-сервере, а настройки EMAIL_USE_TLS и EMAIL_USE_SSL контролируют использование защищённого соединения.

Примечание

Кодировка символов электронного письма, отправленного с помощью django.core.mail, будет установлена в значение вашей настройки DEFAULT_CHARSET.

send_mail()

send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None, connection=None, html_message=None) [source]

В большинстве случаев вы можете отправлять электронные письма с помощью django.core.mail.send_mail().

Параметры subject, message, from_email и recipient_list являются обязательными.

  • subject: Строка.
  • message: Строка.
  • from_email: Строка. Если None, Django будет использовать значение настройки DEFAULT_FROM_EMAIL.
  • recipient_list: Список строк, каждая из которых — электронный адрес. Каждый член recipient_list увидит других получателей в поле «Кому» сообщения электронного письма.
  • fail_silently: Булево значение. Если это False, send_mail() будет генерировать исключение smtplib.SMTPException при возникновении ошибки. Обратитесь к документации smtplib для списка возможных исключений, все из которых являются подклассами SMTPException.
  • auth_user: Необязательное имя пользователя для аутентификации на SMTP-сервере. Если не указано, Django будет использовать значение настройки EMAIL_HOST_USER.
  • auth_password: Необязательный пароль для аутентификации на SMTP-сервере. Если не указано, Django будет использовать значение настройки EMAIL_HOST_PASSWORD.
  • connection: Необязательный бэкенд электронной почты для отправки письма. Если не указан, будет использован экземпляр по умолчанию. Дополнительные сведения см. в документации по Бэкендам электронной почты.
  • html_message: Если html_message указано, результирующее электронное письмо будет многочастьным электронным письмом multipart/alternative с message в качестве text/plain контента и html_message в качестве text/html контента.

Значение возврата будет количеством успешно доставленных сообщений (которое может быть 0 или 1, так как оно может отправить только одно сообщение).

send_mass_mail()

send_mass_mail(datatuple, fail_silently=False, auth_user=None, auth_password=None, connection=None) [source]

django.core.mail.send_mass_mail() предназначен для обработки массовой рассылки электронных писем.

datatuple представляет собой кортеж, в котором каждый элемент имеет следующий формат:

(subject, message, from_email, recipient_list)

fail_silently, auth_user и auth_password имеют те же функции, что и в send_mail().

Каждый отдельный элемент datatuple приводит к отдельному сообщению электронного письма. Как и в send_mail(), получатели в одном recipient_list увидят все остальные адреса в поле «Кому» сообщений электронных писем.

Например, следующий код отправит два разных сообщения двум разным группам получателей; однако будет открыто только одно соединение с почтовым сервером:

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()

Основное различие между send_mass_mail() и send_mail() заключается в том, что send_mail() открывает соединение с почтовым сервером каждый раз, когда выполняется, в то время как send_mass_mail() использует одно соединение для всех своих сообщений. Это делает send_mass_mail() немного более эффективным.

mail_admins()

mail_admins(subject, message, fail_silently=False, connection=None, html_message=None) [source]

django.core.mail.mail_admins() — это сокращение для отправки электронного письма администраторам сайта, как определено в настройке ADMINS.

mail_admins() добавляет префикс к предмету, используя значение настройки EMAIL_SUBJECT_PREFIX, которое по умолчанию равно "[Django] ".

Заголовок «От кого» электронного письма будет равен значению настройки SERVER_EMAIL.

Этот метод существует для удобства и читабельности.

Если html_message указано, результирующее электронное письмо будет многочастьным электронным письмом multipart/alternative с message в качестве text/plain контента и html_message в качестве text/html контента.

mail_managers()

mail_managers(subject, message, fail_silently=False, connection=None, html_message=None) [source]

django.core.mail.mail_managers() аналогично mail_admins(), за исключением того, что отправляет электронное письмо менеджерам сайта, как определено в настройке MANAGERS.

Примеры

Это отправляет одно электронное письмо на john@example.com и jane@example.com, при этом оба будут отображаться в поле «Кому»:

send_mail(
    "Subject",
    "Message.",
    "from@example.com",
    ["john@example.com", "jane@example.com"],
)

Это отправляет сообщение на john@example.com и jane@example.com, при этом каждый получит отдельное электронное письмо:

datatuple = (
    ("Subject", "Message.", "from@example.com", ["john@example.com"]),
    ("Subject", "Message.", "from@example.com", ["jane@example.com"]),
)
send_mass_mail(datatuple)

Предотвращение инъекции заголовков

Инъекция заголовков — это уязвимость, при которой злоумышленник вставляет дополнительные заголовки электронной почты для управления полями «Кому» и «От» в сообщениях электронной почты, генерируемых вашими скриптами.

Все функции Django для отправки электронной почты, описанные выше, защищают от инъекции заголовков, запрещая новые строки в значениях заголовков. Если любое subject, from_email или recipient_list содержит новую строку (в формате Unix, Windows или Mac), функция отправки электронной почты (например, send_mail()) сгенерирует исключение django.core.mail.BadHeaderError (подкласс ValueError) и, следовательно, не отправит электронное письмо. Вам необходимо валидировать все данные перед передачей их в функции отправки электронной почты.

Если message содержит заголовки в начале строки, эти заголовки будут отображены в начале сообщения электронной почты.

Вот пример представления, которое принимает subject, message и from_email из данных POST запроса, отправляет их на admin@example.com и перенаправляет на «/contact/thanks/» после завершения:

from django.core.mail import BadHeaderError, send_mail
from django.http import HttpResponse, HttpResponseRedirect


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.")

Класс EmailMessage

Функции Django send_mail() и send_mass_mail() на самом деле являются тонкими оболочками, использующими класс EmailMessage.

Не все возможности класса EmailMessage доступны через функции send_mail() и аналогичные обертки. Если вам нужны расширенные возможности, такие как адресате с функцией BCC, вложения файлов или многочастьные письма, вам необходимо создавать экземпляры EmailMessage непосредственно.

Примечание

Это особенность дизайна. Функции send_mail() и аналогичные функции изначально были единственным интерфейсом Django. Однако список параметров, которые они принимали, постепенно увеличивался со временем. Было логично перейти к более объектно-ориентированному дизайну для электронных сообщений и сохранить исходные функции только для обратной совместимости.

Класс EmailMessage отвечает за создание самого электронного сообщения. Сервер отправки почты отвечает за отправку электронного сообщения.

Для удобства, EmailMessage предоставляет метод send() для отправки одного электронного письма. Если вам нужно отправить несколько сообщений, API сервера отправки почты предоставляет альтернативный способ.

EmailMessage

class EmailMessage [source]

Класс EmailMessage инициализируется следующими параметрами (в указанном порядке, если используются позиционные аргументы). Все параметры являются необязательными и могут быть установлены в любое время до вызова метода send().

  • subject: Тема электронного письма.
  • body: Текстовое тело. Это должно быть сообщение в формате простого текста.
  • from_email: Адрес отправителя. Допускаются как fred@example.com, так и "Fred" <fred@example.com> форматы. Если опущено, используется настройка DEFAULT_FROM_EMAIL.
  • to: Список или кортеж адресов получателей.
  • bcc: Список или кортеж адресов, используемых в заголовке «Bcc» при отправке электронного письма.
  • connection: Экземпляр сервера отправки почты. Используйте этот параметр, если вы отправляете EmailMessage через send() и хотите использовать одно соединение для нескольких сообщений. Если опущено, при вызове send() создаётся новое соединение. Этот параметр игнорируется при использовании send_messages().
  • attachments: Список вложений для добавления в сообщение. Они могут быть экземплярами MIMEBase или EmailAttachment, или кортежом с атрибутами (filename, content, mimetype).

    Изменено в Django 5.2:

    Добавлена поддержка элементов EmailAttachment типа attachments.

  • headers: Словарь дополнительных заголовков для сообщения. Ключи — имя заголовка, значения — значения заголовка. От пользователя требуется убедиться, что имена и значения заголовков имеют правильный формат для электронного сообщения. Соответствующий атрибут — extra_headers.
  • cc: Список или кортеж адресов получателей, используемых в заголовке «Cc» при отправке электронного письма.
  • reply_to: Список или кортеж адресов получателей, используемых в заголовке «Reply-To» при отправке электронного письма.

Например:

from django.core.mail import EmailMessage

email = EmailMessage(
    "Hello",
    "Body goes here",
    "from@example.com",
    ["to1@example.com", "to2@example.com"],
    ["bcc@example.com"],
    reply_to=["another@example.com"],
    headers={"Message-ID": "foo"},
)

У класса есть следующие методы:

  • send(fail_silently=False) отправляет сообщение. Если при создании электронного письма было указано соединение, будет использоваться это соединение. В противном случае будет создан и использован экземпляр сервера отправки почты по умолчанию. Если ключевой аргумент fail_silently имеет значение True, исключения, возникающие при отправке сообщения, будут подавлены. Пустой список получателей не вызовет исключения. Он вернёт 1, если сообщение было отправлено успешно, иначе 0.
  • message() создаёт объект django.core.mail.SafeMIMEText (подкласс класса Python MIMEText) или объект django.core.mail.SafeMIMEMultipart, содержащий сообщение для отправки. Если вам нужно расширить класс EmailMessage, вам, вероятно, придётся переопределить этот метод, чтобы поместить в объект MIME нужный контент.
  • recipients() возвращает список всех получателей сообщения, независимо от того, хранятся ли они в атрибутах to, cc или bcc. Это ещё один метод, который вам, возможно, потребуется переопределить при наследовании, так как серверу SMTP необходимо сообщить полный список получателей при отправке сообщения. Если вы добавите другой способ задания получателей в свой класс, они также должны возвращаться этим методом.
  • attach() создаёт новое вложение файла и добавляет его в сообщение. Существует два способа вызова attach():

    • Вы можете передать один аргумент, который является экземпляром MIMEBase. Он будет вставлен непосредственно в результирующее сообщение.
    • В качестве альтернативы можно передать attach() три аргумента: filename, content и mimetype. filename — имя вложения файла, как оно будет отображаться в электронном письме, content — данные, которые будут содержаться внутри вложения, mimetype — необязательный тип MIME для вложения. Если вы опустите mimetype, тип контента MIME будет определён по имени файла вложения.

      Например:

      message.attach("design.png", img_data, "image/png")
      

      Если вы укажете mimetype как message/rfc822, он также будет принимать django.core.mail.EmailMessage и email.message.Message.

      Для mimetype, начинающегося с text/, ожидаются строковые данные. Бинарные данные будут декодированы с помощью UTF-8, а если это не удастся, тип MIME будет изменён на application/octet-stream, и данные будут прикреплены без изменений.

      Кроме того, вложения типа message/rfc822 больше не будут кодироваться в base64 в нарушение RFC 2046, раздел 5.2.1, что может привести к проблемам с отображением вложений в Evolution и Thunderbird.

  • attach_file() создаёт новое вложение, используя файл из вашей файловой системы. Вызовите его с путем к файлу для вложения и, необязательно, с типом MIME для использования в вложении. Если тип MIME опущен, он будет определён по имени файла. Вы можете использовать его так:

    message.attach_file("/images/weather_map.png")
    

    Для типов MIME, начинающихся с text/, бинарные данные обрабатываются так же, как и в attach().

class EmailAttachment
Добавлено в Django 5.2.

Именованный кортеж для хранения вложений электронного письма.

Именованный кортеж имеет следующие индексы:

  • filename
  • content
  • mimetype

Отправка альтернативных типов содержимого

Отправка нескольких версий содержимого

Полезно включать несколько версий содержимого в электронное письмо; классическим примером является отправка как текстовой, так и HTML-версий сообщения. В библиотеке электронных писем Django вы можете сделать это, используя класс EmailMultiAlternatives.

class EmailMultiAlternatives [source]

Подкласс EmailMessage, который позволяет добавлять дополнительные версии тела сообщения в электронное письмо с помощью метода attach_alternative(). Это напрямую наследует все методы (включая инициализацию класса) от EmailMessage.

alternatives

Список именованных кортежей EmailAlternative. Это особенно полезно при тестировании:

self.assertEqual(len(msg.alternatives), 1)
self.assertEqual(msg.alternatives[0].content, html_content)
self.assertEqual(msg.alternatives[0].mimetype, "text/html")

Альтернативы следует добавлять только с помощью метода attach_alternative() или передавать в конструктор.

Изменено в Django 5.2:

В более ранних версиях alternatives был списком обычных кортежей, а не именованных кортежей EmailAlternative.

attach_alternative(content, mimetype) [source]

Прикрепляет альтернативное представление тела сообщения в электронном письме.

Например, для отправки комбинации текста и HTML можно написать:

from django.core.mail import EmailMultiAlternatives

subject = "hello"
from_email = "from@example.com"
to = "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()
body_contains(text) [source]
Новое в Django 5.2.

Возвращает булево значение, указывающее, содержится ли предоставленный text в электронном письме body и во всех прикрепленных альтернативах типа MIME text/*.

Это может быть полезно при тестировании электронных писем. Например:

def test_contains_email_content(self):
    subject = "Hello World"
    from_email = "from@example.com"
    to = "to@example.com"
    msg = EmailMultiAlternatives(subject, "I am content.", from_email, [to])
    msg.attach_alternative("<p>I am content.</p>", "text/html")

    self.assertIs(msg.body_contains("I am content"), True)
    self.assertIs(msg.body_contains("<p>I am content.</p>"), False)
class EmailAlternative
Новое в Django 5.2.

Именованный кортеж для хранения альтернативных версий содержимого электронного письма.

Именованный кортеж имеет следующие индексы:

  • content
  • mimetype

Обновление значения по умолчанию для типа содержимого

По умолчанию, тип MIME параметра body в EmailMessage — "text/plain". Рекомендуется оставить это значение, так как это гарантирует, что любой получатель сможет прочитать письмо, независимо от почтового клиента. Однако, если вы уверены, что ваши получатели могут обрабатывать альтернативный тип содержимого, вы можете использовать атрибут content_subtype в классе EmailMessage для изменения основного типа содержимого. Основной тип всегда будет "text", но вы можете изменить подтип. Например:

msg = EmailMessage(subject, html_content, from_email, [to])
msg.content_subtype = "html"  # Main content is now text/html
msg.send()

Email-серверы

Фактическое отправление электронного письма обрабатывается сервером электронной почты.

Класс сервера электронной почты имеет следующие методы:

  • open() инициализирует долговременное соединение для отправки электронных писем.
  • close() закрывает текущее соединение для отправки электронных писем.
  • send_messages(email_messages) отправляет список объектов EmailMessage. Если соединение не открыто, этот вызов неявно откроет соединение и закроет его после отправки почты. Если соединение уже открыто, оно останется открытым после отправки писем.

Он также может использоваться как менеджер контекста, который автоматически вызовет open() и close() по мере необходимости:

from django.core import mail

with mail.get_connection() as connection:
    mail.EmailMessage(
        subject1,
        body1,
        from1,
        [to1],
        connection=connection,
    ).send()
    mail.EmailMessage(
        subject2,
        body2,
        from2,
        [to2],
        connection=connection,
    ).send()

Получение экземпляра сервера электронной почты

Функция get_connection() в django.core.mail возвращает экземпляр сервера электронной почты, который можно использовать.

get_connection(backend=None, fail_silently=False, *args, **kwargs) [source]

По умолчанию вызов get_connection() вернёт экземпляр сервера электронной почты, указанного в EMAIL_BACKEND. Если вы укажете аргумент backend, будет создан экземпляр этого сервера.

Аргумент fail_silently управляет тем, как сервер обрабатывает ошибки. Если fail_silently имеет значение True, исключения во время отправки электронных писем будут игнорироваться.

Все остальные аргументы передаются напрямую в конструктор сервера электронной почты.

Django поставляется с несколькими серверами отправки электронных писем. За исключением сервера SMTP (который является по умолчанию), эти серверы полезны только во время тестирования и разработки. Если у вас есть особые требования к отправке электронной почты, вы можете написать свой собственный сервер электронной почты.

SMTP-сервер

class backends.smtp.EmailBackend(host=None, port=None, username=None, password=None, use_tls=None, fail_silently=False, use_ssl=None, timeout=None, ssl_keyfile=None, ssl_certfile=None, **kwargs)

Это сервер по умолчанию. Электронные письма будут отправляться через SMTP-сервер.

Значение каждого аргумента извлекается из соответствующей настройки, если аргумент является None:

  • host: EMAIL_HOST
  • port: EMAIL_PORT
  • username: EMAIL_HOST_USER
  • password: EMAIL_HOST_PASSWORD
  • use_tls: EMAIL_USE_TLS
  • use_ssl: EMAIL_USE_SSL
  • timeout: EMAIL_TIMEOUT
  • ssl_keyfile: EMAIL_SSL_KEYFILE
  • ssl_certfile: EMAIL_SSL_CERTFILE

SMTP-сервер по умолчанию наследуется Django. Если вы хотите явно указать его, поместите следующее в свои настройки:

EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"

Если не указано, значение по умолчанию timeout будет тем, которое предоставляет socket.getdefaulttimeout(), по умолчанию равный None (без таймаута).

Консольный сервер

Вместо отправки реальных писем консольный сервер просто записывает письма, которые должны быть отправлены в стандартный вывод. По умолчанию консольный сервер записывает в stdout. Можно использовать другой похожий на поток объект, передав аргумент stream при создании соединения.

Чтобы указать этот сервер, поместите следующее в свои настройки:

EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"

Этот сервер не предназначен для использования в рабочей среде — он предоставляется для удобства использования во время разработки.

Файловый сервер

Файловый сервер записывает письма в файл. Для каждого нового сеанса, открытого на этом сервере, создаётся новый файл. Директория, в которую записываются файлы, берется либо из настройки EMAIL_FILE_PATH, либо из аргумента file_path при создании соединения с помощью get_connection().

Чтобы указать этот сервер, поместите следующее в свои настройки:

EMAIL_BACKEND = "django.core.mail.backends.filebased.EmailBackend"
EMAIL_FILE_PATH = "/tmp/app-messages"  # change this to a proper location

Этот сервер не предназначен для использования в рабочей среде — он предоставляется для удобства использования во время разработки.

Временный сервер

Сервер 'locmem' хранит сообщения в специальном атрибуте модуля django.core.mail. Атрибут outbox создается при отправке первого сообщения. Это список с экземпляром EmailMessage для каждого сообщения, которое должно быть отправлено.

Чтобы указать этот сервер, поместите следующее в свои настройки:

EMAIL_BACKEND = "django.core.mail.backends.locmem.EmailBackend"

Этот сервер не предназначен для использования в рабочей среде — он предоставляется для удобства использования во время разработки и тестирования.

Тестирующий запуск Django автоматически использует этот сервер для тестирования.

Двойной сервер

Как следует из названия, двойной сервер ничего не делает с вашими сообщениями. Чтобы указать этот сервер, поместите следующее в свои настройки:

EMAIL_BACKEND = "django.core.mail.backends.dummy.EmailBackend"

Этот сервер не предназначен для использования в рабочей среде — он предоставляется для удобства использования во время разработки.

Определение пользовательского сервера электронной почты

Если вам нужно изменить способ отправки электронных писем, вы можете написать свой собственный сервер электронной почты. Настройка EMAIL_BACKEND в файле настроек — это путь импорта Python для вашего класса сервера.

Пользовательские серверы электронной почты должны быть подклассами класса BaseEmailBackend, который находится в модуле django.core.mail.backends.base. Пользовательский сервер электронной почты должен реализовать метод send_messages(email_messages). Этот метод получает список экземпляров EmailMessage и возвращает количество успешно доставленных сообщений. Если ваш сервер имеет какие-либо понятия о постоянном сеансе или соединении, вы также должны реализовать методы open() и close(). Обратитесь к smtp.EmailBackend для получения справочной реализации.

Отправка нескольких электронных писем

Установка и закрытие SMTP-соединения (или любого другого сетевого соединения) — это дорогостоящий процесс. Если вам нужно отправить много писем, имеет смысл повторно использовать SMTP-соединение вместо создания и уничтожения соединения каждый раз, когда вы хотите отправить письмо.

Есть два способа сообщить серверу электронной почты о повторном использовании соединения.

Во-первых, вы можете использовать метод send_messages() для соединения. Он принимает список экземпляров EmailMessage (или подклассов) и отправляет их все с помощью этого единственного соединения. Вследствие этого любой connection, установленный на отдельном сообщении, игнорируется.

Например, если у вас есть функция под названием get_notification_email(), которая возвращает список объектов EmailMessage, представляющих периодические письма, которые вы хотите отправить, вы могли бы отправить эти письма с помощью одного вызова send_messages:

from django.core import mail

connection = mail.get_connection()  # Use default email connection
messages = get_notification_email()
connection.send_messages(messages)

В этом примере вызов send_messages() открывает соединение на сервере, отправляет список сообщений и затем снова закрывает соединение.

Второй подход заключается в использовании методов open() и close() сервера электронной почты для ручного управления соединением. send_messages() не будет вручную открывать или закрывать соединение, если оно уже открыто, поэтому если вы вручную откроете соединение, вы можете контролировать, когда оно закроется. Например:

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()

Настройка электронной почты для разработки

Бывают случаи, когда вы не хотите, чтобы Django отправлял электронные письма вообще. Например, при разработке веб-сайта, вероятно, вы не захотите отправлять тысячи писем — но вы можете захотеть проверить, что письма будут отправляться нужным людям при соответствующих условиях и что эти письма будут содержать правильное содержание.

Самый простой способ настроить электронную почту для локальной разработки — использовать почтовый бэкэнд консоли. Этот бэкэнд перенаправляет все электронные письма в stdout, позволяя вам проверить содержимое почты.

Почтовый бэкэнд файла также может быть полезен во время разработки — этот бэкэнд записывает содержимое каждого SMTP-соединения в файл, который можно просмотреть по своему усмотрению.

Другой подход заключается в использовании «простого» SMTP-сервера, который принимает электронные письма локально и отображает их в терминале, но фактически ничего не отправляет. Пакет aiosmtpd предоставляет способ достижения этого:

python -m pip install aiosmtpd

python -m aiosmtpd -n -l localhost:8025

Эта команда запустит минимальный SMTP-сервер, слушающий на порту 8025 localhost. Этот сервер выводит в стандартный вывод все заголовки электронных писем и тело письма. Вам нужно только установить EMAIL_HOST и EMAIL_PORT соответственно. Более подробное описание параметров SMTP-сервера см. в документации модуля aiosmtpd.

Дополнительную информацию об отладке отправки электронных писем в вашем приложении см. в разделе Услуги электронной почты документации по тестированию.

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.2/topics/email/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API