首页 > 解决方案 > Django 是否使用 Mutt 作为其电子邮件后端?

问题描述

我知道你可以使用这个EMAIL_BACKEND设置,我想我已经写了一个工作的 mutt 后端,但我不能将我的设置EMAIL_BACKEND为我的类,因为它显然必须是字符串导入路径,而不是类的名称。本地路径 ( emails) 不起作用,因为当前目录显然不在 Python 导入路径中。而且我不能使用本地包导入(from . import),因为它当然必须是一个简单的字符串。

我通过将我的模块复制到 中来让它工作/usr/local/lib/python3.7/,但这是一个非常糟糕的长期解决方案,甚至不值得。

我的项目目录结构是这样的:django/project/app/,emails.pyapp/, 旁边settings.py等。项目/应用程序结构对我来说没有多大意义(我只有一个应用程序),但我觉得这是设置 Django 的预期方式,所以我这样做了。

它不应该是相关的,但顺便说一句,我的 mutt 后端代码是:

import subprocess
from django.core.mail.backends.base import BaseEmailBackend

class MuttBackend(BaseEmailBackend):
    def send_messages(self, email_messages):
        for m in email_messages: self.send(m)
    def send(self, message):
        print(message.subject, message.from_email, message.to, message.body)
        mutt = subprocess.Popen(args = ['/usr/local/bin/mutt', *message.to,
            '-s', message.subject,
            '-e', f'set from="{message.from_email}"'],
            stdin = subprocess.PIPE)
        mutt.stdin.write(bytes(message.body, 'utf-8'))
        mutt.stdin.close()

如何EMAIL_BACKEND在不使用导入路径的情况下设置类,或找到其他解决方法?我做了一些谷歌搜索,但找不到其他任何人都得到了这样的工作。

标签: pythondjangopython-importmutt

解决方案


我想到了。默认配置假定 uWSGI 正在运行project/,而不是project/app/,所以我需要的导入路径是app.emails.MuttBackend.


推荐阅读