2017-09-01 40 views
2

您好,我试图推迟通过sendmail发送邮件。 能够发送邮件没有问题。 只要我尝试deferred.defer(send_invitation,recipient),它就停止工作。谷歌AppEngine无法推迟sendmail作业默认taskqueue,收到未经授权的发件人错误

我可以看到任务重试最大允许的极限,以及日志显示:

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 

这是否意味着,如果一个sendmail的作业发送到默认队列(或队列),它是没有更长的时间被视为从原始发件人发送,并且新的发件人(即队列)未被授权?

如果没有使用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集。

您需要收集在原始上下文中发送消息所需的所有信息,并将其作为参数传递给延期任务。在您的特定情况下,你需要通过user为好,除了recipient,这样的事情:

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

相关注意事项:全局是不是你在python朋友一般,尤其是GAE - 在不同的实例上运行时可能会有所不同。所以小心使用它们(或者完全避免它们)。 –

+0

尝试了上面的内容,以及使用字典编辑的字典建议。但可悲的是没有区别;同样的错误。 invitation.send_invitation(收件人,用户)正在工作没有概率...但与deffered.defer(收件人,用户)相同的行为 –

+0

您是否注意到修改后的'send_invitation'参数列表?您需要3个参数'deferred.defer',不2.还 - 确保你删除任何以前推迟的任务 - 他们可以重新尝试,他们还是会失败。 –

相关问题