Django将电子邮件持久化到数据库以便稍后发送?

2024-06-01 10:41:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我以为这会像存储“收件人、发件人、主题、正文”一样简单,但后来我发现其中有附件、多部分电子邮件等,至少有两个类EmailMessage和{}。。。变量和选项太多了!在

我考虑过用message()方法存储收到的原始电子邮件,但不确定如何构造回电子邮件。也尝试了pickle,但得到了{}。在

有什么想法吗?在


Tags: 项目django方法用户数据库message主题附件
1条回答
网友
1楼 · 发布于 2024-06-01 10:41:23

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

试着不使用它-通过源代码-它是smtp模块,它有一个self._lock。将connection=None传递给消息的构造函数。在

在django1.9上,这对我很有用(Python2):

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))

根据messages.py中的Django代码,稍后当您调用send()时,如果EmailMessage.connectionNone,那么它将尝试使用get_connection()fromdjango.core.mail来获取默认连接。在

……或者,如果您想使用json,这也适用于connection=None

^{pr2}$

这意味着您可以相当容易地编写一个JSONEncoderJSONDecoder来序列化/反序列化对象,基本上是使用对象的__dict__。在

更多JSON:

如上所述,编码__dict__使编码变得简单。{{cd19>你必须改变它的值。因此,您可以使用具有伪值的msg初始化EmailMessage,然后分配{},或者解码{},并通过将JSON中存储的参数(…和函数)传递给构造函数显式地构造对象。不过,这需要您了解内部情况。在

我将使用pickle,尽管存在安全隐患。在

This SO question还包括其他一些替代方案。在

相关问题 更多 >