App Engine Java SDK version 1.9.25
[gae.git] / java / src / main / com / google / appengine / api / mail / BounceNotificationParser.java
blob1ed242bb63c27c61c58a649946bdfa263e8fd814
1 package com.google.appengine.api.mail;
3 import com.google.appengine.api.utils.HttpRequestParser;
5 import java.io.IOException;
7 import java.util.Properties;
8 import javax.mail.BodyPart;
9 import javax.mail.MessagingException;
10 import javax.mail.Session;
11 import javax.mail.internet.MimeMessage;
12 import javax.mail.internet.MimeMultipart;
13 import javax.servlet.http.HttpServletRequest;
15 /**
16 * The {@code BounceNotificationParser} parses an incoming HTTP request into
17 * a description of a bounce notification.
20 public final class BounceNotificationParser extends HttpRequestParser {
21 /**
22 * Parse the POST data of the given request to get details about the bounce notification.
24 * @param request The {@link HttpServletRequest} whose POST data should be parsed.
25 * @return a BounceNotification
26 * @throws IOException
27 * @throws MessagingException
29 public static BounceNotification parse(HttpServletRequest request)
30 throws IOException, MessagingException {
31 MimeMultipart multipart = parseMultipartRequest(request);
33 BounceNotification.DetailsBuilder originalDetailsBuilder = null;
34 BounceNotification.DetailsBuilder notificationDetailsBuilder = null;
35 BounceNotification.BounceNotificationBuilder bounceNotificationBuilder =
36 new BounceNotification.BounceNotificationBuilder();
37 int parts = multipart.getCount();
38 for (int i = 0; i < parts; i++) {
39 BodyPart part = multipart.getBodyPart(i);
40 String fieldName = getFieldName(part);
41 if ("raw-message".equals(fieldName)) {
42 Session session = Session.getDefaultInstance(new Properties());
43 MimeMessage message = new MimeMessage(session, part.getInputStream());
44 bounceNotificationBuilder.withRawMessage(message);
45 } else {
46 String[] subFields = fieldName.split("-");
47 BounceNotification.DetailsBuilder detailsBuilder = null;
48 if ("original".equals(subFields[0])) {
49 if (originalDetailsBuilder == null) {
50 originalDetailsBuilder = new BounceNotification.DetailsBuilder();
52 detailsBuilder = originalDetailsBuilder;
53 } else if ("notification".equals(subFields[0])) {
54 if (notificationDetailsBuilder == null) {
55 notificationDetailsBuilder = new BounceNotification.DetailsBuilder();
57 detailsBuilder = notificationDetailsBuilder;
59 if (detailsBuilder != null) {
60 String field = subFields[1];
61 String value = getTextContent(part);
62 if ("to".equals(field)) {
63 detailsBuilder.withTo(value);
64 } else if ("from".equals(field)) {
65 detailsBuilder.withFrom(value);
66 } else if ("subject".equals(field)) {
67 detailsBuilder.withSubject(value);
68 } else if ("text".equals(field)) {
69 detailsBuilder.withText(value);
70 } else if ("cc".equals(field)) {
71 detailsBuilder.withCc(value);
72 } else if ("bcc".equals(field)) {
73 detailsBuilder.withBcc(value);
79 if (originalDetailsBuilder != null) {
80 bounceNotificationBuilder.withOriginal(originalDetailsBuilder.build());
82 if (notificationDetailsBuilder != null) {
83 bounceNotificationBuilder.withNotification(notificationDetailsBuilder.build());
85 return bounceNotificationBuilder.build();