Django и Amazon SES SMTP. Невозможно отправить электронное письмо

это мой settings.py:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'email-smtp.us-east-1.amazonaws.com'
EMAIL_PORT = '465'
EMAIL_HOST_USER = config_data['EMAIL_HOST_USER']
EMAIL_HOST_PASSWORD = config_data['EMAIL_HOST_PASSWORD']
EMAIL_USE_SSL = True

Я проверил адреса электронной почты, а также сгенерировал учетные данные SMTP, которые я загрузил учетные данные, содержащие имя пользователя IAM, имя пользователя Smtp, пароль Smtp. Я использовал имя пользователя smtp для EMAIL_HOST_USER и пароль smtp для EMAIL_HOST_PASSWORD.

В django я отправил электронное письмо с этой строкой ([email protected] заменен учетной записью gmail, которая находится в подтвержденном списке адресов электронной почты):

send_mail("Subject", "content", "[email protected]", [email], fail_silently=False)

Это не сработало. Тем не менее, отправка тестового электронного письма из консоли SES (выберите одно из писем в подтвержденных письмах и нажмите кнопку «Отправить тестовое письмо») работает.

В этом документе говорится что я могу отправлять электронную почту через командную строку с помощью команды openssl. Итак, я сделал ssh на машине EC2 и использовал:

openssl s_client -crlf -quiet -starttls smtp -connect email-smtp.us-east-1.amazonaws.com:25

Обратите внимание, что здесь я использовал 25, когда я использовал порт 465, он выводил:

didn't found starttls in server response, try anyway...
write:errno=32

Вместо этого я попробовал порт 25, он подключился (250 OK), а затем набрал:

AUTH LOGIN
334 VXNlcm5hbWU6
SMTP_USER
334 UGFzc3dvcmQ6
SMTP_PASSWORD

но он вывел: 535 Неверные учетные данные для аутентификации. Мог ли я использовать неправильные учетные данные? но я копирую имя пользователя и пароль прямо со страницы генерации пользователя и пароля smtp.

Я также попытался привязать политику AmazonSESFullAccess ко всем пользователям IAM, но ничего не вышло.

Я использую Django 1.8.2. Пробовал Django-ses, но он тоже не работал (синтаксическая ошибка при запуске тестов, он не поддерживает python 3?)

ОБНОВЛЕНИЕ

Я изменил порт на 587 и использую USE_TLS True, и теперь я могу send_mail из оболочки django. Я помещаю функцию в свое приложение views.py:

def test_email(request):
  send_mail("title", "content", "[email protected]", ["[email protected]"], fail_silently=False)
  return get_return_object(request, status_code=1)

и в urls.py я помещаю это в urlpatterns:

url(r'^test_email/$', views.test_email, name="test_email"),

и когда я посетил URL-адрес, ничего не произошло. Я вызываю ту же функцию test_email из оболочки, и она работает.

ОБНОВЛЕНИЕ

Оказывается, я также могу использовать порт 465 и USE_SSL True и иметь возможность send_mail из оболочки django. но все же это не работает в views.py


person bysreg    schedule 09.06.2015    source источник
comment
Не могли бы вы написать сообщение об ошибке? Попробуйте создать новые учетные данные.   -  person Edwin Lunando    schedule 10.06.2015
comment
пожалуйста, смотрите обновленный раздел. Я изменил порт, и теперь я могу отправлять почту из оболочки, но по какой-то причине я не могу отправить ее через url   -  person bysreg    schedule 10.06.2015


Ответы (2)


Если вы используете порт 465: установите django-smtp-ssl с помощью pip

pip install django-smtp-ssl

затем измените EMAIL_BACKEND в settings.py следующим образом:

EMAIL_BACKEND = 'django_smtp_ssl.SSLEmailBackend'

Если вы используете порт 587:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
person Dawn T Cherian    schedule 09.09.2015

Обновление 2020 г.

Как сказано в документации: Электронная документация Django и Email_use_ssl

В данный момент я использую Django 3.0, и в документации сказано, что вы можете использовать

EMAIL_USE_SSL = True

... Обычно используется на порту 465

Я заставляю свою мысль работать и отправляю электронные письма, используя AWS SES и порт 465. используя эту строку вместо EMAIL_USE_TLS = True :)

person Samuel Urias    schedule 24.05.2020