Класс EmailMessage

Класс EmailMessage применяется для создания email-сообщений с расширенными возможностями. Он позволяет управлять темой письма, телом, списком получателей, добавлять вложения и использовать различные форматы письма. Класс поддерживает как текстовый, так и HTML формат сообщений. В отличие от функций-оберток, EmailMessage предоставляет полный контроль над процессом отправки.

Синтаксис

pythonfrom django.core.mail import EmailMessage

message = EmailMessage(
  subject='Заголовок письма',
  body='Тело письма',
  from_email='sender@example.com',
  to=['recipient1@example.com', 'recipient2@example.com'],
  bcc=['bcc@example.com'],
  cc=['cc@example.com'],
  reply_to=['reply@example.com'],
  headers={'X-Custom-Header': 'value'},
  connection=None,
  attachments=None,
)

Обязательными параметрами являются subject, body и to. Остальные параметры необязательны и могут быть опущены.

Пример . Отправка простого письма

Давайте создадим и отправим простое текстовое письмо одному получателю:

pythonfrom django.core.mail import EmailMessage

message = EmailMessage(
  subject='Приветствие',
  body='Добрый день! Это тестовое письмо.',
  from_email='admin@mysite.com',
  to=['user@example.com'],
)
res = message.send()
print(res)

Результат выполнения кода:

python"1"

Метод send возвращает количество успешно отправленных сообщений.

Пример . С несколькими получателями

Отправим письмо нескольким пользователям, используя список получателей:

pythonfrom django.core.mail import EmailMessage

message = EmailMessage(
  subject='Новости сайта',
  body='Вышла новая статья о Django.',
  from_email='news@mysite.com',
  to=['user1@example.com', 'user2@example.com', 'user3@example.com'],
)
res = message.send()
print(res)

Результат выполнения кода:

python"1"

При отправке письма на несколько адресов метод send возвращает единицу, если все получатели были обработаны в рамках одного SMTP-соединения.

Пример . С вложением

Добавим к письму вложение в виде файла:

pythonfrom django.core.mail import EmailMessage

message = EmailMessage(
  subject='Отчет за месяц',
  body='Во вложении отчет по продажам.',
  from_email='report@mysite.com',
  to=['manager@example.com'],
)
message.attach('report.pdf', b'PDF content here', 'application/pdf')
res = message.send()
print(res)

Результат выполнения кода:

python"1"

Метод attach принимает имя файла, содержимое в виде байтовой строки и MIME-тип.

Пример . С вложением из файловой системы

Прикрепим к письму файл, используя метод attach_file:

pythonfrom django.core.mail import EmailMessage

message = EmailMessage(
  subject='Документы для подписи',
  body='Пожалуйста, подпишите приложенные документы.',
  from_email='legal@mysite.com',
  to=['client@example.com'],
)
message.attach_file('/path/to/document.pdf')
res = message.send()
print(res)

Результат выполнения кода:

python"1"

Метод attach_file автоматически определяет MIME-тип файла по его расширению.

Пример . С HTML-содержимым

Отправим письмо с HTML-форматированием, указав соответствующий заголовок:

pythonfrom django.core.mail import EmailMessage

message = EmailMessage(
  subject='Приглашение на мероприятие',
  body='<h1>Добро пожаловать!</h1><p>Ждем вас на конференции.</p>',
  from_email='events@mysite.com',
  to=['participant@example.com'],
  headers={'Content-Type': 'text/html'},
)
res = message.send()
print(res)

Результат выполнения кода:

python"1"

Для HTML-писем необходимо явно указать заголовок Content-Type со значением text/html.

Пример . С использованием подключения

Отправим несколько писем с использованием одного SMTP-подключения для оптимизации:

pythonfrom django.core.mail import EmailMessage, get_connection

connection = get_connection()
connection.open()

messages = []
for i in range(3):
  message = EmailMessage(
    subject=f'Письмо №{i+1}',
    body=f'Тело письма №{i+1}',
    from_email='sender@mysite.com',
    to=[f'user{i+1}@example.com'],
    connection=connection,
  )
  messages.append(message)

res = connection.send_messages(messages)
connection.close()
print(res)

Результат выполнения кода:

python"3"

Метод send_messages отправляет список писем через одно подключение и возвращает количество отправленных сообщений.

Смотрите также

  • метод send,
    который отправляет созданное сообщение
  • класс EmailMultiAlternatives,
    который поддерживает альтернативные версии письма
  • метод attach,
    который добавляет вложение к письму
  • метод attach_file,
    который добавляет файл из файловой системы