在Google App Engine for Python中,如何在同一天不同时间发送电子邮件?

在Google App Engine for Python中,如何在同一天不同时间发送电子邮件?,python,google-app-engine,cron-task,Python,Google App Engine,Cron Task,我使用cron任务在每周六9:00向我的应用程序用户发送邮件。但是如果有很多用户,这是一个问题吗?如果是,我可以做些什么来改进我的代码。我是否可以指定一个cron任务,如“从9:00到23:00”,以确保所有用户都收到电子邮件?我听说过任务队列,但我不知道如何使用它。我真的需要它吗 编辑 我最终成功地使用这段代码使任务队列工作 class SendMailHandler(webapp.RequestHandler): def get(self): members = Me

我使用cron任务在每周六9:00向我的应用程序用户发送邮件。但是如果有很多用户,这是一个问题吗?如果是,我可以做些什么来改进我的代码。我是否可以指定一个cron任务,如“从9:00到23:00”,以确保所有用户都收到电子邮件?我听说过任务队列,但我不知道如何使用它。我真的需要它吗

编辑

我最终成功地使用这段代码使任务队列工作

class SendMailHandler(webapp.RequestHandler):
    def get(self):
        members = Members.all()
        for member in members:
            taskqueue.add(url='/send', params={'sender_address':sender_address,
                                                   'user_address':user_address,
                                                   'subject':subject,
                                                   'html':html})

class SendMail(webapp.RequestHandler):
    def post(self):
        sender_address = self.request.get('sender_address')
        user_address = self.request.get('user_address')
        subject = self.request.get('subject')
        html = self.request.get('html')

        mail.send_mail(sender=sender_address, to=user_address, subject=subject, body='', html=html)

application = webapp.WSGIApplication([('/sendmail', SendMailHandler),
                                  ('/send', SendMail)], debug=True)

App Engine cron任务与App Engine中的其他任务一样,有10分钟的时间完成。如果您需要更多的时间,您可以使用一个或您可以在任务队列中将发送分成多个块

编辑:以下是任务队列的文档:

如果我要写这段代码(出于Nick详述的原因,我不会写),我会做的是决定某种切分。假设您在“成员”数据库模型中有一个“收件人”字段:创建26个任务,其中一个任务将处理所有以“a”、“b”等开头的电子邮件地址


您可能会发现,特定的方案导致了一个粗糙的分布——可能一个任务完成了50%的工作,因为出于某种原因,您的大多数用户都有一个以“m”开头的电子邮件地址。如果发生这种情况,您可以改为基于“to”地址的散列进行切分。关键是以某种方式将您的成员分解,并启动一个任务来处理每个区块,并将区块的某个标识符作为任务的参数。正如俗话所说,编写代码和优化切分留给读者作为练习。(当然,如果您有关于实现的具体问题,请询问!)

App Engine cron任务与App Engine中的其他任务一样,有10分钟的时间完成。如果您需要更多的时间,您可以使用一个或您可以在任务队列中将发送分成多个块

编辑:以下是任务队列的文档:

如果我要写这段代码(出于Nick详述的原因,我不会写),我会做的是决定某种切分。假设您在“成员”数据库模型中有一个“收件人”字段:创建26个任务,其中一个任务将处理所有以“a”、“b”等开头的电子邮件地址


您可能会发现,特定的方案导致了一个粗糙的分布——可能一个任务完成了50%的工作,因为出于某种原因,您的大多数用户都有一个以“m”开头的电子邮件地址。如果发生这种情况,您可以改为基于“to”地址的散列进行切分。关键是以某种方式将您的成员分解,并启动一个任务来处理每个区块,并将区块的某个标识符作为任务的参数。正如俗话所说,编写代码和优化切分留给读者作为练习。(当然,如果您有关于实施的具体问题,请提问!)

我实际上就是有这个问题。我从来没有对stackoverflow承诺过一个答案,所以请友善一点

我所做的实际上是使用cron作业(计划在东部时间凌晨3:30)启动任务,进入任务队列。在此基础上,作为创建任务的一部分,添加一个ETA。这接受python日期时间值。从这里,您可以通过逻辑判断是否需要立即运行任务,或者是否需要根据时区计算新的ETA,等等

这是我正在做的一堆代码。这段代码是从我的Cron处理程序执行的。然后我会发送一封类似于你的电子邮件。注意,我将时区信息存储在dic中,并将其与从存储数据中获取的信息进行比较。这在将来可能不是超级灵活的,但现在它适合我需要做的事情。如果你有其他的方法来获取这些信息,你可以用不同的方法

