关于django:尝试发送验证邮件时“权限被拒绝”

“Permission denied” when trying to send verification email

我正在使用Apache和mod_wsgi在Fedora服务器(Fedora版本15(Lovelock))上运行django网站。 最近我尝试使用django-registration app(0.7版)添加注册系统,但不幸的是,当应用程序尝试向新注册的用户发送验证邮件时,我得到了"[Errno 13]权限被拒绝"。 我已经将项目的设置文件配置为使用gmail帐户以这种方式发送电子邮件:

1
2
3
4
5
6
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = '[email protected]'
EMAIL_HOST_PASSWORD = 'mypassword'
EMAIL_PORT = 587

我在使用项目shell时手动导入send_mail时可以发送电子邮件。
我没有改变视图或模型中的任何内容。 这是注册模板文件:

1
2
3
4
5
6
7
8
9
10
{% extends"base.html" %}
{% load i18n %}

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

这是我得到的错误:

1
2
3
4
5
6
7
8
[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

这是完整的追溯:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Traceback:
File"/usr/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File"/.../lib/registration/views.py" in register
  148.             new_user = form.save(profile_callback=profile_callback)
File"/.../lib/registration/forms.py" in save
  88.                                                                     send_email = True)
File"/.../lib/registration/models.py" in create_inactive_user
  127.             send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, [new_user.email])
File"/usr/lib/python2.7/site-packages/django/core/mail/__init__.py" in send_mail
  61.                         connection=connection).send()
File"/usr/lib/python2.7/site-packages/django/core/mail/message.py" in send
  251.         return self.get_connection(fail_silently).send_messages([self])
File"/usr/lib/python2.7/site-packages/django/core/mail/backends/smtp.py" in send_messages
  79.             new_conn_created = self.open()
File"/usr/lib/python2.7/site-packages/django/core/mail/backends/smtp.py" in open
  42.                                            local_hostname=DNS_NAME.get_fqdn())
File"/usr/lib64/python2.7/smtplib.py" in __init__
  239.             (code, msg) = self.connect(host, port)
File"/usr/lib64/python2.7/smtplib.py" in connect
  295.         self.sock = self._get_socket(host, port, self.timeout)
File"/usr/lib64/python2.7/smtplib.py" in _get_socket
  273.         return socket.create_connection((port, host), timeout)
File"/usr/lib64/python2.7/socket.py" in create_connection
  571.         raise err

Exception Type: error at /accounts/register/
Exception Value: [Errno 13] Permission denied


这可能是SELinux阻止的。我会检查这些日志,看看它是否拒绝你的许可。您可以在/var/log/audit/audit.log中找到主日志。尝试操作并查看它是否在日志末尾生成新消息。如果是这样,它是SELinux,它不允许发送电子邮件。如果这会产生拒绝,那么您需要更新SELinux策略,可能使用audit2allow。有关如何执行此操作的说明,请参阅SELinux CentOS Howto。 CentOS和Fedora非常接近,如果SELinux拒绝采取行动,那么其中列出的步骤应该有效。如果没有,那么显然,这将是无关紧要的。

您还可以尝试使用命令setenforce 0临时禁用SELinux强制执行,并查看问题是否消失。无论是否,使用setenforce 1再次强制执行是个好主意。


这可能是IO错误。您是否在视图中执行任何打印语句或将内容写入文件?如果是这样,您可以拥有权限问题。请检查并回复。


这些是你必须添加到settings.py的行:

1
2
3
4
5
EMAIL_HOST = 'smtp.webfaction.com'
EMAIL_HOST_USER = '<mailbox>'
EMAIL_HOST_PASSWORD = '<password>'
DEFAULT_FROM_EMAIL = ''
SERVER_EMAIL = ''

EMAIL_HOST_USER中删除@ domain.com,所以它只是myemailaddress