在GAE中处理Incoming Email
2009 10 14 11:55 AM 2913次查看
分类:Google App Engine 标签:Google App Engine, Python
按照老规矩,本文仍只介绍Python下的用法。
先是修改app.yaml文件,分为2步:
- 在inbound_services段启用incoming email服务,例如:
inbound_services: - mail
- 添加一个handler去处理这个请求,例如:
要注意的是,接收的邮件地址为任意字符串@你的应用ID.appspotmail.com,而响应的请求地址则是/_ah/mail/任意字符串@你的应用ID.appspotmail.com。- url: /_ah/mail/.+ script: handle_incoming_email.py login: admin
你可以在app.yaml里区分字符串,也可以在handler里去处理。
另外,邮件地址的域是appspotmail.com,需要非常注意。
当收到邮件时,这个receive()方法会接收到一个InboundEmailMessage对象,含下列属性:
- subject 邮件主题
- sender 发信人地址
- to 收件人地址列表
- cc 抄送人地址列表
- date 发送日期
- bodies 消息列表,包含纯文本和HTML这2种类型
- attachments 附件列表,包含附件类型和内容
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注意内容需要进行base64解码。
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>)
此外,建议使用getattr()来获取cc和attachments,因为这2个属性可能不存在。(实际上其他属性也可能不存在,不知道GAE有没有处理。)
最后一点,Incoming Email目前没有API配额限制,只占用CPU时间。
向下滚动可载入更多评论,或者点这里禁止自动加载。