我不能在Django的电子邮件密码中使用unicode字符

2024-04-19 01:29:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是django 3.0.8,在我的settings.py中,我使用EMAIL_password='…'为我的电子邮件帐户指定了密码。我的密码包含umlauts,从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)

如果我移除umlaut,一切都会正常工作。显然,smtplib是用ascii手工编码的,我不知道如何告诉它不要这样做。有什么想法吗


Tags: djangoinpycoreselfsendhomeadmin
1条回答
网友
1楼 · 发布于 2024-04-19 01:29:46

这是smtplib中的known issue

到目前为止,2020年7月its仍然开放,等待审查

底线-有一个问题,这是众所周知的,没有正式的解决办法

然而,你现在能做的是:

  1. 手动修补文件/usr/lib/python3.6/smtplib.py的方式here-非常简单,只需在3个位置用utf-8替换ascii。我没有尝试过,但其他用户认为它很有效。备份文件以防万一。或者将虚拟环境与修补的smtplib.py一起使用。老实说,我个人没有测试它,但人们报告它工作

  2. 使用smtplib的一些替代品。实际上,我不知道本地Python中有什么类似的东西,但是您可以始终使用命令行实用程序,比如通过Python mail模块使用subprocess,或者使用一些通过RESTAPI提供邮件服务的web服务(有很多,但如果您在本地公司网络或其他地方使用邮件,这将不起作用)

  3. 更改您的密码并忘记该问题

相关问题 更多 >