我已将 Django 配置为使用 file backend 在我的本地计算机上发送电子邮件。这似乎之前工作正常,所有邮件都记录在我在
settings.py
文件中指定的目录中:
EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH = '/code/mails/'
然而,这突然不起作用了。我检查了该文件夹的权限,这似乎没问题。我看不到任何错误。我正在使用 docker,当我启动 Python 服务器时,我的终端中会显示日志。通常,当出现错误时我会在那里看到它。但什么也没有出现。为了进行测试,我已重命名该文件夹并尝试发送邮件。这次也没有出现错误。在生产中,我的
settings.py
不同,但其他一切都相同,电子邮件发送得很好。所以代码似乎可以工作,但是基于本地文件的后端似乎是一个问题。
有人有什么想法吗?
我已经配置了这些日志设置:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': '/code/logs/debug.log',
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'DEBUG',
'propagate': True,
},
},
}
日志似乎工作正常并提供详细的日志记录;但这些都与电子邮件错误无关。
正如您在代码中看到的,有很多加薪: https://github.com/django/django/blob/stable/2.1.x/django/core/mail/backends/filebased.py#L13
因此,如果使用您的设置以及文件夹的正确权限,您看不到电子邮件或错误,则可能有一些设置会覆盖您在此处发布的两个设置。
再次检查您的本地设置,并确保只声明了一个 EMAIL_BACKEND。
我在尝试进行身份验证时遇到了这个问题,特别是密码重置。我花了几个小时才发现我用于重置的电子邮件地址对于我的数据库中的任何用户来说都不存在,当然,Django对此保持沉默是很好的安全性。愚蠢的错误,但我希望有人发布过它,所以就在这里。
因为没有错误,目录存在,并且在您指定的目录中仍然没有创建文件,所以代码可能运行并创建文件,但在不同的目录中。
创建连接时您设置的
file_path
关键字是什么?
文件后端
文件后端将电子邮件写入文件。创建一个新文件 在此后端打开的每个新会话。目录到 写入的文件取自 EMAIL_FILE_PATH 创建连接时设置或来自 file_path 关键字 get_connection().
要指定此后端,请将以下内容放入您的设置中:
EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH = '/tmp/app-messages' # change this to a proper location
看来EMAIL_FILE_PATH指的是绝对路径。 对我来说这个解决方案有效:
EMAIL_FILE_PATH = os.path.join(BASE_DIR, 'app/emailfolder')
这个问题对我来说已经解决了
EMAIL_BACKEND = "django.core.mail.backends.filebased.EmailBackend"
EMAIL_FILE_PATH = BASE_DIR / "app/emailfolder"
我自己花了一些时间在这上面,经过一些挫折后,我只是交换了两个变量,它起作用了。
EMAIL_FILE_PATH = '/code/mails/'
EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'