Set up mail to receive emails on Google App Engine

2019-03-17 01:00发布

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.attachments:
            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()

1条回答
Emotional °昔
2楼-- · 2019-03-17 01:51

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()
查看更多
登录 后发表回答