2012-11-27 6 views
20

dojazd do wysyłania e-mail jest ładnie wyjaśnione here używając standardowych ustawień, jak pokazano poniżej.EmailBackend do wysyłania wiadomości e-mail poprzez wielokrotne SMTP w 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 

Następnie za pomocą django.core.mail.EmailMessage wysłać go od.

Jak zawsze, co zrobić, jeśli używasz wielu witryn i trzeba każdy z nich, aby wysłać e-mail za pośrednictwem własnego serwera SMTP (lub po prostu innego logowania w tym samym serwerze SMTP)?

Wyszukiwanie EmailBackend jak ten lub sposób to zrobić z obecnym backend nie przyniosły żadnych zadowalających wyników.

Odpowiedz

19

Jeśli chcesz zastąpić podane ustawienia, możesz po prostu utworzyć własne połączenie i przekazać je do send_email lub 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) 

Aktualizacja: Upewnij się, aby zamknąć połączenie po użyciu punktów @ michel.iamit odpowiedź na kod pokazujące połączenia są buforowane przez SMPT. @dhackner odpowiedź pokazuje, jak automatycznie zamknąć połączenie przy użyciu instrukcji.

+0

coś, co znalazłem podczas korzystania z tego rozwiązania to Celery/Kombu * cant podlewać wiadomość EmailMessage * podczas przekazywania obiektu połączenia, więc myślę, że ta metoda może nie działać podczas planowania wiadomości e-mail dla przyszłej dostawy. –

+0

Prawdopodobnie nigdy nie powinieneś próbować wybierać "połączenia", ponieważ może nie być ono dostępne w przyszłym zadaniu. Powinno działać, jeśli tylko dane zostaną przekazane do przyszłego zadania i EmailMessage zostanie skonstruowany, gdy zadanie zostanie wykonane ... –

0

użyć innej konfiguracji dla każdej witryny.

jednym ze sposobów jest posiadanie, oprócz Twojego settings.py, settings_SITENAME.py dla każdej witryny. pliki te będą miały niestandardowe ustawienia serwera poczty. każda strona będzie mieć settings_local.py być dowiązaniem do jego własnych ustawień niestandardowy plik

następnie umieścić ten zwrotka na dole settings.py:

try:                                            
    from settings_local import *                                     
except ImportError:                                        
    pass 

teraz masz ustawienia na miejscu niestandardowe

+0

Jakikolwiek sposób na to z jednym plikiem ustawień? Potrzebuję jednej instancji Django do wysyłania przy użyciu wielu serwerów SMTP. – gorus

+1

nie korzystaj z backendu Django - korzystaj z bibliotek Pythona na niższym poziomie - http://docs.python.org/2/library/email-examples.html – scytale

1

To może być pomysł, aby rzucić okiem na backend poczty Django i utwórz niestandardowy.

oto kod: https://github.com/django/django/blob/master/django/core/mail/backends/smtp.py

Ten przykład pokazuje, jak można zrobić zwyczaj jeden (ten wykorzystuje SMTP_SSL zamiast SMTP):

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

i rozwidlony, że jeden, aby połączyć oba (mogę użyć jednego zaplecza dla różnych witryn z różnymi ustawieniami poczty):

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

Nie jestem pewien, czy to zadziała, ale jak widzisz, wszystkie powyższe kody powracają po otwarciu połączenia, jeśli jest już połączenie ... Może więc jest początek twojego rozwiązania .... nie rób tego to, zamknij otwarte połączenie i otwórz ponownie z różnymi ustawieniami ... (nie wiesz, czy to działa).

7

Ja nieznacznie zmodyfikowałbym odpowiedź Daniela Backmana, aby użyć menedżera kontekstu, jak w dokumentach. Zadba sama o wywołania open() i 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

+0

Rzeczywiście, bardziej eleganckie rozwiązanie, tylko uwaga, jest dostępne tylko w bieżącej wersji dev django (> 1.7) –

+0

Czy to jest OK, aby zapytać tutaj, jak zamknąć połączenie, jeśli używasz django <= 1.7? –

+0

Myślę, że znalazłem to. 'connection.close()'. Powinienem się domyślić. :) Argument –

1

Niestety, nie mogę komentować bezpośrednio na resztę odpowiedzi, za mało rep.

tylko jeden Ponadto:

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

powinny być

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

Jest tylko problem, jeśli nie jesteś przy użyciu protokołu TLS (i powinien), ponieważ domyślne True.

+1

Czy te dwa kody są nawet różne? –

+0

@Manish, Yes! "user_tls" kontra "use_tls" –

+0

@RajkumarRajendran: OK. W każdym razie mógłbyś właśnie wspomnieć o tym konkretnym parametrze. ;) –