Hide
Python

Receiving Bounce Notification

In order to receive email bounce notifications, you need to configure your app to enable email notification and you need to create a handler to handle those notifications.

Configuring Your App to Receive Bounce Notifications

There are two parts to the configuration. First, you need to enable notification. Second, you need to set the mapping between /_ah/bounce and your bounce handler, so App Engine knows where to POST the notification data. To configure your app to receive bounced email notifications:

  1. Add the following to your app.yaml file to enable notification:
    inbound_services:
    - mail_bounce
  2. Also in app.yaml, declare a mapping between /_ah/bounce and the bounce notification handler in your code, for example:
    - url: /_ah/bounce
      script: handle_bounced_email.app
      login: admin

Handling Bounce Notifications

A bounce notification is an automated message from an email system that there's been a problem with message delivery. In your app, you'll need to create bounce handler code to receive and process these notifications.

One way to write a bounce handler is to use the BounceNotificationHandler convenience class. If you go this route, you'll need to override its receive() method, which is called with an argument of the BounceNotification class. Whether you use the BounceNotificationHandler convenience class or not, you do need to use BounceNotification to parse the bounce notifications.

Both BounceNotificationHandler and BounceNotification are in the google.appengine.ext.webapp.mail_handlers package.

Here is a sample bounce handler that uses the BounceNotificationHandler convenience class:

import logging
import webapp
from google.appengine.ext.webapp.mail_handlers import BounceNotification
from google.appengine.ext.webapp.mail_handlers import BounceNotificationHandler

class LogBounceHandler(BounceNotificationHandler):
  def receive(self, bounce_message):
    logging.info('Received bounce post ... [%s]', str(self.request))
    logging.info('Bounce original: %s' + str(bounce_message.original))
    logging.info('Bounce notification: %s' + str(bounce_message.notification))

Here is a sample bounce handler that does not use BounceNotificationHandler:

class BounceHandler(webapp.RequestHandler):
  def post(self):
    bounce = BounceNotification(self.request.POST)
    logging.info('Bounce original: %s' + str(bounce.original))
    logging.info('Bounce notification: %s' + str(bounce.notification))