【问题标题】:Django send_mail() works from shell but not in nginx productionDjango send_mail() 在 shell 中工作,但在 nginx 生产中不工作
【发布时间】:2015-06-25 00:29:56
【问题描述】:

我想从 django 视图发送电子邮件。我让它在我的本地机器上使用 django 开发服务器使用以下设置:

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'user@gmail.com'
EMAIL_HOST_PASSWORD = 'password'
EMAIL_PORT = 587

我的观点有

from django.core.mail import send_mail

def my_view(request):
  send_mail('subject','body','user@gmail.com',['recipient@gmail.com'],fail_silently=False)
  return render(request, 'index.html')

当我在生产服务器上从 manage.py shell 运行 send_mail() 时,电子邮件已成功发送。但是,当在生产中调用视图时(nginx + uwsgi + django),不会发送电子邮件,即使视图运行时没有错误并返回预期的响应。我在 error.log 中没有看到任何错误。

请帮我为 nginx 设置正确的权限和配置,这样才能正常工作。

注意:这个问题类似于Send_mail in Django, works in shell, works locally, not in view,从未解决。

编辑:当我这样做时

sudo -u www-data python manage.py shell

以 nginx 用户运行,我仍然可以成功发送邮件,这让我更加困惑。

【问题讨论】:

  • 在我的情况下,使用 python shell 时电子邮件已成功发送。因此,这不太可能是重复的。我猜是 nginx 权限或配置问题。
  • send_mail 在视图中返回什么?
  • 请注意,您的本地环境设置是否与您的生产设置不同?如果是这样,请更新有差异的答案。
  • 您是否尝试使用电子邮件消息Django Documentation?由于 send_mail 只是电子邮件消息的包装器,请尝试使用它。还要在发送命令中设置fail_silently=False。如果一切都失败了,试试这个link

标签: django email nginx uwsgi


【解决方案1】:

如果在控制台中打印了电子邮件,那么您可能已经设置了

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

打印邮件而不是发送邮件。

如果此行包含在替代(默认)设置文件中,那么您的部署设置可能会以某种方式使用它,而外壳程序继续使用后端设置为的默认设置文件:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

或者根本没有设置,在这种情况下默认值也是smtp

【讨论】:

    猜你喜欢
    • 2012-10-12
    • 1970-01-01
    • 2020-10-27
    • 2021-12-05
    • 2023-03-19
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多