我设置了一个系统Django/Celery/Redis。我使用EmailMultiAlternatives发送HTML和Text电子邮件。
当我在请求过程中发送电子邮件时,电子邮件是以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运行时,就像下面一样,它只是以"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')
芹菜不会影响任务的执行结果。更改任务后,您是否重新启动了celeryd?芹菜重新加载Python代码非常重要。
当您使用EmailMultiAlternatives
和email.attach_alternative(body_html, 'text/html')
时,电子邮件是在Content-Type: multipart/alternative;
中发送的,而text/html
是一个备选方案,在呈现过程中选择邮件的内容类型取决于邮件收据。那么,查看程序和芹菜程序之间的收据是相同的吗?
您可以直接输出发送邮件,通过python -m smtpd -n -c DebuggingServer localhost:25
来查找实际消息。我已经在我的macw/redis支持的Celery上进行了测试,从官方文档中获得的示例的输出与预期相同。
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())