2011-12-20 15 views
22

Próbuję użyć nowej usługi SMTP Amazon dla SES z Django 1.3.1, ale nie mam dużo szczęścia.Amazon SES SMTP z Django

Utworzyłem moje poświadczeń SMTP SES i mieć to w moich ustawień:

EMAIL_USE_TLS = True 
EMAIL_HOST = 'email-smtp.us-east-1.amazonaws.com' 
EMAIL_HOST_USER = 'my-smtp-user' 
EMAIL_HOST_PASSWORD = 'my-smtp-password' 
EMAIL_PORT = 465 

Potem spróbuj wysłać wiadomość testową (od a do zweryfikowanych adresów e-mail):

from django.core.mail import send_mail 

send_mail('Test subject', 'This is the body', '[email protected]',['[email protected]'], fail_silently=False) 

But pojawia się następujący błąd:

SMTPServerDisconnected: Connection unexpectedly closed 

można telnet do serwera:

telnet email-smtp.us-east-1.amazonaws.com 465 

Jakieś myśli?

Dzięki, G

+2

Może być związane z Amazon nie wspiera start_tls. "Interfejs SMTP Amazon SES wymaga obecnie protokołu Handshake i nie obsługuje STARTTLS. Obsługujemy zarówno SSL 3.0, jak i TLS 1.0." Zobacz dyskusję tutaj [link] (https://forums.aws.amazon.com/thread.jspa?threadID=82510&tstart=0&start=0) – mtnpaul

+0

Czy patrzysz na to [artykuł] (http://hmarr.com/2011/jan/26/using-amazons-simple-email-service-ses-with-django /). – mtnpaul

+0

@mtnpaul dzięki ale ten artykuł nie jest dla SMTP. Chciałem użyć protokołu SMTP. Ale wygląda na to, że problem jest związany z nieobsługiwaniem TLS, nawet jeśli wspominają o tym w konsoli. – GivP

Odpowiedz

25

Dzięki wszystkim za zaleceniami, ale w końcu znalazłem wiele prostsze rozwiązanie, które pozwoliłoby mi wykorzystać Django wbudowanego w klasach pocztowych więc mogę nadal Administrator dostać moje raporty e-mail błąd itp

Dzięki tej małej piękności byłem w stanie wykorzystać SES SMTP bez żadnych problemów:

https://github.com/bancek/django-smtp-ssl

Pobierz i zainstaluj (konfiguracja Pythona.py install)

Następnie wystarczy zmienić ustawienia tak, aby wykorzystać tę nową backend e-mail:

EMAIL_BACKEND = 'django_smtp_ssl.SSLEmailBackend' 

Reszta ustawień są za normalne:

EMAIL_HOST = 'email-smtp.us-east-1.amazonaws.com' 
EMAIL_PORT = 465 
EMAIL_HOST_USER = 'my_smtp_username' 
EMAIL_HOST_PASSWORD = 'my_smtp_password' 
EMAIL_USE_TLS = True 

Nicea.

G

+0

Od kiedy używasz backendu SSL, czy naprawdę potrzebujesz ustawić EMAIL_USE_TLS = True? – mtnpaul

+0

Nie próbowałem, szczerze mówiąc. Testuję. – GivP

+0

Ustawienie EMAIL_USE_TLS = Fałsz nie robi różnicy. – bobc

5

Po długich długich poszukiwaniach i próbuje znalazłem:

Zamiast korzystania:

s = smtplib.SMTP(host, port) 
s.starttls() 
s.login(user, password) 

Dla AmazonSES SMTP musi być:

s = smtplib.SMTP_SSL(host, port) 
s.login(user, password) 

Tak, myślę, dla django można albo naprawić django kodu lub napisać jesteś właścicielem prosty backend e-mail [w oparciu o domyślny django email backend].

UPD:

znalazłem inne rozwiązanie (ale nie testowałem go przez siebie): użyj SSLEmailBackend z linku poniżej

// settings.py 
EMAIL_BACKEND = 'backends.smtp.SSLEmailBackend' 

(stąd: Mysterious issue with Django + uWSGI + send email)

UPD2 :

AmazonSES obsługuje STARTTL S od teraz :)

Amazon SES supports expanded attachment types, VERP, and STARTTLS for SMTP

(z Amazon biuletyn)

+0

Nie wiem, co to jest, ale nie jest dołączone do Django. Zobacz moje podobne rozwiązanie poniżej. – GivP

+0

Wygląda ładnie!) – vsvasya

+1

(Zapomniałem również o pięknej aplikacji django-ses :)) – vsvasya

0

Wziąłem jak 3 h łamiąc sobie głowę nad nim. Twoje rozwiązanie dotyczące smtplib z s.starttls(), a następnie s.login() jest dobre w programie Pythona z wszystkimi danymi e-mailowymi w tym samym pliku. Ale nie sądzę, że jest to czysty sposób na zrobienie tego w Django. Więc w końcu to rozgryzłem. Niezależnie od tego, czy twój komputer ma 32 czy 64 bity. Wystarczy wykonać następujące czynności:

  1. Install boto

    pip install --upgrade boto

  2. Instalacja Django SES

    pip install django-ses

  3. W swojej djando settings.py plik aktualizacji następujące informacje.

    EMAIL_BACKEND = 'django_ses.SESBackend'
    AWS_ACCESS_KEY_ID = 'your_username'
    AWS_SECRET_ACCESS_KEY = 'your_password'

  4. W pliku django gdzie chcesz wysłać e-mail

    from django.core.mail import send_mail
    send_mail('Test subject', 'This is the body', '[email protected]',['[email protected]'],fail_silently=False)