Set up mail to receive emails on Google App Engine
The documentation is rather incomplete. I could not set up the inbound email. Here are some details:
app.yaml:
handlers:
- url: /_ah/mail/owner@oladic\.appspotmail\.com
script: handle_owner.py
login: admin
- url: /_ah/mail/support@oladic\.appspotmail\.com
script: handle_support.py
login: admin
- url: /_ah/mail/.+
script: handle_catchall.py
login: admin
- url: .*
script: main.py
inbound_services:
- mail
handle_catchall.py:
# To change this template, choose Tools | Templates
# and open the template in the editor.
import logging, email
from google.appengine.api import 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
class LogSenderHandler(InboundMailHandler):
def receive(self, mail_message):
logging.info("================================")
logging.info("Received a message from: " + mail_message.sender)
plaintext_bodies = message.bodies('text/plain')
html_bodies = message.bodies('text/html')
for content_type, body in html_bodies:
decoded_html = body.decode()
logging.info("content_type: " + content_type)
logging.info("decoded_html: " + decoded_html)
attachments = []
if message.attac开发者_开发百科hments:
if isinstance(message.attachments[0], basestring):
attachments = [message.attachments]
else:
attachments = message.attachments
logging.info("number of attachments: " + str(len(attachments)))
for filename, content in attachments:
logging.info("plaintext_bodies: " + plaintext_bodies)
logging.info("filename: " + filename)
content
logging.info("--------------------------------")
def main():
application = webapp.WSGIApplication([LogSenderHandler.mapping()], debug=True)
wsgiref.handlers.CGIHandler().run(application)
if __name__ == '__main__':
main()
I checked that found some trivial bugs/mistakes. Will update later.
No more issues. Here's the code of working example:
handle_catchall.py:
import logging, email
import wsgiref.handlers
import exceptions
from google.appengine.api import 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
class LogSenderHandler(InboundMailHandler):
def receive(self, mail_message):
logging.info("================================")
logging.info("Received a mail_message from: " + mail_message.sender)
logging.info("The email subject: " + mail_message.subject)
logging.info("The email was addressed to: " + str.join(str(mail_message.to), ', '))
try:
logging.info("The email was CC-ed to: " + str.join(str(mail_message.cc), ', '))
except exceptions.AttributeError :
logging.info("The email has no CC-ed recipients")
try:
logging.info("The email was send on: " + str(mail_message.date))
except exceptions.AttributeError :
logging.info("The email has no send date specified!!!")
plaintext_bodies = mail_message.bodies('text/plain')
html_bodies = mail_message.bodies('text/html')
for content_type, body in html_bodies:
decoded_html = body.decode()
logging.info("content_type: " + content_type)
logging.info("decoded_html: " + decoded_html)
plaintext_bodies
attachments = []
# hasattr(a, 'property')
# http://stackoverflow.com/questions/610883/how-to-know-if-an-object-has-an-attribute-in-python
try:
if mail_message.attachments :
if isinstance(mail_message.attachments[0], basestring):
attachments = [mail_message.attachments]
else:
attachments = mail_message.attachments
except exceptions.AttributeError :
logging.info("This email has no attachments.")
logging.info("number of attachments: " + str(len(attachments)))
for filename, content in attachments:
#logging.info("plaintext_bodies: " + plaintext_bodies)
logging.info("filename: " + filename)
content
logging.info("--------------------------------")
def main():
application = webapp.WSGIApplication([LogSenderHandler.mapping()], debug=True)
wsgiref.handlers.CGIHandler().run(application)
if __name__ == '__main__':
main()
精彩评论