Как сделать рассылку django

Обновлено: 05.07.2024

Я хочу отправлять HTML-письма, используя шаблоны Django следующим образом:

Я ничего не могу найти о send_mail , а django-mailer отправляет только HTML шаблоны, без динамических данных.

Как использовать механизм шаблонов Django для создания электронных писем?

Так что вы можете просто:

Я сделал django-templated-email в попытке решить эту проблему, вдохновленный этим решением (и необходимость в какой-то момент переключиться с использования шаблонов django на использование mailchimp и т. д. набор шаблонов для транзакционных, шаблонных писем для моего собственного проекта). Это все еще работа в процессе, хотя, но для примера выше, вы бы сделали:

С добавлением следующего к settings.py (для завершения пример):

это будет автоматически искать шаблоны с именем ' templated_email / email.txt ' и ' templated_email / email.html ' для простых и html-частей соответственно, в обычном шаблоне django dirs/loaders (жалуясь, если он не может найти хотя бы один из них).

используйте EmailMultiAlternatives и render_to_string, чтобы использовать два альтернативных шаблона (один в обычном тексте и один в html):

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

: объект' dict 'не имеет атрибута 'render_context'

вам нужно будет добавить следующий импорт:

и изменить словарь:

Я написал фрагмент это позволяет отправлять электронные письма, отображаемые с помощью шаблонов, хранящихся в базе данных. Пример:

Если вы хотите динамические шаблоны электронной почты для вашей почты, то сохраните содержимое электронной почты в таблицах базы данных. Это то, что я сохранил как HTML-код в базе данных =

в виде:

это отправит динамический HTML-шаблон, который вы сохранили в БД.


Django поставляется с готовым и простым в использовании легковесным движком для отправки электронной почты. Для его использования вам просто нужно импортировать django.core.mail. Чтобы начать отправку электронной почты, отредактируйте файл проекта settings.py и установите следующие параметры:

  • EMAIL_HOST — адрес SMTP-сервера.
  • EMAIL_HOST_USER — учётная запись для входа на SMTP-сервер.
  • EMAIL_HOST_PASSWORD — пароль от учётной записи для входа на SMTP-сервер.
  • EMAIL_PORT — порт SMTP-сервера.
  • EMAIL_USE_TLS или _SSL — True, если используется безопасное соединение.

Давайте создадим представление sendSimpleEmail для отправки простого электронного письма.

send_mail принимает следующие параметры:

  • subject − тема электронного письма.
  • message − тело электронного письма.
  • from_email − электронная почта отправителя.
  • recipient_list − список адресов электронных почт получателей.
  • fail_silently − при значении false send_mail вызовет исключение в случае ошибки.
  • auth_user − учетная запись пользователя, если она не указана в settings.py.
  • auth_password − пароль от учётной записи, если он не указан в settings.py.
  • connection − бэкенд электронной почты.
  • html_message − (начиная с Django 1.7) если данный параметр присутствует, то электронное письмо будет составным.

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

При доступе к /myapp/simpleemail/[email protected] вы получите следующую страницу:


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

При доступе к /myapp/massemail/[email protected]/[email protected]/ мы получим:


send_mass_mail принимает следующие параметры:

Примечание. В этом примере мы используем Python smtp debuggingserver, который вы можете запустить с помощью:

Эта строчка означает, что все отправленные вами электронные письма будут напечатаны в стандартном системном выводе stdout, а фиктивный сервер будет работать на localhost:1025.

Эти методы отправляют электронные письма администраторам сайта, которые определены в параметре ADMINS файла settings.py, и менеджерам сайта, которые определено в параметре MANAGERS файла settings.py. Давайте предположим, что наши параметры ADMINS и MANAGERS выглядят следующим образом:

Приведенный выше код отправит электронное письмо каждому администратору, указанному в ADMINS.

Приведенный выше код отправит электронное письмо каждому менеджеру, указанному в MANAGERS.

  • subject − тема электронного письма.
  • message − тело электронного письма.
  • fail_silently − при значении false вызовет исключение в случае ошибки.
  • connection − бэкенд электронной почты.
  • html_message − (начиная с Django 1.7) если данный параметр присутствует, то электронное письмо будет составным.

Параметры при создании экземпляра класса EmailMessage:

  • subject − тема электронного письма.
  • message − тело электронного письма в формате HTML .
  • from_email − электронная почта отправителя.
  • to − список адресов электронных почт получателей.
  • bcc − список адресов электронных почт получателей bcc.
  • connection − бэкенд электронной почты.

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

При доступе к /myapp/htmlemail/[email protected] мы получаем следующее:


Это делается с помощью метода attach объекта EmailMessage.

Представление для отправки электронного письма с вложением будет следующим:

Клиенту нужно угождать, ценить его время — так давайте попробуем облегчить процесс отправки электронного письма! Нам в этом поможет контактная форма, автоматически отправляющая письмо в техподдержку сайта. Хотя решение задачи на первый взгляд может показаться сложным, почти весь функционал успешно создается с помощью фреймворка Python Django.

