Google AppEngine 无法将发送邮件作业延迟到默认任务队列,收到未经授权的发件人错误
Google AppEngine unable to defer a sendmail job to default taskqueue , receives unauthorized sender error
您好,我正在尝试延迟通过 sendmail 发送邮件。
能发邮件没问题。
我一尝试 deferred.defer(send_invitation,recipient)
,它就停止工作了。
我可以看到任务重试到最大允许限制,并且日志显示:
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 服务帐户。两个帐户都需要 permissions/roles.
import webapp2
from google.appengine.ext import deferred
import jinja2
import os
import datetime
from google.appengine.api import users, mail
recipient ='xxxxxx@xxxx.com'
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)
并且有效...
延迟任务在不同的处理程序上执行以响应不同的请求,它不再具有原始请求的上下文。所以基本上你不再有 user
集。
您需要收集在原始上下文中发送消息所需的所有信息,并将其作为参数传递给延迟任务。在您的特定情况下,除了 recipient
之外,您还需要传递 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...''')
并延迟:
deferred.defer(send_invitation, recipient, user)
您好,我正在尝试延迟通过 sendmail 发送邮件。
能发邮件没问题。
我一尝试 deferred.defer(send_invitation,recipient)
,它就停止工作了。
我可以看到任务重试到最大允许限制,并且日志显示:
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 服务帐户。两个帐户都需要 permissions/roles.
import webapp2
from google.appengine.ext import deferred
import jinja2
import os
import datetime
from google.appengine.api import users, mail
recipient ='xxxxxx@xxxx.com'
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)
并且有效...
延迟任务在不同的处理程序上执行以响应不同的请求,它不再具有原始请求的上下文。所以基本上你不再有 user
集。
您需要收集在原始上下文中发送消息所需的所有信息,并将其作为参数传递给延迟任务。在您的特定情况下,除了 recipient
之外,您还需要传递 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...''')
并延迟:
deferred.defer(send_invitation, recipient, user)