django - 将电子邮件持久保存到数据库以便以后发送?

时间:2016-06-17 21:34:54

标签: python django email django-email

在我的django项目中,我想在数据库中存储一封电子邮件,以便以后能够检索并发送它。我正在实施一种限制机制,用于向许多用户发送电子邮件。

我认为这就像存储'来自,主体,身体'一样简单但是我意识到有附件,多部分电子邮件等,至少有两个类>>> list = [] >>> class ListClass(list): ... pass ... Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: list() takes at most 1 argument (3 given) 和{{1} } ......变量和选项太多了!

我想过使用EmailMessage方法存储原始电子邮件,但后来又不确定如何构建电子邮件。还尝试了EmailMultiAlternatives,但获得了message()

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我将根据您的can't pickle lock objects消息进行猜测,您可能尝试使用默认的SMTP pickle connection您的对象。

在没有它的情况下尝试 - 在源代码中点击它是具有smtp的{​​{1}}模块。将self._lock传递给消息的构造函数。

在Django 1.9上,这对我有用(Python2):

connection=None

根据from django.core.mail import EmailMessage from django.core.mail import EmailMultiAlternatives import pickle email = EmailMessage( 'Hello', 'Body goes here', 'from@example.com', ['to1@example.com', 'to2@example.com'], ['bcc@example.com'], reply_to=['another@example.com'], headers={'Message-ID': 'foo'}, connection=None, ) email.attach("foo", [l for l in open(__file__)], 'text') print len(pickle.dumps(email)) subject, from_email, to = 'hello', 'from@example.com', 'to@example.com' text_content = 'This is an important message.' html_content = '<p>This is an <strong>important</strong> message.</p>' msg = EmailMultiAlternatives(subject, text_content, from_email, [to], connection=None) msg.attach_alternative(html_content, "text/html") print len(pickle.dumps(msg)) 中的Django代码,稍后当您致电messages.py时,如果send(),它会尝试使用get_connection()中的django.core.mail来获取您的默认连接}是EmailMessage.connection

....或者,如果您想使用None,这也适用于json

connection=None

这意味着您可以非常轻松地编写import json print json.dumps(msg.__dict__) print json.dumps(email.__dict__) JSONEncoder来序列化/反序列化您的对象,基本上使用对象的JSONDecoder

有关JSON的更多信息:

如上所示,对__dict__进行编码可以简化编码。您可以执行__dict__,但是在更改其值之前必须创建msg.__dict__ = json.load(...)对象的难度。因此,您可以使用具有虚拟值的EmailMessage初始化msg,然后分配EmailMessage,或解码__dict__并通过传递参数显式构造对象(。 ..和函数)存储在JSON中的构造函数。这需要你知道内部结构。

我会选择JSON,但会产生安全隐患。

This SO question也涵盖了其他一些替代方案。