Джанго отправка электронной почты
Я знаю, что у меня есть 20 вопросов, похожих на мой, но я уже более дня пытаюсь получить электронную почту для работы с Джанго.
Я получаю эту ошибку: [Errno 111] Connection refused
когда я пытаюсь отправить электронное письмо
Здесь я создаю письмо и пытаюсь отправить его на мой взгляд:
try:
msg = EmailMessage(subject, message, from_email, [receiver])
msg.content_subtype = "html"
msg.send()
Мой файл настроек выглядит следующим образом:
EMAIL_HOST = "localhost"
DEFAULT_FROM_EMAIL = "myemail@gmail.com"
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', 'myemail@gmail.com', ['myemail@gmail.com'])
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
Я просто, кажется, никуда не денусь с этим. Любая помощь или совет будет высоко ценится. Спасибо
Кроме того, если вы хотите что-то еще увидеть, просто прокомментируйте это.
8 ответов
Вы пытаетесь использовать учетную запись Gmail? Может быть, попробуйте это тогда:
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'your-username@gmail.com'
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=['test@email.com'])
И если вы используете django 1.4, используйте это:
python manage.py shell
>>> from django.core.mail import send_mail
>>> send_mail('test email', 'hello world', 'your@email.com', ['test@email.com'])
Если вы не используете учетную запись Gmail и по-прежнему возникают проблемы, просто попробуйте добавить EMAIL_HOST_USER
а также EMAIL_HOST_PASSWORD
к тому, что у тебя есть. Если у вас все еще есть проблемы, возможно, ваша сеть блокирует вас. Брандмауэры на вашей ОС или роутере.
Спасибо knite за обновленный синтаксис. Киньте ему +1 и спасибо pranavk за сообщение об изменении синтаксиса в django 1.4
Сначала создайте пароль для приложения
- Посетите страницу безопасности своего аккаунта 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
Затем добавьте соответствующие значения в settings.py:
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'your-username@gmail.com'
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', 'your@email.com', ['toemail@email.com'],
fail_silently=False)
У @mongoose_za отличный ответ, но синтаксис немного отличается в Django 1.4+.
Вместо:
send_mail('test email', 'hello world', to=['test@email.com'])
использование
send_mail('test email', 'hello world', 'your@email.com', ['test@email.com'])
Требуются первые четыре аргумента: тема, сообщение, from_email и receient_list.
- Включите pop3 в настройках Gmail.
- создать специальный пароль для этого приложения django. (Http://support.google.com/accounts/bin/answer.py?hl=en&answer=185833)
Я бы не использовал GMail. Он будет работать для нескольких электронных писем, но после этого вы можете обнаружить, что все ваши электронные письма отклоняются или спам-сообщения. Я использовал сервис Amazon SES с Django-SES, чтобы решить эту проблему.
В settings.py используйте smtp в качестве бэкэнда, а не консоли
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
Сначала настройте переменные серверной части электронной почты в файле settings.py.
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'your-username@gmail.com'
EMAIL_HOST_PASSWORD = 'your-password'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
Затем создайте объект электронной почты для отправки писем.
from django.core import mail
connection = mail.get_connection() # Manually open the connection
connection.open() # Construct an email message that uses the connection
email = mail.EmailMessage( 'Hello', 'Body goes here', 'from@example.com', ['to1@example.com'], connection=connection, )
email.send() # Send the email
connection.close()
Поместите следующие минимальные настройки в файл settings.py или local_settings.py на вашем сервере.
EMAIL_HOST = 'localhost'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
вместо того, чтобы использовать smtp.gmail.com, который накладывает много ограничений, вы можете иметь свой собственный почтовый сервер.
Вы можете сделать это, установив свой собственный почтовый сервер:
sudo apt-get install sendmail