Google App Engine Python发送邮件超时
我的脚本会抓取一个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个网址可能会导致超时,这和发送邮件无关。