在我的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()
。
有什么想法吗?
答案 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也涵盖了其他一些替代方案。