如何通过 Celery 发送 HTML 电子邮件?它不断发送文本/纯文本
Posted
技术标签:
【中文标题】如何通过 Celery 发送 HTML 电子邮件?它不断发送文本/纯文本【英文标题】:How can I send HTML email via Celery? It keeps sending in text/plain 【发布时间】:2012-07-14 09:33:35 【问题描述】:我设置了一个系统 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 任务运行时,如下所示,它只是作为“文本/纯文本”发送。可能是什么问题呢?或者我可以做些什么来了解更多信息?非常感谢任何提示或解决方案。
@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】:Celery 不影响任务的执行结果。更改任务后您是否重新启动了celeryd? celery 重新加载 Python 代码很重要。
当您使用EmailMultiAlternatives
和email.attach_alternative(body_html, 'text/html')
时,邮件是在Content-Type: multipart/alternative;
中发送的,text/html
是另一种,在渲染过程中根据邮件回执来选择邮件的内容类型.那么查看程序和 celery 程序之间的收据是否相同?
您可以直接输出发送邮件,通过python -m smtpd -n -c DebuggingServer localhost:25
查看实际邮件。我已经在我的带有 redis 支持的 Celery 的 mac 上进行了测试,来自the official doc 的示例的输出与预期的相同。
【讨论】:
【参考方案2】: from django.core import mail
from django.template.loader import render_to_string
from django.utils.html import strip_tags
class SendEmail(Task):
name="send_email"
def run(self,email):
subject = 'Daily News Letter'
html_message = render_to_string('letter.html', 'context': 'values')
plain_message = strip_tags(html_message)
from_email = env('EMAIL_HOST_USER')
mail.send_mail(subject, plain_message, from_email, [email], html_message=html_message)
return None
send_email = celery_app.register_task(SendEmail())
【讨论】:
请解释您的解决方案。没有解释且只有代码的答案会被标记为低工作量。 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。以上是关于如何通过 Celery 发送 HTML 电子邮件?它不断发送文本/纯文本的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Django 项目中将请求传递给 Celery 任务参数?