一个电子邮件模板是建立和发送每周超过2000个电子邮件收件人(密件)。我必须把它作为后台运行,因为它需要几分钟才能得到渲染回来,一些电子邮件提供商阻止发件人,因为在几段时间内大量的邮件。由于合同原因,我不能使用SendinBlue或MailChimp或任何其他工具。
我使用'django.core.mail.EmailMultiAlternatives'实例,以便添加图像'(self.attach(img)'和文档'(self.attach_file(filepath)'。创建后的所有上下文数据,如<img src="cid:filename.jpg"
。我使用render_to_string(template_name, request=request, context=context).strip()
来返回我填好的HTML电子邮件模板。
后台运行async_taskDjango-Q
当我通过我的EmailMultiAlternatives
实例时,我得到错误:
Traceback (most recent call last):
File ".pyenv/versions/3.9.7/lib/python3.9/multiprocessing/queues.py", line 245, in _feed
obj = _ForkingPickler.dumps(obj)
File ".pyenv/versions/3.9.7/lib/python3.9/multiprocessing/reduction.py", line 51, in dumps
cls(buf, protocol).dump(obj)
TypeError: cannot pickle '_thread.RLock' object
如果我在任务中构建我的实例模板(但具有代码冗余),它可以工作,但由于我想循环我的2000个收件人以每n分钟99块发送邮件(避免邮件服务器阻塞),再次,我需要传递EmailMultiAlternatives instance
作为参数,我得到相同的错误。
你知道该怎么做吗?
解决方案如下:https://github.com/joeyespo/django-q-email。非常感谢乔·埃斯波西托和安基特!
如配置部分所述:DJANGO_Q_EMAIL_USE_DICTS
-存储Python字典而不是pickleEmailMessage
和EmailMultiAlternatives
(默认值:True)