pythonemailgoogle-app-enginegoogle-app-engine-pythonemail-bounces

Is it possible to receive email bounce notifications for google app engine - python?


I have a google endpoints project using pure python, I use the inbuilt mail to send emails. But for some reasons emails doesn't reach the receiver (quota is not exhausted). So I thought to create a bounce notifier. I have done this so far.

app.yaml

inbound_services:
- mail_bounce
handlers:
- url: /_ah/bounce
  script: applications.APPLICATION
  login: admin

applications.py

from app.api.bounce.api import Bounce

APPLICATION = endpoints.api_server([Bounce])

bounce.py

import endpoints
import logging

from protorpc import remote, message_types

from google.appengine.ext.webapp.mail_handlers import BounceNotification
from google.appengine.ext.webapp.mail_handlers import BounceNotificationHandler
from google.appengine.ext.webapp.mail_handlers import InboundMailHandler
from app.messages.auth import OutputAdminUserMessage


@endpoints.api(name='bounce', version='v1')
class Bounce(remote.Service):
    @endpoints.method(message_types.VoidMessage, OutputAdminUserMessage,
                      path="bounce", http_method="POST",
                      name="bounce")
    def post(self, request):
        bounce = BounceNotification(request.POST)
        logging.info('Bounce original: %s', bounce.original)
        logging.info('Bounce notification: %s', bounce.notification)

And this doesn't seem to work this API isn't hit when I try to send an email to xyz@gmail.com. Any help is really appreciated.


Solution

  • Answer for my own Question

    You cannot setup this using a google appengine endpoint. I used webapp2 to setup this.

    handle_bounced_email.py

    import logging
    import webapp2
    from google.appengine.api import mail
    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):
            mail.send_mail(to='ajai@gmail.com', sender='ajai@gmail.com', subject='Bounced email',
                           body=str(self.request))
            logging.info('Received bounce post ... [%s]', self.request)
            logging.info('Bounce original: %s', bounce_message.original)
            logging.info('Bounce notification: %s', bounce_message.notification)
    
    class BounceHandler(webapp2.RequestHandler):
        def post(self):
            bounce = BounceNotification(self.request.POST)
            logging.info('Bounce original: %s', bounce.original)
            logging.info('Bounce notification: %s', bounce.notification)
    
    app = webapp2.WSGIApplication([
        ('/_ah/bounce', LogBounceHandler),
    ], debug=True)
    

    Now in app.yaml add a these

    inbound_services:
    - mail_bounce
    
    - url: /_ah/bounce
      script: handle_bounced_email.app
      login: admin
    

    login:admin allows only admin users to use this url