bigtimezonedic = {'America/New_York' : 0, 'America/Detroit' : 0, 'America/Kentucky/Louisville' : : 0, 'America/Kentucky/Monticello' : 0, 'America/Indiana/Indianapolis' : 0, 'America/Indiana    /Vincennes' : 0, 'America/Indiana/Winamac' : 0, 'America/Indiana/Marengo' : 0, 'America/Indiana/Petersburg' : 0, 'America/Indiana/Vevay' : 0, 'America/Chicago' : 1, 'America/Indiana/Tell_City' : 1, 'America/Indiana/Knox': 1, 'America/Menominee' : 1, 'America/North_Dakota/Center' : 1, 'America/North_Dakota/New_Salem' : 1, 'America/Denver' : 2, 'America/Boise' : 2, 'America/Shiprock' : 2, 'America/Phoenix' : 2, 'America/Los_Angeles' : 3, 'America/Anchorage' : 4, 'America/Juneau' : 4, 'America/Yakutat' : 4, 'America/Nome' : 4, 'America/Adak' : 5, 'Pacific/Honolulu' : 5}

calendar_list = calendarHTML.all()
    for calendar in calendar_list:
         if bigtimezonedic.has_key(calendar.calendarTimeZone):
             if bigtimezonedic[calendar.calendarTimeZone] == 0:
                taskqueue.add(url='/emailsender',
                        params=dict(calendaruserid=calendar.userid,
                            calendarid=calendar.calendarId))
             else:
                taskqueue.add(url='/emailsender',
                        params=dict(calendaruserid=calendar.userid,
                            calendarid=calendar.calendarId),
                     eta=datetime.datetime.now() +
                     datetime.timedelta(hours=bigtimezonedic[calendar.calendarTimeZone]))
         else:
            logging.info('There is an unsupported timezone!')

事实上,我就是有这个问题。我从来没有对stackoverflow承诺过一个答案,所以请友善一点

我所做的实际上是使用cron作业(计划在东部时间凌晨3:30)启动任务,进入任务队列。在此基础上,作为创建任务的一部分,添加一个ETA。这接受python日期时间值。从这里,您可以通过逻辑判断是否需要立即运行任务,或者是否需要根据时区计算新的ETA,等等

这是我正在做的一堆代码。这段代码是从我的Cron处理程序执行的。然后我会发送一封类似于你的电子邮件。注意,我将时区信息存储在dic中,并将其与从存储数据中获取的信息进行比较。这在将来可能不是超级灵活的,但现在它适合我需要做的事情。如果你有其他的方法来获取这些信息,你可以用不同的方法

bigtimezonedic = {'America/New_York' : 0, 'America/Detroit' : 0, 'America/Kentucky/Louisville' : : 0, 'America/Kentucky/Monticello' : 0, 'America/Indiana/Indianapolis' : 0, 'America/Indiana    /Vincennes' : 0, 'America/Indiana/Winamac' : 0, 'America/Indiana/Marengo' : 0, 'America/Indiana/Petersburg' : 0, 'America/Indiana/Vevay' : 0, 'America/Chicago' : 1, 'America/Indiana/Tell_City' : 1, 'America/Indiana/Knox': 1, 'America/Menominee' : 1, 'America/North_Dakota/Center' : 1, 'America/North_Dakota/New_Salem' : 1, 'America/Denver' : 2, 'America/Boise' : 2, 'America/Shiprock' : 2, 'America/Phoenix' : 2, 'America/Los_Angeles' : 3, 'America/Anchorage' : 4, 'America/Juneau' : 4, 'America/Yakutat' : 4, 'America/Nome' : 4, 'America/Adak' : 5, 'Pacific/Honolulu' : 5}

calendar_list = calendarHTML.all()
    for calendar in calendar_list:
         if bigtimezonedic.has_key(calendar.calendarTimeZone):
             if bigtimezonedic[calendar.calendarTimeZone] == 0:
                taskqueue.add(url='/emailsender',
                        params=dict(calendaruserid=calendar.userid,
                            calendarid=calendar.calendarId))
             else:
                taskqueue.add(url='/emailsender',
                        params=dict(calendaruserid=calendar.userid,
                            calendarid=calendar.calendarId),
                     eta=datetime.datetime.now() +
                     datetime.timedelta(hours=bigtimezonedic[calendar.calendarTimeZone]))
         else:
            logging.info('There is an unsupported timezone!')

你能给我一个基于我代码的任务队列代码示例吗?@IsmaelToé你读过任务队列上的文档了吗?它有几个优秀的入门示例。我们不是你的研究助理或你的代码猴子-在寻求帮助之前,你需要花一些时间来尝试。你能给我一个基于我的代码的任务队列代码示例吗?@IsmaelToé你看过任务队列上的文档了吗?它有几个优秀的入门示例。我们不是你的研究助理,也不是你的代码猴子——我们希望你在寻求帮助之前花点时间尝试一下。