Я собираюсь сделать предположение, основанное на вашем сообщении can't pickle lock objects
, что вы можете использовать pickle
свои объекты с включенным по умолчанию SMTP connection
.
Попробуйте без него - grepping через источник это модуль smtp
, который имеет self._lock
. Перейдите connection=None
к конструктору сообщений.
В Django 1.9, это работает для меня (python2):
from django.core.mail import EmailMessage
from django.core.mail import EmailMultiAlternatives
import pickle
email = EmailMessage(
'Hello',
'Body goes here',
'[email protected]',
['[email protected]', '[email protected]'],
['[email protected]'],
reply_to=['[email protected]'],
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', '[email protected]', '[email protected]'
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
, позже, когда вы звоните 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
сериализации/десериализации ваших объектов, а также по в основном используя __dict__
объекта.
Подробнее о формате JSON:
Как я показал выше, кодирующая __dict__
делает кодирование легко. Вы можете сделать msg.__dict__ = json.load(...)
, но что мешает, должен быть создан объект EmailMessage
, прежде чем вы измените его значения. Таким образом, вы можете инициализировать msg
с EmailMessage
, который имеет значения фиктивных значений, а затем назначить __dict__
или декодировать JSON
и построить объект явно, передав аргументы (... и функции), хранящиеся в JSON, в конструктор. Это требует, чтобы вы знали внутренности.
Я бы пошел с pickle
, хотя есть последствия для безопасности.
This SO question охватывает и другие альтернативы.
Возможный дубликат [моделей Django, сигналов и задержки отправки электронной почты] (http://stackoverflow.com/questions/2349483/django-models-signals-and-email-sending-delay) – Anonymous
Я рассматриваю это как предложение использования django-mailer для реализации дросселирования. Однако сам вопрос сильно отличается. –
Это похоже на работу для сельдерея, но вам все равно понадобится способ сериализации сообщений, если вы не сериализуете на более высоком уровне. – rrauenza