5

システム 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として実行しようとすると、「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')
4

2 に答える 2

4

Celery は、タスクの実行結果には影響しません。タスクを変更した後、celeryd を再起動しましたか? celery が Python コードをリロードすることは重要です。

と を使用していた場合EmailMultiAlternativesemail.attach_alternative(body_html, 'text/html')電子メールは で送信され、Content-Type: multipart/alternative;text/html代替のものであり、レンダリング中にメールのコンテンツ タイプを選択するのはメール受信に依存します。ビュー手続きとセロリ手続きの領収書は同じですか?

送信メールを直接出力しpython -m smtpd -n -c DebuggingServer localhost:25て、実際のメッセージを見つけることができます。redis-backed Celery を使用して Mac でテストしましたが、公式ドキュメントから取得した例の出力は期待どおりです。

于 2012-07-15T06:31:55.600 に答える