我不能在 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 等待审核。
底线-有问题,众所周知,没有官方解决方案。
但是,您现在可以做的事情:
手动给文件打补丁/usr/lib/python3.6/smtplib.py
的做法here——很简单,把3中的ascii
换成utf-8
就可以了地方。我没有尝试过,但根据其他用户的说法它是有效的。只是备份文件以防万一。或者使用带有补丁 smtplib.py 的虚拟环境。老实说,我个人没有测试过它,但人们报告说它有效。
使用一些替代 smtplib 的方法。我实际上不知道原生 Python 中的任何类似内容,但是您始终可以通过 python subprocess
模块或某些提供的 Web 服务使用命令行实用程序,例如 mail
通过 REST 的邮件服务 API(有很多,但如果您在本地公司网络或其他地方使用邮件,这将不起作用)。
更改密码并忘记问题。
我使用的是 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 等待审核。
底线-有问题,众所周知,没有官方解决方案。
但是,您现在可以做的事情:
手动给文件打补丁
/usr/lib/python3.6/smtplib.py
的做法here——很简单,把3中的ascii
换成utf-8
就可以了地方。我没有尝试过,但根据其他用户的说法它是有效的。只是备份文件以防万一。或者使用带有补丁 smtplib.py 的虚拟环境。老实说,我个人没有测试过它,但人们报告说它有效。使用一些替代 smtplib 的方法。我实际上不知道原生 Python 中的任何类似内容,但是您始终可以通过 python
subprocess
模块或某些提供的 Web 服务使用命令行实用程序,例如mail
通过 REST 的邮件服务 API(有很多,但如果您在本地公司网络或其他地方使用邮件,这将不起作用)。更改密码并忘记问题。