«Отказано в разрешении» при попытке отправить электронное письмо с подтверждением

#django #fedora #django-registration

#django #fedora #django-регистрация

Вопрос:

Я запускаю веб-сайт django на сервере fedora (Fedora release 15 (Lovelock)) с использованием Apache и mod_wsgi. недавно я попытался добавить систему регистрации с помощью приложения django-registration (версия 0.7), но, к сожалению, я получаю «[Ошибка № 13] Отказано в разрешении», когда приложение пытается отправить электронное письмо с подтверждением вновь зарегистрированному пользователю. Я настроил файл настроек моего проекта для отправки электронных писем с использованием учетной записи gmail таким образом:

 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'myemailaddress@gmail.com'
EMAIL_HOST_PASSWORD = 'mypassword'
EMAIL_PORT = 587
  

Я могу отправлять электронные письма, когда вручную импортирую send_mail, используя оболочку проекта.
Я ничего не изменил в представлениях или моделях. вот файл шаблона регистрации:

 {% extends "base.html" %}
{% load i18n %}

{% block content %}
<form method="post" action="/accounts/register/">
  {% csrf_token %}
  {{ form }}
  <input type="submit" value="Register"/>
</form>
{% endblock %}
  

и вот ошибка, которую я получаю:

 [Errno 13] Permission denied
Request Method: POST
Request URL:    http://myip/accounts/register/
Django Version: 1.3.1
Exception Type: error
Exception Value:    
[Errno 13] Permission denied
Exception Location: /usr/lib64/python2.7/socket.py in create_connection, line 571
  

это полная трассировка:

Трассировка:
Файл "/usr/lib/python2.7/site-packages/django/core/handlers/base.py " в get_response
 111. ответ = обратный вызов (запрос, * callback_args, ** callback_kwargs)
Файл "/ .../lib/registration/views.py " в реестре
 148. new_user = form.save(profile_callback=profile_callback)
Файл "/ .../lib/registration/forms.py " в save
 88. send_email = True)
Файл "/ .../lib/registration/models.py " в create_inactive_user
 127. send_mail(тема, сообщение, настройки.DEFAULT_FROM_EMAIL, [new_user.email])
Файл "/usr/lib/python2.7/site-packages/django/core/mail/__init__.py " в send_mail
 61. соединение = соединение).отправить()
Файл "/usr/lib/python2.7/site-packages/django/core/mail/message.py " в отправке
 251. верните self.get_connection(fail_silently).send_messages([self])
Файл "/usr/lib/python2.7/site-packages/django/core/mail/backends/smtp.py " в send_messages
 79. new_conn_created = self.open()
Файл "/usr/lib/python2.7/site-packages/django/core/mail/backends/smtp.py " в открытом
 42. local_hostname=DNS_NAME.get_fqdn())
Файл "/usr/lib64/python2.7/smtplib.py " в __init__
 239. (код, сообщение) = self.connect (хост, порт)
Файл "/usr/lib64/python2.7/smtplib.py " в соединении
 295. self.sock = self._get_socket(хост, порт, self.timeout)
Файл "/usr/lib64/python2.7/smtplib.py " в _get_socket
 273. верните socket.create_connection((порт, хост), тайм-аут)
Файл "/usr/lib64/python2.7/socket.py " в create_connection
 571. ошибка вызова

Тип исключения: ошибка в / accounts / register/
Значение исключения: [Ошибка 13] Отказано в разрешении

Комментарии:

1. можете ли вы указать раздел просмотра своего кода, который фактически отправляет электронное письмо?

Ответ №1:

Это может быть предотвращено SELinux. Я бы проверил эти журналы и посмотрел, не отказывает ли вам в разрешении. Вероятно, вы можете найти основной журнал в /var/log/audit/audit.log Попробуйте выполнить действие и посмотрите, генерирует ли оно новое сообщение в конце журнала. Если это так, то это SELinux, который запрещает отправку электронной почты. Если это генерирует отказ, вам необходимо обновить свою политику SELinux, возможно, с помощью audit2allow . Инструкции о том, как это сделать, см. В Руководстве SELinux CentOS. CentOS и Fedora достаточно близки, чтобы описанные там шаги должны сработать, если SELinux — это то, что запрещает действие. Если нет, то, очевидно, это было бы неуместно.

Вы также можете попробовать временно отключить принудительное использование SELinux с помощью команды setenforce 0 и посмотреть, исчезнет ли проблема. Независимо от того, так это или нет, рекомендуется использовать setenforce 1 , чтобы снова включить принудительное исполнение.

Комментарии:

1. вы имеете в виду журналы ошибок apache? Я проверил его в /etc/httpd/logs/error_log и обнаружил следующее: [ошибка] [клиент 173.242.117.169] mod_wsgi (pid= 11534): произошло исключение при обработке скрипта WSGI ‘/var/www/algorithms.ir/algorithms_ir/apache/django.wsgi’., ссылка: http://…/accounts/register/ [Чт. 27 окт. 02:01:14 2011] [ошибка] [клиент 173.242.117.169] IOError: не удалось записать данные, refererer: http://…/accounts/register/

2. Я расширил ответ более подробной информацией. Журнал Apache не был тем, на который я ссылался.

3. спасибо, извините за задержку, я пробовал это, но в конце файла журнала ничего нового не появилось. думаю, это не проблема

4. Похоже, что нет. Жаль. Извините, тогда я не смог быть полезным.

5. вы были правы, это была проблема SELinux, я мог бы решить проблему, применив следующие команды: setsebool httpd_tmp_exec на setsebool httpd_can_network_connect на и теперь пользователь apache имеет разрешение на отправку проверочных писем с моим приложением. Я нашел решение здесь coverfire.com/archives/2010/06/13/djangomod_wsgi-on-fedora-12

Ответ №2:

Это может быть ошибка ввода-вывода. Выполняете ли вы какие-либо инструкции по печати или записываете данные в файл, на ваш взгляд? Если это так, у вас могут возникнуть проблемы с разрешениями. Пожалуйста, проверьте и ответьте.

Комментарии:

1. извините за мою задержку, единственное, что происходит, на мой взгляд, — это добавление нового неактивного пользователя в мою базу данных, а затем генерация сообщения об активации для пользователя и отправка электронного письма. Я не настроил DNS-имя своего сервера, я думаю, это и есть причина проблемы. на данный момент я решил использовать приложение для проверки captcha вместо проверки электронной почты

Ответ №3:

Это строки, которые вы должны добавить в свой settings.py:

 EMAIL_HOST = 'smtp.webfaction.com'
EMAIL_HOST_USER = '<mailbox>'
EMAIL_HOST_PASSWORD = '<password>'
DEFAULT_FROM_EMAIL = '<address>'
SERVER_EMAIL = '<address>'
  

удалить @domain.com EMAIL_HOST_USER таким образом, это будет просто myemailaddress

Комментарии:

1. Я не использую webfaction, и у меня нет проблем с отправкой электронных писем с этой конфигурацией, когда я пытаюсь send_mail после запуска «python manage.py оболочка». Я настроил DEFAULT_FROM_EMAIL и SERVER_EMAIL, но все равно выдает ту же ошибку