谷歌应用引擎python超时发送邮件



我的脚本抓取rss页面的内容,获取该页中的url,将它们保存到一个列表中,然后它抓取每个url的内容,并将页面的内容通过电子邮件发送给我。一切都工作得很好,接受我不能发送列表中的每个链接。列表中通常有22个链接。我不想将多个链接的内容合并到一封电子邮件中。如果我不添加超时,我会得到一个超过配额的错误,像这样

<class 'google.appengine.runtime.apiproxy_errors.OverQuotaError'>: The API call mail.Send() required more quota than is available. 

在我添加了"time.sleep(9)"来减慢它之后,它给了我这个错误。

<class 'google.appengine.runtime.DeadlineExceededError'>: 
Traceback (most recent call last):

这是我的代码。任何想法吗?

size = len(my_tabletest)
a=2 
while a < size:
  url = my_tabletest[a].split('html</link>')[0] + "print"
  url_hhhhhh = urlfetch.fetch(url)
  my_story = url_hhhhhh.content
  my_story = my_story.split('<div class="printstory">')[1]
  my_story_subject = my_story.split('<h1>')[1]
  my_story_subject = my_story_subject.split('</h1>')[0]
  my_story =  ''.join(BeautifulSoup(my_story).findAll(text=True))
  message = mail.EmailMessage(sender="me<me@someplace.com>",
  subject=my_story_subject)
  message.to = "Jim <me@someplace.com>"
  message.body = my_story
  message.html = my_story_html
  message.send()
  time.sleep(9)
  a=a+1

欢迎使用Stack Overflow!

任务队列就是为了解决这个问题而建立的。您可以使用延迟库对现有代码进行最小的更改来利用它:

不调用message.send(),这样做:

def send_email(message):  
  message.send()
deferred.defer(send_email, message)

这将创建一批临时任务,在主请求处理程序返回后在后台发送电子邮件。其中一些任务可能会在第一次尝试时失败,因为您的应用程序达到了出站邮件的短期配额限制。没关系;失败的任务将退出并自动重试,直到它们成功为止。

Edit:哦,把sleep从你的代码中去掉。=)

Edit #2:您可以通过将urlfetch移动到任务中进一步加快速度,因此每个任务获取一个URL,然后发送一个电子邮件。在一个请求处理程序中获取22个url可能足以导致超时,与发送邮件无关。

相关内容

  • 没有找到相关文章

最新更新