【问题标题】:Couldn't able to import environment variable for django settings.py for sending email in linux ubuntu system无法为 django settings.py 导入环境变量以在 linux ubuntu 系统中发送电子邮件
【发布时间】:2020-02-03 16:27:36
【问题描述】:

当我直接指定 EMAIL_HOST_USER 和 EMAIL_HOST_PASSWORD 时,电子邮件发送正确,但如果尝试使用 os.environ,则会引发以下错误 (530, b'5.7.0 Authentication Required. Learn more at\n5.7.0 https://support.google.com/mail/?p=WantAuthError l26sm20714449pgn.46 - gsmtp', 'webmaster@localhost')。我曾尝试在 .bashrc 和 .bash_profile 中添加变量,但没有奏效。我尝试过的内容如下所示。谁能帮帮我。

settings.py

​​>

变量如下所示。

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
# EMAIL_HOST_USER = 'name@gmail.com'
# EMAIL_HOST_PASSWORD = '123456789'
EMAIL_HOST_USER = os.environ.get('EMAIL_HOST_USER')
print('variable :',os.environ.get('EMAIL_HOST_USER'))
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_HOST_PASSWORD')

.bashrc

此文件位于 settings.py 所在的同一目录中。

import os
export EMAIL_HOST_USER = 'name@gmail.com'
export EMAIL_HOST_PASSWORD = '9538913650'

主要

下面是我在终端中尝试过的全局和虚拟环境。

EMAIL_HOST_USER=name@gmail.com
EMAIL_HOST_PASSWORD=123456789

使用 python 命令

代码如下。

import os
os.environ.set('EMAIL_HOST_USER') = 'name@gmail.com'
os.environ.set('EMAIL_HOST_PASSWORD') = 12345678

【问题讨论】:

    标签: python django


    【解决方案1】:

    首先,不要使用os.environ.get('...') - 当环境变量丢失时它会静默失败。请改用os.environ['...']

    EMAIL_HOST_USER = os.environ['EMAIL_HOST_USER']
    print('variable :',os.environ['EMAIL_HOST_USER'])
    EMAIL_HOST_PASSWORD = os.environ['EMAIL_HOST_PASSWORD']
    

    接下来,.bashrc.bash_profile 仅在您从已获取这些文件的 shell 运行 Django 时才有效。去掉import os,它不是Python。

    接下来,如果你在运行 Django 之前设置了变量,你的 shell 中仍然需要 export

    export EMAIL_HOST_USER=name@gmail.com
    export EMAIL_HOST_PASSWORD=123456789
    

    如果您想在 Python 中设置环境变量,请将 os.environ 视为一个字典,而不是尝试调用 .set(...)

    import os
    os.environ['EMAIL_HOST_USER'] = 'name@gmail.com'
    os.environ['EMAIL_HOST_PASSWORD'] = 12345678
    

    最后,即使这在您的本地机器上工作,当您部署在具有不同 IP 地址的服务器上时,它也可能停止工作。每周我都会在 Stack Overflow 上看到用户在使用 gmail 从 Django 发送电子邮件时遇到的问题。我通常建议他们考虑使用不同的电子邮件提供商。

    【讨论】:

    • 谢谢阿拉斯代尔,即使我设置了变量,我在运行服务器时也遇到了关键错误。我用过 `os.environ['EMAIL_HOST_USER'] = 'name@gmail.com'
    • 我将代码放在这里 /home/user/.bashrc 并尝试通过创建 .bash_profile 并在其中添加变量。
    • 您不能将 Python 代码放入 .bashrc 文件中。它需要进入一个在加载设置之前加载的 Python 文件,例如在manage.py.
    • 我已经在 seetings.py 中设置了代码(os.environ....),但是我在 .bashrc 中指定了变量
    • 我将打开的环境变量目录保存在另一个终端中,正如你告诉 django 只有在通过 shell 运行时才能使用它。
    【解决方案2】:

    您尝试过decouple 库吗?这是一个很好的例子:https://simpleisbetterthancomplex.com/2015/11/26/package-of-the-week-python-decouple.html

    用法:

    # settings.py
    from decouple import config
    
    EMAIL_HOST_USER = config('EMAIL_HOST_USER')
    

    然后创建一个 .env 文件(如果需要,将其添加到 .gitignore):

    # .env (save in the same folder as manage.py)
    EMAIL_HOST_USER = 'my_email@some_url.some_extension'
    

    【讨论】:

      【解决方案3】:

      又浪费了 2 个小时...您只需要重新启动计算机即可使用您的原始代码

      【讨论】:

      • Just wasted another 2 hours 你的意思是,你尝试了这里发布的所有解决方案都没有成功?然后你确实重启了?因为在那种情况下,这意味着至少有一个解决方案有效,并且重新启动确实激活了它。或者您是说根本不需要这些解决方案?
      • 对,我不需要任何这些解决方案。我的代码与问题中的代码相同,在重新启动后工作。在重新启动之前打印环境变量已经返回了正确的字符串,但由于某种原因,它在尝试重置密码时不起作用。重新启动后,它无需更改代码即可工作。
      猜你喜欢
      • 1970-01-01
      • 2013-05-23
      • 2019-09-03
      • 2016-03-20
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      相关资源
      最近更新 更多