Статья даст ответы на следующие вопросы, волнующие каждого начинающего Python Django веб-разработчика.

  • Как создать поля контактной формы Django?
  • Как добавить форму в HTML шаблон?
  • Как добавить бэкенд электронной почты Django?

1. Создание контактной формы в forms.py

Путь к файлу: env > mysite > main > forms.py

Внутри класса ContactForm(forms.Form) определите поля first_name и last_name (имя и фамилия), воспользовавшись классом CharField из модуля form — так создаются символьные (текстовые) поля. Для каждого из них установите атрибуту max_length значение 50: теперь форма ограничит допустимый ввод в одно поле до 50 символов. Затем добавьте новое поле email_address с помощью класса EmailField из модуля form — это специфическое поле, перед отправкой формы автоматически проверяющее соответствие ввода пользователя формату адреса электронной почты. Наконец, добавьте поле message с помощью того же класса CharField , но с виджетом forms.Textarea , указывающим, что данное поле будет отрисовываться в HTML как принимающее длинный текст в стиле абзаца.

Сохраните все изменения в файле forms.py !

2. Создание представления для страницы с формой во views.py

Путь к файлу: env > mysite > main > views.py

Откройте файл views.py, импортируйте в него ряд объектов, которые нам пригодятся.

3. Создание URL-пути для страницы с формой в urls.py

Путь к файлу: env > mysite > main > urls.py

Теперь добавим URL страницы с контактной формой в urls.py нашего приложения. Если же вы используете существующий шаблон с указанным ранее URL, то пропустите этот шаг.

4. Создание шаблона contact.html

Путь к файлу: env > mysite > main > templates > main > contact.html

Откройте файл contact.html или файл шаблона по вашему выбору и пропишите HTML-тег под текстом. Добавьте к этому тегу атрибут method=”POST” , чтобы форма использовала метод POST при отправке данных обратно в функцию-представление contant(request) . Внутри элемента формы вложите шаблонный тег Django , чтобы предотвратить подделку формы злоумышленниками. Это очень важная строчка кода, которая позволит вашему Django-проекту безопасно отправлять информацию.

После CSRF-токена обратитесь к полям формы ContactForm , находящимся в контексте шаблона. Чтобы обернуть все поля в теги

, используйте > . Вы также можете получить доступ ко всем полям по отдельности, используя формат > .

Наконец, добавьте кнопку отправки формы непосредственно перед закрывающим тегом .

5. Добавление Email backend в настройки проекта

Путь к файлу: env > mysite > main > settings.py

Если включен режим разработчика, то письмо отправляется в CLI (интерфейс командной строки), а не на почтовый ящик.

В нижней части файла settings.py добавьте вышеописанную константу EMAIL_BACKEND , так как именно она устанавливает командную строку/терминал в качестве почтового бэкенда Django для целей тестирования, но со временем стоит заменить настройку почтового бэкенда на реальный сервис отправки электронной почты.

6. Отправка пробного электронного письма в CLI

macOS Terminal/Windows Command Prompt

Но как же узнать, что электронное письмо отправилось корректно?

7. Что делать, если ‘django.core.mail.backends.console.EmailBackend’ не работает?

Если бэкенд электронной почты Django в настройках не работает, то выполните следующие шаги.

Мне нужно сделать рассылку для тех кто оформил подписку на бот, через админ панель django или другие.Бот на пайтон.Как сделать вывод текста из админ панели в телеграм бот по id чата или какую лучше админку использовать использовать?


1 ответ 1

Надеюсь, мой способ решения этой проблемы еще актуален Допустим у нас есть функция get_mailing_user_id() , которая возвращает id тех пользователей, которым нужно сделать рассылку. Я реализовал рассылку через actions (в admin.py ).

здесь bot_mailing это функция, которая принимает в себя различного рода аргументы (id пользователей, текст и фотографию)

При этом у меня есть обычный хэндлер, обычные функции(start и тд) То есть код выглядит так:

Есть ли какое-нибудь приложение для рассылки новостей для django, позволяющее пользователям подписаться - отказаться от подписки на информационные бюллетени? Я хотел бы иметь приложение, которое легко использовать и администрировать с помощью администратора Django.

Может быть, может и нет. Не было бы слишком сложно иметь приложение, которое имеет ассоциацию "много-ко-многим" между Информационным бюллетенем (как бы то ни было) и подписчиком (внешний ключ для пользователя или firstName/lastName/emailAddress/password).

Ваши модели будут примерно такими:

Ваш urls.py будет примерно таким:

Достаточно ли этого для вас?

Для представления больших количеств я бы предложил что-то вроде Postmark, которое также можно использовать с Django. (Это можно было бы легко использовать с приложением для рассылки новостей, как только я перешел от использования почтового API Django (SMTP) к новому бэкэндовому агностику.

Читайте также: