0

我正在尝试通过 Django 向 AOL 帐户发送电子邮件,但出现以下错误:

Traceback (most recent call last):
  File "C:\Users\Dom\.virtualenvs\superlists\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
    response = get_response(request)
  File "C:\Users\Dom\.virtualenvs\superlists\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\Dom\.virtualenvs\superlists\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Dom\Documents\Python_Projects\Django\TDD_with_Python_and_Django\superlists\accounts\views.py", line 21, in send_login_email
    [email],
  File "C:\Users\Dom\.virtualenvs\superlists\lib\site-packages\django\core\mail\__init__.py", line 62, in send_mail
    return mail.send()
  File "C:\Users\Dom\.virtualenvs\superlists\lib\site-packages\django\core\mail\message.py", line 348, in send
    return self.get_connection(fail_silently).send_messages([self])
  File "C:\Users\Dom\.virtualenvs\superlists\lib\site-packages\django\core\mail\backends\smtp.py", line 104, in send_messages
    new_conn_created = self.open()
  File "C:\Users\Dom\.virtualenvs\superlists\lib\site-packages\django\core\mail\backends\smtp.py", line 71, in open
    self.connection.login(force_str(self.username), force_str(self.password))
  File "C:\Users\Dom\AppData\Local\Programs\Python\Python36_64\lib\smtplib.py", line 721, in login
    initial_response_ok=initial_response_ok)
  File "C:\Users\Dom\AppData\Local\Programs\Python\Python36_64\lib\smtplib.py", line 631, in auth
    (code, resp) = self.docmd("AUTH", mechanism + " " + response)
  File "C:\Users\Dom\AppData\Local\Programs\Python\Python36_64\lib\smtplib.py", line 421, in docmd
    return self.getreply()
  File "C:\Users\Dom\AppData\Local\Programs\Python\Python36_64\lib\smtplib.py", line 391, in getreply
    + str(e))
smtplib.SMTPServerDisconnected: Connection unexpectedly closed: [WinError 10054] An existing connection was forcibly closed by the remote host
"POST /accounts/send_email HTTP/1.1" 500 130728

这是我的设置:

EMAIL_HOST = 'smtp.aol.com'
EMAIL_HOST_USER = 'myemail@aol.com'
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_PASSWORD')
EMAIL_PORT = 465
EMAIL_USE_SSL = True

我正在关注第 18 章的TDD with Python一书,它有一个自定义身份验证后端:

class PasswordlessAuthenticationBackend(object):

    def authenticate(self, uid):
        print('uid', uid, file=sys.stderr)
        if not Token.objects.filter(uid=uid).exists():
            print('no token found', file=sys.stderr)
            return None
        token = Token.objects.get(uid=uid)
        print('got token', file=sys.stderr)
        try:
            user = ListUser.objects.get(email=token.email)
            print('got user', file=sys.stderr)
            return user
        except ListUser.DoesNotExist:
            print('new user', file=sys.stderr)
            return ListUser.object.create(email=token.email)
    

    def get_user(self, email):
        return ListUser.objects.get(email=email)

这假设使用以下视图通过电子邮件对用户进行身份验证

def send_login_email(request):
    email = request.POST['email']
    uid = str(uuid.uuid4())
    Token.objects.create(email=email, uid=uid)
    print('saving uid', uid, 'for email', email, file=sys.stderr)
    url = request.build_absolute_uri(f'/accounts/login?uid={uid}')
    send_mail(
        'Your login link for Superlists',
        f'Use this link to log in:\n\n{url}',
        'noreply@superlists',
        [email],
    )
    return render(request, 'login_email_sent.html')

回溯表明它在 send_login_email 失败,但我不知道为什么;本书示例使用了 gmail 帐户,但我使用的是 AOL 帐户,因为我有一个从未使用过的一次性电子邮件。我调整了我的 settings.py 以适应AOL 的电子邮件服务设置,但我可能遗漏了一些东西……我只是不确定是什么。

非常感谢任何帮助/信息。谢谢你。

编辑 我在@hwjp 的建议下禁用了我的防火墙,我不再收到 [WinError 10054];代码更进一步,但现在我收到以下错误:

File "C:\Users\Dom\AppData\Local\Programs\Python\Python36_64\lib\smtplib.py", line 394, in getreply
    raise SMTPServerDisconnected("Connection unexpectedly closed")

查看失败的 smtplib.py 函数:

def getreply(self):
        """Get a reply from the server.

        Returns a tuple consisting of:

          - server response code (e.g. '250', or such, if all goes well)
            Note: returns -1 if it can't read response code.

          - server response string corresponding to response code (multiline
            responses are converted to a single, multiline string).

        Raises SMTPServerDisconnected if end-of-file is reached.
        """
        resp = []
        if self.file is None:
            self.file = self.sock.makefile('rb')
        while 1:
            try:
                line = self.file.readline(_MAXLINE + 1)
            except OSError as e:
                self.close()
                raise SMTPServerDisconnected("Connection unexpectedly closed: "
                                             + str(e))
            if not line:
                self.close()
                raise SMTPServerDisconnected("Connection unexpectedly closed")

对我来说,这似乎self.sock.makefile('rb')是失败的;但我不知道为什么,我在追踪问题的根源时遇到了一些困难。

我将继续研究它,但感谢任何其他提示/建议。

4

0 回答 0