2017-09-01 3 views
2

こんにちは、sendmail経由でメールを送信することを延期しようとしています。 メールは問題ありません。 deferred.defer(send_invitation,recipient)を試すとすぐに動作を停止します。Google App Engineがデフォルトのタスクキューにsendmailジョブを延期できず、不正な送信者エラーを受信しました

私が最大にタスクを再試行を見ることができるが制限を許可し、ログが表示さ:これはsendmailのジョブはデフォルトキュー(または任意のキュー)に送信される場合、それはノーであること

File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/mail.py", line 1136, in send 
    raise ERROR_MAP[e.application_error](e.error_detail) 
InvalidSenderError: Unauthorized sender 

意味しています新しい送信者(つまりキュー)が承認されていないことを確認してください。

deferred.deferを使用しないと、プロジェクトオーナーの電子メールとデフォルトのappengineサービスアカウントの両方でメールが送信されます。どちらのアカウントにもアクセス許可/ロールが必要です。

import webapp2 
    from google.appengine.ext import deferred 
    import jinja2 
    import os 
    import datetime 
    from google.appengine.api import users, mail 


    recipient ='[email protected]' 

    user = users.GetCurrentUser().email() 

    print "THIS IS THE CURRENT USER %s" %user 


    def send_invitation(recipient): 
       print "In the def user email is %s" %user 

       mail.send_mail(sender=user,to=recipient, subject='You\'re invited!',body='''You have been invited to join our community...''') 



    class SendInvitationHandler(webapp2.RequestHandler): 
     print "This is user within the class %s" %user 
     def get(self): 
      user = users.GetCurrentUser().email() 
      tempalte_env = jinja2.Environment(loader=jinja2.FileSystemLoader(os.getcwd())) 
      current_time = datetime.datetime.now() 
      template = tempalte_env.get_template('invitation.html') 
      message = "<p>%s, and an invitation to %s has been deferred from %s</p>" % (datetime.datetime.now(),recipient, user) 
      context = {'recipient': recipient, 
         'message': message, 
         'current_time': current_time, 
         'user': user 
         } 
      self.response.out.write(template.render(context)) 

      deferred.defer(send_invitation,recipient) 

app = webapp2.WSGIApplication([('/sendinvite', SendInvitationHandler)], debug=True) 

変更ラインdeferred.defer(send_invitation,recipient)send_invitation(recipient)に、それが動作します...延期タスクが異なる要求に応答して別のハンドラで実行

答えて

1

は、それはもはや元の要求のコンテキストを持っていません。したがって基本的にはuserのセットはありません。

元のコンテキストでメッセージを送信するために必要なすべての情報を収集し、遅延タスクにパラメータとして渡す必要があります。

def send_invitation(recipient, sender): 

    mail.send_mail(sender=sender, to=recipient, 
        subject='You\'re invited!', 
        body='''You have been invited to join our community...''') 

し、それを延期:

​​
+0

関連注記:あなたの特定のケースでは、あなたは、recipientに加えて、だけでなく、このような何かをuserを渡す必要がグローバルがでpythonであなたの友人ではありません特に一般的なものとGAEのものがあります。異なるインスタンスで実行しているときには異なる場合があります。したがって、注意して使用してください(またはすべてを避ける)。 –

+0

上記を試してみて、あなたが辞書を使って編集した提案をお勧めします。しかし悲しいことに違いはありません。同じエラー。 invitation.send_invitation(受取人、ユーザ)は問題ありません...しかし、deffered.defer(受取人、ユーザ)と同じ振る舞い –

+0

変更された 'send_invitation'引数リストに気付いていませんか? 'deferred.defer'には3つのパラメータが必要です.2つではありません。また、以前に遅延されたタスクを削除したことを確認してください。再試行されても失敗することがあります。 –

関連する問題