我不能在 Django 中使用 EMAIL_PASSWORD 中的 unicode 字符

I can't use unicode characters in EMAIL_PASSWORD with django

我使用的是 django 3.0.8,在我的 settings.py 中,我使用 EMAIL_PASSWORD = '...' 为我的电子邮件帐户指定了密码。我的密码包含变音符号,并且在从 shell 手动发送邮件时出现此错误:

>>> from django.core.mail import send_mail
>>> send_mail('Django mail', 'This e-mail was sent with django', ..., fail_silently=False)
Traceback (most recent call last):
  File "/usr/lib/python3.6/code.py", line 91, in runcode
    exec(code, self.locals)
  File "<console>", line 1, in <module>
  File "/home/admin/.local/lib/python3.6/site-packages/django/core/mail/__init__.py", line 60, in send_mail
    return mail.send()
  File "/home/admin/.local/lib/python3.6/site-packages/django/core/mail/message.py", line 276, in send
    return self.get_connection(fail_silently).send_messages([self])
  File "/home/admin/.local/lib/python3.6/site-packages/django/core/mail/backends/smtp.py", line 102, in send_messages
    new_conn_created = self.open()
  File "/home/admin/.local/lib/python3.6/site-packages/django/core/mail/backends/smtp.py", line 69, in open
    self.connection.login(self.username, self.password)
  File "/usr/lib/python3.6/smtplib.py", line 721, in login
    initial_response_ok=initial_response_ok)
  File "/usr/lib/python3.6/smtplib.py", line 630, in auth
    response = encode_base64(initial_response.encode('ascii'), eol='')
UnicodeEncodeError: 'ascii' codec can't encode character '\xe4' in position 19: ordinal not in range(128)

如果我删除变音符号,一切都会正常进行。显然 smtplib 使用 ascii 手动编码,我不知道如何告诉它不要这样做。有什么想法吗?

这是 smtplib 中的 known issue

至于现在,2020 年 7 月它仍然开放,fix 等待审核。

底线-有问题,众所周知,没有官方解决方案。

但是,您现在可以做的事情:

  1. 手动给文件打补丁/usr/lib/python3.6/smtplib.py的做法here——很简单,把3中的ascii换成utf-8就可以了地方。我没有尝试过,但根据其他用户的说法它是有效的。只是备份文件以防万一。或者使用带有补丁 smtplib.py 的虚拟环境。老实说,我个人没有测试过它,但人们报告说它有效。

  2. 使用一些替代 smtplib 的方法。我实际上不知道原生 Python 中的任何类似内容,但是您始终可以通过 python subprocess 模块或某些提供的 Web 服务使用命令行实用程序,例如 mail通过 REST 的邮件服务 API(有很多,但如果您在本地公司网络或其他地方使用邮件,这将不起作用)。

  3. 更改密码并忘记问题。