Джанго отправка электронной почты

32

Я знаю, что есть 20 вопросов, похожих на мои, но я пробовал больше дня, чтобы получить электронную почту для работы с Django.

Я получаю эту ошибку: [Errno 111] Connection refused, когда я пытаюсь отправить электронное письмо

Здесь я создаю письмо и пытаюсь отправить его на мой взгляд:

try:
    msg = EmailMessage(subject, message, from_email, [receiver])
    msg.content_subtype = "html"
    msg.send()

Мой файл настроек выглядит следующим образом:

EMAIL_HOST = "localhost"
DEFAULT_FROM_EMAIL = "[email protected]"
EMAIL_PORT = 25
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"

Я пробовал делать отправку теста с помощью python -m smtpd -n -c DebuggingServer localhost:1025 и имел успех, но когда дело доходит до того, чтобы делать это по-настоящему, без успеха.

Когда я пытаюсь выполнить send_mail из оболочки, я получаю эту трассировку:

>>> from django.core.mail import send_mail
>>> send_mail('Test', 'Test', '[email protected]', ['[email protected]'])
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python2.6/dist-packages/django/core/mail/__init__.py", line 61, in send_mail
    connection=connection).send()
  File "/usr/local/lib/python2.6/dist-packages/django/core/mail/message.py", line 251, in send
    return self.get_connection(fail_silently).send_messages([self])
  File "/usr/local/lib/python2.6/dist-packages/django/core/mail/backends/smtp.py", line 79, in send_messages
    new_conn_created = self.open()
  File "/usr/local/lib/python2.6/dist-packages/django/core/mail/backends/smtp.py", line 42, in open
    local_hostname=DNS_NAME.get_fqdn())
  File "/usr/lib/python2.6/smtplib.py", line 239, in __init__
    (code, msg) = self.connect(host, port)
  File "/usr/lib/python2.6/smtplib.py", line 295, in connect
    self.sock = self._get_socket(host, port, self.timeout)
  File "/usr/lib/python2.6/smtplib.py", line 273, in _get_socket
    return socket.create_connection((port, host), timeout)
  File "/usr/lib/python2.6/socket.py", line 561, in create_connection
    raise error, msg
error: [Errno 111] Connection refused

Кажется, я ничего не могу с этим поделать. Любая помощь или совет будут высоко оценены. Благодаря

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

Теги:
smtp

7 ответов

68
Лучший ответ

Вы пытаетесь использовать учетную запись gmail? Возможно, попробуйте следующее:

EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = '[email protected]'
EMAIL_HOST_PASSWORD = 'your-password'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

Затем попробуйте выполнить тест (django < 1.4) на

python manage.py shell
>>> from django.core.mail import send_mail
>>> send_mail('test email', 'hello world', to=['[email protected]'])

И если вы используете django 1.4, используйте это:

python manage.py shell
>>> from django.core.mail import send_mail
>>> send_mail('test email', 'hello world', '[email protected]', ['[email protected]'])

Если вы не используете учетную запись gmail и все еще получаете проблемы, просто попробуйте добавить EMAIL_HOST_USER и EMAIL_HOST_PASSWORD к тому, что у вас есть. Если у вас все еще есть проблемы, возможно, ваша сеть блокирует вас. Брандмауэры на вашей ОС или маршрутизаторе.

Благодаря knite для обновленного синтаксиса. Бросьте ему +1 и спасибо pranavk за то, что он дал мне знать о синтаксическом изменении в django 1.4

  • 0
    Я пытался отправить электронную почту через мой локальный сервер. Но прохождение через gmail тоже работает. Спасибо
  • 0
    Вы уверены, что EMAIL_HOST_USER также включает в себя gmail, не должно ли это быть просто "username"?
Показать ещё 5 комментариев
34

Сначала создайте специальный пароль для приложения

  • Посетите страницу безопасности учетной записи Google.
  • В поле 2-Step Verification нажмите Settings (если ссылка отсутствует, вы можете создать новую, вы можете пропустить шаги 3 и 4).
  • Перейдите на вкладку App-specific passwords.
  • Нажмите Manage your application specific passwords.
  • В разделе Application-specific passwords введите описательное имя для приложения, которое вы хотите разрешить, например "Django gmail", затем нажмите кнопку Generate application-specific password.
  • запишите пароль. например: smbumqjiurmqrywn Изображение 106899

Затем добавьте соответствующие значения в settings.py:

EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = '[email protected]'
EMAIL_HOST_PASSWORD = 'Application spectific password(for eg: smbumqjiurmqrywn)'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

Вы можете использовать оболочку для ее проверки:

python manage.py shell
>>> from django.core.mail import send_mail
>>> send_mail('Test', 'This is a test', '[email protected]', ['[email protected]'],
     fail_silently=False)
  • 1
    К сожалению, пароли для конкретных приложений не доступны для учетных записей Gmail Google для бизнеса. Я получаю эту ошибку, когда пытаюсь перейти непосредственно на страницу паролей приложения ( security.google.com/settings/u/3/security/apppasswords ): нужный вам параметр недоступен для вашей учетной записи.
  • 0
    здесь обновленный документ
17

@mongoose_za имеет отличный ответ, но синтаксис немного отличается от Django 1.4 +.

Вместо:

send_mail('test email', 'hello world', to=['[email protected]'])

использование

send_mail('test email', 'hello world', '[email protected]', ['[email protected]'])

Первые четыре аргумента необходимы: тема, сообщение, from_email и recipient_list.

5
  • Включить pop3 в настройках gmail.
  • создать специальный пароль для данного приложения django. (Http://support.google.com/accounts/bin/answer.py?hl=en&answer=185833)
2

Я бы не стал использовать GMail. Он будет работать для нескольких электронных писем, но после этого вы обнаружите, что все ваши электронные письма отклонены или защищены от спама. Я использовал сервис Amazon "SES" с Django-SES, чтобы решить эту проблему.

  • 2
    Недавно начал использовать SendGrid, который также является отличным сервисом.
1

В settings.py, используйте smtp как серверный и не консольный

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
0

введите следующие минимальные настройки в файл settings.py или local_settings.py на свой сервер.

EMAIL_HOST = 'localhost'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

вместо использования smtp.gmail.com, который накладывает множество ограничений, вы можете иметь свой собственный почтовый сервер.

вы можете сделать это, установив свой собственный почтовый сервер:

sudo apt-get install sendmail
  • 1
    Я использовал postfix вместо sendmail и те же настройки, что и выше, но электронное письмо не отправляется.
  • 0
    @toothie У меня была такая же проблема, пока я не понял, что я не установил postfix на свой рабочий сервер ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню