Настройка отправки писем email в Django для mail, яндекс, gmail

22 сентября 2015 г. 20:49

В зависимости от того, какой smpt сервер хотим использовать для отправки писем с сайта, используем следующие настройки в settings.py:

mail.ru

EMAIL_HOST = 'smtp.mail.ru'
EMAIL_PORT = 2525
EMAIL_HOST_USER = "your@mail.ru"
EMAIL_HOST_PASSWORD = "password"
EMAIL_USE_TLS = True

gmail.com

EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = "your@gmail.com"
EMAIL_HOST_PASSWORD = "password"
EMAIL_USE_TLS = True

yandex.ru

EMAIL_HOST = 'smtp.yandex.ru'
EMAIL_PORT = 465
EMAIL_HOST_USER = "your@yandex.ru"
EMAIL_HOST_PASSWORD = "password"
EMAIL_USE_SSL = True

 

Добавьте ещё две следующие строчки для отправки писем (трейсбека) админам при возникновении ошибок на сайте:

# settings.py
SERVER_EMAIL = EMAIL_HOST_USER
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

Яндекс и mail без указания SERVER_EMAIL такого же как адрес пользователя при подключении к SMPT серверу (который указывается в EMAIL_HOST_USER), не будет посылать письма об ошибках.

Отправить сообщение

Чтобы послать письмо нужно лишь в коде вызвать команду send_mail, например

from django.conf import settings
send_mail('Тема', 'Тело письма', settings.EMAIL_HOST_USER, ['to@example.com'])

Обратите внимание, что для предотвращения ошибки 501 sender address must match authenticated user нужно использовать адрес отправителя такой же, как EMAIL_HOST_USER (адрес пользователя при подключении к SMPT серверу). Более подробно об этой ошибки в статье: Error: SMTPRecipientsRefused 501 - sender address must match authenticated user

Если вы хотите добавить имя отправителя (или какое-либо название), то используйте headers:

headers = {'To': '{} <{}>'.format(user.get_full_name(), user.email)}
send_mail('Тема', 'Тело письма' , settings.EMAIL_HOST_USER, ['to@example.com'], headers=headers)

Если вы хотите использовать html-теги в теле письма, то удобно создать отдельный файл и использовать render_to_string():

from django.conf import settings
msg = render_to_string('path\to\template.html', {'test_variable': 'xxx'})
send_mail('Тема', msg , settings.EMAIL_HOST_USER, ['to@example.com'])

Оцените статью

4.8 из 5 (всего 15 оценок)

captcha
Поля, отмеченные звёздочкой ( * ) , являются обязательными.

Спасибо за ваш отзыв!

После нажатия кнопки "Отправить" ваше сообщение будет доставлено мне на почту.

Автор статьи

Права на использование материала, расположенного на этой странице https://vivazzi.pro/it/send-email-in-django/:

Разрешается копировать материал с указанием её автора и ссылки на оригинал без использования параметра rel="nofollow" в теге <a>. Использование:

Автор статьи: Мальцев Артём
Ссылка на статью: <a href="https://vivazzi.pro/it/send-email-in-django/">https://vivazzi.pro/it/send-email-in-django/</a>

Подробнее: Правила использования сайта

Комментариев: 14

Anton Emel
Anton Emel

13.09.2018 6:18 #

Подскажите, как сделать так чтоб настройки EMAIL_HOST, EMAIL_PORT, EMAIL_HOST_USE R и т.д. указывать в админке и при этом все работало?

Ответить

Артём Мальцев
Артём Мальцев автор

14.09.2018 23:50 #

Антон, посмотрите, как сделано в файле: /django/core/mail/backends/smtp.py

А именно вот эти строки:

self.host = host or settings.EMAIL_HOST
self.port = port or settings.EMAIL_PORT
self.username = settings.EMAIL_HOST_USER if username is None else username

И определить свой Бекэнд (можно как пример посмотреть у приложения post_office как сделано: /post_office/backends.py) как-то так:

from django.core.mail.backends.base import BaseEmailBackend

class EmailBackend(BaseEmailBackend):
    def __init__(self, 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):
        super(EmailBackend, self).__init__(fail_silently=fail_silently)

        my_mail = MailHost.objects.get(id=1)
        self.host = my_mail.host
        self.port = my_mail.port
        // и т. д.

