2011-12-20 36 views
22

Tôi đang cố gắng sử dụng dịch vụ SMTP mới của Amazon cho SES với Django 1.3.1 nhưng tôi không có nhiều may mắn.Amazon SES SMTP với Django

tôi đã tạo ra chứng chỉ SMTP SES của tôi và có điều này trong cài đặt của tôi:

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 

Sau đó, tôi thử gửi một email thử nghiệm (từ và xác nhận địa chỉ email):

from django.core.mail import send_mail 

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

Nhưng Tôi nhận được lỗi sau:

SMTPServerDisconnected: Connection unexpectedly closed 

Tôi có thể telnet đến máy chủ:

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

Bạn nghĩ gì?

Cảm ơn, G

+2

thể được liên quan đến Amazon không hỗ trợ start_tls. "Giao diện SMTP SES của Amazon hiện yêu cầu Giao thức bắt tay và không hỗ trợ STARTTLS. Chúng tôi hỗ trợ cả SSL 3.0 và TLS 1.0". Xem thảo luận tại đây [link] (https://forums.aws.amazon.com/thread.jspa?threadID=82510&tstart=0&start=0) – mtnpaul

+0

Bạn đã xem [bài viết] này (http://hmarr.com/2011/jan/26/using-amazons-simple-email-service-ses-với-django /). – mtnpaul

+0

@mtnpaul cảm ơn nhưng bài viết này không dành cho SMTP. Tôi đặc biệt muốn sử dụng giao thức SMTP. Nhưng nó âm thanh như vấn đề liên quan đến TLS không được hỗ trợ, mặc dù họ đề cập đến nó trong giao diện điều khiển. – GivP

Trả lời

25

Cảm ơn tất cả mọi người cho các khuyến nghị nhưng cuối cùng tôi đã tìm thấy một giải pháp đơn giản hơn nhiều mà sẽ cho phép tôi sử dụng Django tích hợp trong các lớp học thư để tôi vẫn có thể được quản trị báo cáo email lỗi của tôi, vv

Nhờ vẻ đẹp này ít tôi đã có thể sử dụng SES SMTP mà không cần bất kỳ vấn đề:

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

Tải xuống và cài đặt (thiết lập python.py cài đặt)

Sau đó chỉ cần thay đổi cài đặt của bạn để sử dụng email phụ trợ mới này:

EMAIL_BACKEND = 'django_smtp_ssl.SSLEmailBackend' 

Phần còn lại của các thiết lập được như bình thường:

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 

Nice.

G

+0

Vì bạn đang sử dụng chương trình phụ trợ SSL, bạn có thực sự cần đặt EMAIL_USE_TLS = True không? – mtnpaul

+0

Chưa thử, phải trung thực. Sẽ kiểm tra. – GivP

+0

Đặt EMAIL_USE_TLS = False không tạo sự khác biệt. – bobc

5

Sau khi tìm kiếm lâu dài và cố gắng tôi thấy:

Thay vì sử dụng:

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

Đối AmazonSES SMTP phải:

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

Vì vậy, tôi nghĩ rằng, đối với django bạn có thể khắc phục django mã, hoặc viết riêng của bạn đơn giản email backend [dựa trên django mặc định email backend].

UPD:

tôi tìm thấy một giải pháp khác (nhưng không kiểm tra nó bằng bản thân mình): sử dụng SSLEmailBackend từ liên kết dưới đây

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

(Từ đây: Mysterious issue with Django + uWSGI + send email)

UPD2 :

AmazonSES hỗ trợ STARTTL S từ nay :)

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

(từ Amazon Newsletter)

+0

Không chắc chắn những gì mà phụ trợ nó, nhưng nó không đi kèm với Django ra khỏi hộp. Xem giải pháp tương tự của tôi bên dưới. – GivP

+0

Có vẻ đẹp!) – vsvasya

+1

(Ngoài ra, tôi quên đề cập đến ứng dụng django-ses đẹp :)) – vsvasya

0

Tôi mất khoảng 3 giờ để vượt qua đầu. Giải pháp của bạn về smtplib với s.starttls() và sau đó s.login() là tốt với một chương trình python với tất cả các thông tin đăng nhập email trong cùng một tệp. Nhưng tôi không nghĩ đó là một cách sạch sẽ để làm điều đó ở Django. Vì vậy, cuối cùng tôi đã tìm ra. Không phân biệt máy của bạn là 32 hay 64 bit. Chỉ cần làm theo các bước sau:

  1. Cài đặt boto

    pip install --upgrade boto

  2. Install django-ses

    pip install django-ses

  3. Trong file djando settings.py của bạn cập nhật các thông tin sau đây.

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

  4. Trong file django nơi bạn muốn gửi một email

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

Các vấn đề liên quan