Django 邮件未保存(文件后端)

Django mails not being saved (File backend)

我已将 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,
        },
    },
}

日志似乎工作正常并提供详细的日志记录;但其中 none 与电子邮件错误有关。

因为没有错误,目录存在并且在您指定的目录中仍然没有创建文件,所以代码运行并创建文件可能是在不同的目录中。

您在创建连接时设置的 file_path 关键字是什么?

File backend

The file backend writes emails to a file. A new file is created for each new session that is opened on this backend. The directory to which the files are written is either taken from the EMAIL_FILE_PATH setting or from the file_path keyword when creating a connection with get_connection().

To specify this backend, put the following in your settings:

EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH = '/tmp/app-messages' # change this to a proper location

Django Docs File Backend

正如您在代码中看到的那样,有很多加注: https://github.com/django/django/blob/stable/2.1.x/django/core/mail/backends/filebased.py#L13

因此,如果使用您的设置和对文件夹的正确权限,您无法看到电子邮件或出现错误,可能是某些设置覆盖了您在此处发布的两个设置。

再次检查您的本地设置,确保只声明了一个 EMAIL_BACKEND。

我自己花了一些时间在这上面,经过一些挫折,我只是交换了两个变量,它起作用了。

EMAIL_FILE_PATH = '/code/mails/'
EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'

好像EMAIL_FILE_PATH指的是绝对路径。 对我来说,这个解决方案有效:

EMAIL_FILE_PATH = os.path.join(BASE_DIR, 'app/emailfolder')

我在尝试使身份验证正常工作时遇到了这个问题,特别是 密码重置。我花了几个小时才发现我用于重置的电子邮件地址对于我的数据库中的任何用户都不存在,当然 Django 对此保持沉默是一种很好的安全措施。愚蠢的错误,但我希望有人发布过它,所以在这里。