В settings.py добавить EMAIL_BACKEND = 'my_app.EmailBackend'

Примерно так. Сам я ни разу не задавался такой задачей. Попробуйте, вышеприведённый код тоже не тестировал, но по идее должно работать. Оно будет работать если при отправки письма каждый раз инициализируется бекэнд, если же он только один раз при запуске проекта, то тут конечно думать надо уже конкретно код писать.

И в гугле сходу я не нашёл. Только вот https://stackoverflow.com/questions/15187697/django-sending-email-with-dynamic-smtp-settings/15187806 - но там просто отсылка на документацию на создание своего бекэнда без конкретного кода.

Ответить

zenoviy
zenoviy

24.01.2019 14:07 #

Подскажите пожалуйста как кастомизировать вид самого письма отправленого на почту

Ответить

Артём Мальцев
Артём Мальцев автор

25.01.2019 8:36 #

Зеновый, здравствуйте!

Например, так:


from django.conf import settings
msg = render_to_string('path\to\template.html', {'test_variable': 'xxx'})
send_mail('Тема', msg , settings.EMAIL_HOST_USER, ['to@example.com'])

А файл path\to\template.html может содержать теги.

Ответить

Артем
Артем

19.04.2019 10:39 #

Здравствуйте!
А в качестве settings.EMAIL_HOST_USER я могу указать любую строку ? я хочу чтобы в письме отображался отправитель в качестве любого слова а не заданного email

Ответить

Артём Мальцев
Артём Мальцев автор

21.04.2019 2:23 #

Артём, здравствуйте!
При использовании метода send_mail('Тема', msg , settings.EMAIL_HOST_USER, ['to@example.com']) вам нужно использовать settings.EMAIL_HOST_USER. Но чтобы добавить имя отправителю нужно сделать так:

headers = {'To': '{}  <{}>'.format(user.get_full_name(), user.email)}
send_mail('Тема', msg , settings.EMAIL_HOST_USER, ['to@example.com'], headers=headers)

Ответить

Deca
Deca

19.07.2019 7:52 #

from django.conf import setting s send_mail('Тема', 'Тело письма', settings.EMAIL_HOST_USER, ['to@example.com'] ) Подскажите куда это вписывать?

Ответить

Артём Мальцев
Артём Мальцев автор

19.07.2019 19:34 #

Да можно в любом месте писать, где нужно его выполнить. Допустим, во view.py в методе, который выполняется, когда пользователь переходит по url

Ответить

Гость
Гость

21.08.2019 13:02 #

kak v django reset password

Ответить

Артём Мальцев
Артём Мальцев автор

23.08.2019 20:49 #

Ответить

Гость
Гость

27.08.2019 14:46 #

А что можно сделать, чтобы сообщения не банили из-за подозрения на спам? Использую рассылку от yandex

Ответить

Артём Мальцев
Артём Мальцев автор

27.08.2019 22:57 #

Общие рекомендации:

  • поэкспериментировать с интервалом рассылки, например, 1 письмо в минуту.
  • не использовать слова типа "деньги, вложение, инвестирование, заработок и т. д."

то есть нужно проверить текст на спам-слова.
Точных инструкций я, если честно, не знаю.

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

Ответить

Гость
Гость

12.09.2019 14:50 #

Отлично ! при EMAIL_USE_TLS = True через Яндекс не уходило. Исправил на SSL теперь все работает . Спасибо!

Ответить

Артём Мальцев
Артём Мальцев автор

14.09.2019 6:06 #

Рад, что статья оказалась для вас полезной!

Ответить

Вы можете оставить комментарий как незарегистрированный пользователь.

Но зарегистрировавшись, вы сможете:

  • получать оповещения об ответах
  • просматривать свои комментарии
  • иметь возможность использовать все функции разработанных сервисов

Для комментрирования от своего имени, войдите или зарегистрируйтесь обычным способом или через социальные сети:

Отправить

На данный момент нет специального поиска, поэтому я предлагаю воспользоваться обычной поисковой системой, например, Google, добавив "vivazzi" после своего запроса.

Попробуйте

Выберите валюту для отображения денежных единиц