在GAE中处理Incoming Email

标签:Google App Engine, Python

随着GAE SDK 1.2.6的发布,GAE也终于可以用来收邮件了。
按照老规矩,本文仍只介绍Python下的用法。

先是修改app.yaml文件,分为2步:
  1. 在inbound_services段启用incoming email服务,例如:
    inbound_services:
    - mail
  2. 添加一个handler去处理这个请求,例如:
    - url: /_ah/mail/.+ 
      script: handle_incoming_email.py 
      login: admin
    要注意的是,接收的邮件地址为任意字符串@你的应用ID.appspotmail.com,而响应的请求地址则是/_ah/mail/任意字符串@你的应用ID.appspotmail.com
    你可以在app.yaml里区分字符串,也可以在handler里去处理。
    另外,邮件地址的域是appspotmail.com,需要非常注意。
接着就是处理它了。Python SDK提供了InboundMailHandler这个类(在google.appengine.ext.webapp.mail_handlers包里),只要继承它,并改写receive()方法即可。
当收到邮件时,这个receive()方法会接收到一个InboundEmailMessage对象,含下列属性:
  • subject 邮件主题
  • sender 发信人地址
  • to 收件人地址列表
  • cc 抄送人地址列表
  • date 发送日期
  • bodies 消息列表,包含纯文本和HTML这2种类型
  • attachments 附件列表,包含附件类型和内容
注意bodies()是一个方法,可以用如下办法获取纯文本和HTML内容:
plaintext = message.bodies(content_type='text/plain')
html = message.bodies(content_type='text/html')
为了便于测试,GAE本地开发控制台(默认是http://localhost:8080/_ah/admin/)也增加了一个Inbound Mail标签页,用以发送测试邮件。

下面给个例子:
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext.webapp.mail_handlers import InboundMailHandler
import logging


class MailHandler(InboundMailHandler):
  def receive(self, msg):
    logging.info(msg.subject)
    logging.info(msg.sender)
    logging.info(msg.to)
    logging.info(msg.cc)
    logging.info(msg.date)
    logging.info(msg.bodies(content_type='text/plain'))
    logging.info(msg.bodies(content_type='text/html'))
    logging.info(msg.attachments)

application = webapp.WSGIApplication([('/_ah/mail/.+', MailHandler)])

def main():
  run_wsgi_app(application)

if __name__ == '__main__':
  main()
控制台记录结果(为避免垃圾邮件,我更改了邮件地址):
10-13 08:49PM 01.571 /_ah/mail/ooxx@keakon.appspotmail.com 200 47ms 51cpu_ms 0kb
0.1.0.20 - - [13/Oct/2009:20:49:01 -0700] "POST /_ah/mail/ooxx@keakon.appspotmail.com HTTP/1.1" 200 124 - - "keakon.appspot.com"
I 10-13 08:49PM 01.597
=?GB2312?B?uf65/g==?=
I 10-13 08:49PM 01.598
=?GB2312?B?t+fQptGp?= <xx@oo.com>
I 10-13 08:49PM 01.598
ooxx@keakon.appspotmail.com
I 10-13 08:49PM 01.598
oo@xx.com
I 10-13 08:49PM 01.598
Wed, 14 Oct 2009 11:49:00 +0800
I 10-13 08:49PM 01.598
<generator object at 0x399e9e65212bbc68>
I 10-13 08:49PM 01.598
<generator object at 0x399e9e65212bbc68>
I 10-13 08:49PM 01.599
('Noname3.txt', <EncodedPayload payload=#-1930762895023516857 encoding=base64>)
注意内容需要进行base64解码。

此外,建议使用getattr()来获取cc和attachments,因为这2个属性可能不存在。(实际上其他属性也可能不存在,不知道GAE有没有处理。)

最后一点,Incoming Email目前没有API配额限制,只占用CPU时间。

11条评论 你不来一发么↓ 顺序排列 倒序排列

    向下滚动可载入更多评论,或者点这里禁止自动加载

    想说点什么呢?