如何通过Celery发送HTML电子邮件?它一直以文本/普通方式发送

时间:2012-07-15 02:54:17

标签: python django redis celery django-celery

我设置了一个Django / Celery / Redis系统。我使用EmailMultiAlternatives发送我的HTML和文本电子邮件。

当我在请求过程中发送电子邮件时,电子邮件将以HTML格式发送。一切运行良好,它包含一个功能。这是代码:

def send_email(email, email_context={}, subject_template='', body_text_template='',
    body_html_template='', from_email=settings.DEFAULT_FROM_EMAIL):

    # render content
    subject = render_to_string([subject_template], context).replace('\n', ' ')
    body_text = render_to_string([body_text_template], context)
    body_html = render_to_string([body_html_template], context)

    # send email
    email = EmailMultiAlternatives(subject, body_text, from_email, [email])
    email.attach_alternative(body_html, 'text/html')
    email.send()

但是,当我尝试将其作为Celery任务运行时,如下所示,它只是作为“text / plain”发送。可能是什么问题呢?或者我该怎么做才能找到更多?非常感谢任何提示或解决方案。

@task(name='tasks.email_features', ignore_result=True)
def email_features(user):
    email.send_email(user.email,
        email_context={'user': user},
        subject_template='emails/features_subject.txt',
        body_text_template='emails/features_body.txt',
        body_html_template='emails/features_body.html')

1 个答案:

答案 0 :(得分:4)

Celery不会影响任务的执行结果。在更改任务后你重启了芹菜吗?芹菜重新加载Python代码很重要。

当您使用EmailMultiAlternativesemail.attach_alternative(body_html, 'text/html')时,电子邮件是在Content-Type: multipart/alternative;中发送的,而text/html是另一种电子邮件,它取决于邮件收据来选择呈现期间邮件的内容类型。那么查看程序和芹菜程序之间的收据是一样的吗?

您可以直接通过python -m smtpd -n -c DebuggingServer localhost:25输出发送邮件,以查找实际邮件。我已经在我的mac / redis支持的Celery上进行了测试,从the official doc获取的示例的输出与预期相同。