使用任务队列发送邮件

0 投票
3 回答
2260 浏览
提问于 2025-04-16 22:26

我用Google任务队列的Python接口写了我的第一段代码。这个代码应该是在每次输入网址到地址栏时发送一封邮件。虽然在我的仪表盘上显示有一个任务在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

3 个回答

0

我觉得 send_mail 这个函数是把发送邮件的任务交给邮件服务,然后邮件服务会把这个任务放到一个队列里去处理。所以我不太确定 taskqueue.add() 会不会比 send_mail() 更快。(假设你的发送邮件任务没有做其他的远程调用之类的事情)。

3

请查看文档中关于如何使用webapp框架的部分。你已经定义了一个处理器类,但还没有为它定义一个WSGI应用,也没有在你的脚本中调用它。因此,你的处理器代码根本不会被执行。

因为你把任务添加到队列的代码放在了模块的顶层,并且没有定义一个main()函数,所以每次有请求发送到这个模块时,它都会执行那段代码——这样你的代码只是不断地添加相同的任务到队列,而没有真正执行任何操作。你需要把添加任务到队列的代码和执行任务的代码分开,并把添加任务的代码放在另一个处理器中,通过不同的URL来调用它。

1

既然你的问题已经解决了,我就来给大家写个官方的回答。post能用,而get不行,是因为任务队列默认使用的是post方法。如果你查看一下这个函数的文档,你会发现有一个叫做method的参数,你可以在这里指定使用getpost等方法,但因为你在代码中没有指定,所以它默认用了post。另外,你可能没有看到404错误(表示找不到处理程序),而是看到了405错误(表示“方法不被允许”),这是因为任务队列试图向一个没有定义post函数的处理程序发送post请求。

撰写回答