Receiving Bounce Notification

To receive email bounce notifications, you need to configure your app to enable bounce notification and you need to handle the incoming notification in your app.

Configuring your application for email bounce notification

By default, applications do not receive bounce notifications for email that could not be delivered. To enable the incoming bounce notification service, you must modify your application appengine-web.xml and web.xml configuration files.

Modify appengine-web.xmlby adding an inbound-services section to enable the incoming bounce service:

<inbound-services>
  <!-- Used to handle incoming mail. -->
  <service>mail</service>
  <!-- Used to handle bounced mail notifications. -->
  <service>mail_bounce</service>
</inbound-services>

Modify web.xml by mapping the bounce URL /_ah/bounce to your bounce handling servlet, as follows:

<servlet>
  <servlet-name>bouncehandler</servlet-name>
  <servlet-class>com.example.appengine.mail.BounceHandlerServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>bouncehandler</servlet-name>
  <url-pattern>/_ah/bounce</url-pattern>
</servlet-mapping>
<security-constraint>
  <web-resource-collection>
    <web-resource-name>bounce</web-resource-name>
    <url-pattern>/_ah/bounce</url-pattern>
  </web-resource-collection>
  <auth-constraint>
    <role-name>admin</role-name>
  </auth-constraint>
</security-constraint>

Handling Bounce Notifications

The JavaMail API includes the BounceNotificationParser class, which you use to parse incoming bounce notifications, as shown here:

import com.google.appengine.api.mail.BounceNotification;
import com.google.appengine.api.mail.BounceNotificationParser;

import java.io.IOException;
import java.util.logging.Logger;
import javax.mail.MessagingException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class BounceHandlerServlet extends HttpServlet {

  private static final Logger log = Logger.getLogger(BounceHandlerServlet.class.getName());

  @Override
  public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    try {
      BounceNotification bounce = BounceNotificationParser.parse(req);
      log.warning("Bounced email notification.");
      // The following data is available in a BounceNotification object
      // bounce.getOriginal().getFrom() 
      // bounce.getOriginal().getTo() 
      // bounce.getOriginal().getSubject() 
      // bounce.getOriginal().getText() 
      // bounce.getNotification().getFrom() 
      // bounce.getNotification().getTo() 
      // bounce.getNotification().getSubject() 
      // bounce.getNotification().getText() 
      // ...
    } catch (MessagingException e) {
    // ...
    }
  }
}