Подтвердить что ты не робот

EmailBackend для отправки электронной почты через несколько SMTP в Django

Получение Django для отправки электронной почты красиво объяснено здесь, используя стандартные настройки, как показано ниже.

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = "mail.mysmtpserver.somewhere"
#EMAIL_PORT
EMAIL_HOST_USER = "[email protected]"
EMAIL_HOST_PASSWORD = "mypassword"
#EMAIL_USE_TLS = True

Затем с помощью django.core.mail.EmailMessage отправить его.

Как бы то ни было, что, если вы используете несколько сайтов и нуждаетесь в каждом из них для отправки электронной почты через собственный SMTP-сервер (или просто другой логин на том же SMTP-сервере)?

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

4b9b3361

Ответ 1

Если вы хотите переопределить предоставленные параметры, вы можете просто создать свое собственное соединение и предоставить его send_email или EmailMessage

from django.core.mail import get_connection, send_mail
from django.core.mail.message import EmailMessage
# TODO: Insert clever settings mechanism
my_host = ''
my_port = 587
my_username = ''
my_password = ''
my_use_tls = True
connection = get_connection(host=my_host, 
                            port=my_port, 
                            username=my_username, 
                            password=my_password, 
                            use_tls=my_use_tls) 

send_mail('diditwork?', 'test message', 'from_email', ['to'], connection=connection)
# or
EmailMessage('diditwork?', 'test message', 'from_email', ['to'], connection=connection).send(fail_silently=False)

Обновление: Обязательно закройте соединение после использования, @michel.iamit ответьте на код, показывающий, что соединение кэшируется для smpt. Ответ @dhackner показывает, как автоматически закрыть соединение с помощью оператора.

Ответ 2

Я бы немного изменил ответ Даниэля Бэкмана, чтобы использовать контекстный менеджер, как в документах. Он сам позаботится о вызовах open() и close().

from django.core.mail import get_connection, send_mail
from django.core.mail.message import EmailMessage

with get_connection(
    host=my_host, 
    port=my_port, 
    username=my_username, 
    password=my_password, 
    user_tls=my_use_tls
) as connection:
    EmailMessage(subject1, body1, from1, [to1],
                 connection=connection).send()

https://docs.djangoproject.com/en/dev/topics/email/#email-backends

Ответ 3

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

вот код: https://github.com/django/django/blob/master/django/core/mail/backends/smtp.py

В этом примере показано, как можно создать пользовательский (вместо SMTP_SSL вместо SMTP):

https://gist.github.com/jsummerfield/1486891

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

https://gist.github.com/iamit/5415771

Не уверен, что это сработает, но, как вы видите, все коды выше возвратов при открытии соединения, если есть уже соединение... Так что, возможно, есть начало для вашего решения.... не делайте этого, закрывайте открытое соединение и снова открывайте с различными настройками... (не уверен, что это работает).

Ответ 4

Извините, я не могу прокомментировать остальную часть ответов, не достаточно репутации.

Только одно дополнение:

connection = get_connection(host=my_host, 
                                port=my_port, 
                                username=my_username, 
                                password=my_password, 
                                user_tls=my_use_tls)

должен быть

connection = get_connection(host=my_host, 
                                port=my_port, 
                                username=my_username, 
                                password=my_password, 
                                use_tls=my_use_tls)

Это только проблема, если вы НЕ используете TLS (и вы должны), так как по умолчанию она имеет значение True.

Ответ 5

используйте другую конфигурацию для каждого сайта.

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

затем поместите эту строфу внизу settings.py:

try:                                                                                                                                                                            
    from settings_local import *                                                                                                                                                
except ImportError:                                                                                                                                                             
    pass  

теперь у вас есть пользовательские настройки на сайте