2013-07-03 9 views
8

非同期の電子メール送信の問題を解決しています。私はバックエンドとしてセロリとdjangoデータベースを使用したいと思います。今のところ私がこのキュー管理ツールを使用したいのは、電子メールだけですから、私はdjango-celery-emailもインストールしました。私は、このような設定で、デフォルトのDjangoのSMTPを使用していdjango-celery-emailタスクが実行されていません

import djcelery 
djcelery.setup_loader() 

INSTALLED_APPS += ('kombu.transport.django', 
        'djcelery', 
        'djcelery_email') 

BROKER_URL = 'django://' 
EMAIL_BACKEND = 'djcelery_email.backends.CeleryEmailBackend' 

EMAIL_USE_TLS = True 
EMAIL_HOST = 'smtp.gmail.com' 
EMAIL_HOST_USER = 'cs*****@gmail.com' 
EMAIL_HOST_PASSWORD = '*********' 
EMAIL_PORT = 587 

私は両方のための移行を実行した命令の後、私は私の設定ファイルに、このような更新を行いました

djcelerykombyアプリそして、デフォルトのdjango send_mailコアメソッドを使用すると、電子メールは送信されません。

EMAIL_BACKENDオプションを削除すると、メールが送信されますが、大変遅くなります。高速ではないにしても、私はこのプロセスを最初に待ち行列に入れることはしません。

MySQLデータベースをデータベースのバックエンドとして使用していますが、エラーログファイルにはタスクを追加する際に何も表示されませんでしたので、その部分は問題ありません。経験豊かなセロリやdjceleryのユーザーが簡単に見つけられる基本的なインストールや設定の一部を見逃してしまったようですが、私のような初心者が逃した可能性があります。

UPDATE Djangoのシェル回避策:待機中の5分後に

>>> from django.core.mail import send_mail 
>>> from django.conf import settings 
>>> result = send_mail('test send', 'test_send_body_text', settings.EMAIL_HOST_USER, '[email protected]') 
>>> result[0].status 
u'PENDING' 
>>> result[0].ready() 
False 
>>> result[0].failed() 
False 
>>> result[0].info 
>>> result[0].result 

(送信セロリの電子メールなしでは、通常約10〜15秒かかります)、私はまだ取得:

>>> result[0].status 
u'PENDING' 

と最後のチェックから15分後(20件):

>>> result[0].status 
u'PENDING' 

だから誰も私にこの問題を助けることができますか?私はそれが単純なものだと強く信じています。

よろしくお願いします。Sergey Aganezov。

+0

現在のバックエンドでセロリなしでメールが送信されますか? –

+0

うーん、正しく理解しているかどうかわからない。私が '' settings''ファイルに '' EMAIL_BACKEND''行をコメントすると、電子メールの送信はうまくいきますが、そのような表示要求を処理するのに多くの時間がかかります... –

+0

また、この問題に遭遇しました。 0rc3とdjango-celery-email 1.1.4。 send_mailを呼び出すと、(RabbitMQ Web Adminインターフェイスを使用して)AMQPメッセージが送信されることが確認されたと思いますが、未知の理由でワーカーが受信していないようです(AMQPメッセージはキューに残ります)。私はタスクが正しく登録され、送信者とワーカーが両方とも同じブローカと話していることを確認しました。さらにデバッグする方法がわからない。 –

答えて

4

シェルを開こうとすると、djceleryメールバックエンドで電子メールを送信して、resultを調べてみてください。

標準的なセロリーAsyncResultで、何が起きているのかを詳しく知ることができます。

通常保留状態が知られて実行かを待っているタスクのためです:EDITドキュメントから

results will be a list of celery AsyncResult objects that you may ignore, or use to check the status of the email delivery task, or even wait for it to complete if want. You have to enable a result backend and set ignore_result to False in CELERY_EMAIL_TASK_CONFIG if you want to use these. See the Celery docs for more info.

を引用する

Task is waiting for execution or unknown. Any task id that is not known is implied to be in the pending state

./manage.py celeryd -B 

通常セロリは、それがエラーをスローしますが、労働者がそれをACKSまで、タスクが保留のままバックエンドにタスクを送信することができない場合:

二重のは、あなたの労働者を開始しました確認してください。

+0

も参照してくださいhttps://github.com/celery/celery/issues/1150、関連性があります – DRC

+0

私はあなたが話しているのを見ます。私は情報フォームdjango-shellで質問を更新しました。 –

+0

あなたはあなたの労働者を始めましたか? :) – DRC

0

あなたの質問に私のコメントで述べたのと同様の問題がありました。私の場合、タスクは、ワーカーが聞いていたキューとは別のキューに送信していました。デフォルトでは、ワーカーはceleryキューをリッスンしますが、 '-Q'オプションを使用して変更できます。タスクは、デフォルトではceleryキューにも送信されますが、CELERY_EMAIL_TASK_CONFIGの 'queue'オプションを別のものに設定しています。環境変数KOMBU_LOG_DEBUG=1を設定し、manage.pyシェルから電子メールを送信しようとすると、タスクが送信しているキューをデバッグすることができます。私は 'キュー'の設定を削除し、電子メールが動作するようになった。同じ問題が発生しているかどうかはわかりませんが、うまくいけばデバッグに役立ちます。

関連する問題