Google App Engine Python发送邮件超时

2 投票
1 回答
735 浏览
提问于 2025-04-16 16:44

我的脚本会抓取一个RSS页面的内容,提取出页面里的链接,然后把这些链接保存到一个列表里。接着,它会访问每个链接的内容,并把这些内容通过邮件发给我。一切运行得很顺利,但我无法发送列表中的每一个链接。通常列表里大约有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

1 个回答

6

欢迎来到Stack Overflow!

任务队列是为了解决这个问题而设计的。你可以通过使用延迟库,在不大改现有代码的情况下来利用它:

不要直接调用 message.send(),可以试试这样做:

def send_email(message):  
  message.send()

deferred.defer(send_email, message)

这样做会创建一批临时任务,这些任务会在后台发送你的邮件,等到你的主要请求处理完后再执行。有些任务可能在第一次尝试时会失败,因为你的应用可能会遇到短期的外发邮件配额限制。这没关系;失败的任务会自动等待一段时间后重试,直到成功。

补充:哦,记得把代码里的 sleep 去掉。=)

补充 #2:你可以通过把urlfetch放到任务里进一步加快速度,这样每个任务只获取一个网址,然后发送一封邮件。在一个请求处理器里获取22个网址可能会导致超时,这和发送邮件无关。

撰写回答