EmailMultiAlternatives 的 Celery 错误

Posted

技术标签:

【中文标题】EmailMultiAlternatives 的 Celery 错误【英文标题】:Celery Error with EmailMultiAlternatives 【发布时间】:2014-02-24 18:33:14 【问题描述】:

我在EmailMultiAlternatives 周围有一个包装器,使界面更简洁(几乎逐字逐句取自here):

class Email(object):
    '''
    Wrapper around the Django core's EmailMultiAlternatives that makes it simpler
    to render txt and html templates.
    '''

    def __init__(self, to, subject):
        self.to = to
        self.subject = subject
        self.html = None
        self.text = None

    def _render(self, template, context):
        return render_to_string(template, context)

    def render_html(self, template, context):
        self.html = self._render(template, context)

    def render_text(self, template, context):
        self.text = self._render(template, context)

    def send(self, from_addr=None, fail_silently=False):
        if isinstance(self.to, basestring):
            self.to = [self.to]
        if not from_addr:
            from_addr = settings.EMAIL_HOST_USER
        msg = EmailMultiAlternatives(
            self.subject,
            self.text,
            from_addr,
            self.to
        )
        if self.html:
            msg.attach_alternative(self.html, 'text/html')
        msg.send(fail_silently)

我这样称呼它:

   if not self.email:
        warnings.warn('uid:%s has no email address' % self.id)
    else:
        context = Context(
            'first_name': self.first_name,
            'uid': int_to_base36(self.id),
            'token': default_token_generator.make_token(self),
            'domain': Site.objects.get_current().domain
        )

        from_email = settings.EMAIL_HOST_USER
        subject = "Password Reset"
        email = Email(to=self.email, subject=subject)
        email.render_text('email/reset_password_email.txt', context)
        email.render_html('email/reset_password_email.html', context)
        email.send()

我正在使用 django-celery-email,它只是为 Django 的内置发送电子邮件功能提供了一个包装器,以将其转换为 celery worker 任务。但是,当我尝试运行代码时,出现以下错误:

TypeError: <django.core.mail.message.EmailMultiAlternatives object at 0x10c20f3d0> is not JSON serializable

这发生在创建 celery 任务的上下文中。我不确定这里发生了什么。当我不使用 EmailMultiAlternatives 并仅使用 Django 内置的 send_mail (它也被 django-celery-email 包装为 celery 任务)时,我没有收到错误消息。想法?

【问题讨论】:

这应该适用于酸洗而不是 JSON 序列化。 Celery 正在尝试序列化您的任务。查看文档:celery.readthedocs.org/en/latest/userguide/… 【参考方案1】:

您是否尝试从EmailMultiAlternatives 继承您的Email 类?通过这样做,您仍然可以实现用于 celery 的方法。

【讨论】:

以上是关于EmailMultiAlternatives 的 Celery 错误的主要内容,如果未能解决你的问题,请参考以下文章

将标头添加到 Django EmailMultiAlternatives

在mail_admins()中发送EmailMultiAlternatives

如何在 Django 中为 EmailMultiAlternatives 自定义电子邮件后端

将多个收件人电子邮件和姓名附加到 EmailMultiAlternatives

python + django+ EmailMultiAlternatives Template'对象没有属性'encode

DJango 邮件在本地工作但不在生产中