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
;
16 * The {@code BounceNotificationParser} parses an incoming HTTP request into
17 * a description of a bounce notification.
20 public final class BounceNotificationParser
extends HttpRequestParser
{
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
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
);
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
);
75 if (originalDetailsBuilder
!= null) {
76 bounceNotificationBuilder
.withOriginal(originalDetailsBuilder
.build());
78 if (notificationDetailsBuilder
!= null) {
79 bounceNotificationBuilder
.withNotification(notificationDetailsBuilder
.build());
81 return bounceNotificationBuilder
.build();