django oscar send_email 导致 ValueError: EMAIL_USE_TLS/EMAIL_USE_SSL 是互斥的,

问题描述 投票:0回答:3

这个函数触发了一个对我来说没有意义的错误:

File "/venv/virtualenvs/ZHR-f7z/oscar/apps/communication/utils.py", line 128, in send_email_messages
email.send()

在设置中:

EMAIL_USE_SSL = None #False doesn't change result
EMAIL_USE_TLS = None

发生了一些错误,因为两者都是“无”,所以这些不可能是真的:

File "/venv/virtualenvs/ZHR-f7z/lib/python3.9/site-packages/django/core/mail/backends/smtp.py", line 31, in __init__
        self.use_ssl = settings.EMAIL_USE_SSL if use_ssl is None else use_ssl
        self.timeout = settings.EMAIL_TIMEOUT if timeout is None else timeout
        self.ssl_keyfile = settings.EMAIL_SSL_KEYFILE if ssl_keyfile is None else ssl_keyfile
        self.ssl_certfile = settings.EMAIL_SSL_CERTFILE if ssl_certfile is None else ssl_certfile
        if self.use_ssl and self.use_tls:
            raise ValueError(
                "EMAIL_USE_TLS/EMAIL_USE_SSL are mutually exclusive, so only set "
                "one of those settings to True.")
        self.connection = None
        self._lock = threading.RLock()



[console ready]
>>> use_ssl
>>> self.use_ssl
'None'
>>> self.use_tls
'None'
>>> 

如果我用以下命令启动 shell:

>>> from django.core import mail
>>> mail.send_mail(
...             'Subject here', 'Here is the message.',
...             'mailfrom', ['mailto'],
...             fail_silently=False,
...         )

取得成功。

有什么建议吗,因为设置都是 false,并且如果两者都为 True,则应该触发 ValueError?

谢谢,BR

django django-oscar
3个回答
2
投票

EMAIL_USE_TLS
EMAIL_USE_SSL
是互斥的 您应该选择要使用的安全连接,取决于您的电子邮件提供商

在 Django 中,EMAIL_USE_TLS 默认使用端口 587,而 EMAIL_USE_SSL 使用端口 465

所以,正确的设置必须是

EMAIL_USE_SSL = False
EMAIL_USE_TLS = True

EMAIL_USE_SSL = True
EMAIL_USE_TLS = False

请参阅 Django Doc 设置

EMAIL_USE_TLS/EMAIL_USE_SSL


1
投票

我有点困惑,TLS 为 True,SSL 为 False,触发 ValueError 的条件意味着:

if self.use_ssl==True and self.use_tls == True 

我希望两者都为 True 才能触发异常。 但这里只有一个为 True 时就会被触发。

或者我还漏掉了其他东西?


0
投票

如果您仍然遇到此问题,即使您已经将这些设置分配到 settings.py 中,例如:

EMAIL_USE_TLS = True
EMAIL_USE_SSL = False

然后要修复它,只需从 settings.py 中删除您覆盖为 False 的设置(对我来说就是这段代码):

EMAIL_USE_SSL = False

如果您的设置与我给您的示例类似,请将 EMAIL_USE_TLS 移至 EMAIL_HOST 上方。

不知道为什么上面的解决方案可以解决问题,也许这是 django 本身的最新错误(我使用 django 版本 1.4.1)

© www.soinside.com 2019 - 2024. All rights reserved.