【问题标题】:using task queue to send email使用任务队列发送电子邮件
【发布时间】:2011-07-28 14:07:03
【问题描述】:

我使用 Google 任务队列 Python API 编写了我的第一个代码。每次在地址栏中输入 URL 时,它应该发送一封电子邮件。虽然它在我的仪表板的default 任务队列中显示了一个任务,但我不知道为什么即使在启动一个小时后它也没有执行。

queue-mail.py:-

class sendMail(webapp.RequestHandler):
    def post(self):
        mail.send_mail(
            'X@gmail.com',
        self.request.get('to'),
        self.request.get('subject'),
        self.request.get('body'))


taskqueue.add(url='/sendMail',params=dict(
    to='Y@hotmail.com',
subject = 'Testing task queues',
body = 'this is a message!'))

app.yaml:-

handlers:
 - url: /mail
   script: queue-mail.py

我调用代码为:appid.appspot.com/mail

【问题讨论】:

  • 当我点击立即运行时。它显示一条横幅,说明运行命令已成功发出。但是我还是没有收到邮件。
  • 这是在本地开发服务器还是生产服务器上?你检查你的日志是否有异常?作为注释,我不确定它是否格式错误,但是您的 sendMail 方法上的缩进是错误的,mail.send_mail 应该在 post 下缩进更多
  • 生产服务器。我部署的代码中的缩进是正确的。我在这里写的代码中加入了相同的内容。
  • 您是否为 url /sendMail 定义了一个处理程序?我在你的 app.yaml 中没有看到它。
  • 是的。就目前而言,您的命令 taskqueue.add(url='/sendMail' ... 正在向 url /sendMail 发送请求;如果您的应用程序不知道如何处理该 url,该任务将如何执行?检查您的生产日志是否有异常,这可能很有用。

标签: python google-app-engine task-queue


【解决方案1】:

请阅读文档中关于how to use the webapp framework 的部分。您已经定义了一个处理程序类,但是您还没有为它定义一个 WSGI 应用程序,或者在您的脚本中调用它。因此,您的处理程序代码将永远无法运行。

由于您已将代码放入模块级别将任务排入队列,并且尚未定义 main() 函数,因此每次向模块发送请求时,它都会执行该代码 - 所以您的所有代码确实是将相同的任务排在队列中,一遍又一遍,实际上没有做任何事情。您需要将用于将任务入队的代码与执行任务的代码分开,并将入队代码放在您从不同 URL 调用的另一个处理程序中。

【讨论】:

    【解决方案2】:

    看到你的问题解决了,我想我会发布一个官方答案。 post 有效,而 get 无效,因为这是任务队列的默认方法。如果您查看function documentation,其中一个 kwargs 是方法,您可以在其中指定 get/post/etc,但由于您没有在代码中,它默认为 post。附带说明一下,您可能没有看到 404 表示缺少处理程序,而是看到 405 表示“方法不允许”(因为任务队列试图将发布请求发送到没有发布功能的处理程序定义)

    【讨论】:

    • 为什么 self.response.get 即使在 post 方法中也能工作。这是两个独立的东西吗?有没有办法查看实时日志。我猜他们大约延迟了半个小时。
    • 你的意思是self.request.getget 函数不引用 http 方法,它只是用于检索值的通用 python 事物。 self.request.get(x, None) 很有用,如果 x 不存在(或您想要的其他默认值),它将返回 None 。控制台上的日志是实时的;他们根本没有“延迟”或任何事情。
    【解决方案3】:

    我认为send_mail 将任务发送到邮件服务,该服务将发送电子邮件的任务排队。因此我不确定taskqueue.add() 是否会比send_mail() 快。 (假设您的电子邮件任务不执行任何 RPC 调用等)。

    【讨论】:

      猜你喜欢
      • 2022-08-13
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2014-08-03
      • 2021-06-26
      • 2019-01-16
      相关资源
      最近更新 更多