1 /****************************************************************
2 * Licensed to the Apache Software Foundation (ASF) under one *
3 * or more contributor license agreements. See the NOTICE file *
4 * distributed with this work for additional information *
5 * regarding copyright ownership. The ASF licenses this file *
6 * to you under the Apache License, Version 2.0 (the *
7 * "License"); you may not use this file except in compliance *
8 * with the License. You may obtain a copy of the License at *
9 * *
10 * http://www.apache.org/licenses/LICENSE-2.0 *
11 * *
12 * Unless required by applicable law or agreed to in writing, *
13 * software distributed under the License is distributed on an *
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
15 * KIND, either express or implied. See the License for the *
16 * specific language governing permissions and limitations *
17 * under the License. *
18 ****************************************************************/
19
20 package org.apache.jsieve.mailet.mdn;
21
22 import javax.mail.MessagingException;
23 import javax.mail.internet.MimeBodyPart;
24
25 import org.apache.mailet.base.mail.MimeMultipartReport;
26
27 /**
28 * Class <code>MDNFactory</code> creates MimeMultipartReports containing
29 * Message Delivery Notifications as specified by RFC 2298.
30 */
31 public class MDNFactory
32 {
33
34 /**
35 * Default Constructor
36 */
37 private MDNFactory()
38 {
39 super();
40 }
41
42 /**
43 * Answers a MimeMultipartReport containing a
44 * Message Delivery Notification as specified by RFC 2298.
45 *
46 * @param humanText
47 * @param reporting_UA_name
48 * @param reporting_UA_product
49 * @param original_recipient
50 * @param final_recipient
51 * @param original_message_id
52 * @param disposition
53 * @return MimeMultipartReport
54 * @throws MessagingException
55 */
56 static public MimeMultipartReport create(String humanText,
57 String reporting_UA_name,
58 String reporting_UA_product,
59 String original_recipient,
60 String final_recipient,
61 String original_message_id,
62 Disposition disposition) throws MessagingException
63 {
64 // Create the message parts. According to RFC 2298, there are two
65 // compulsory parts and one optional part...
66 MimeMultipartReport multiPart = new MimeMultipartReport();
67 multiPart.setReportType("disposition-notification");
68
69 // Part 1: The 'human-readable' part
70 MimeBodyPart humanPart = new MimeBodyPart();
71 humanPart.setText(humanText);
72 multiPart.addBodyPart(humanPart);
73
74 // Part 2: MDN Report Part
75 // 1) reporting-ua-field
76 StringBuilder mdnReport = new StringBuilder(128);
77 mdnReport.append("Reporting-UA: ");
78 mdnReport.append((reporting_UA_name == null ? "" : reporting_UA_name));
79 mdnReport.append("; ");
80 mdnReport.append((reporting_UA_product == null ? "" : reporting_UA_product));
81 mdnReport.append("\r\n");
82 // 2) original-recipient-field
83 if (null != original_recipient)
84 {
85 mdnReport.append("Original-Recipient: ");
86 mdnReport.append("rfc822; ");
87 mdnReport.append(original_recipient);
88 mdnReport.append("\r\n");
89 }
90 // 3) final-recipient-field
91 mdnReport.append("Final-Recepient: ");
92 mdnReport.append("rfc822; ");
93 mdnReport.append((final_recipient == null ? "" : final_recipient));
94 mdnReport.append("\r\n");
95 // 4) original-message-id-field
96 mdnReport.append("Original-Message-ID: ");
97 mdnReport.append((original_message_id == null ? "" : original_message_id));
98 mdnReport.append("\r\n");
99 // 5) disposition-field
100 mdnReport.append(disposition.toString());
101 mdnReport.append("\r\n");
102 MimeBodyPart mdnPart = new MimeBodyPart();
103 mdnPart.setContent(mdnReport.toString(), "message/disposition-notification");
104 multiPart.addBodyPart(mdnPart);
105
106 // Part 3: The optional third part, the original message is omitted.
107 // We don't want to propogate over-sized, virus infected or
108 // other undesirable mail!
109 // There is the option of adding a Text/RFC822-Headers part, which
110 // includes only the RFC 822 headers of the failed message. This is
111 // described in RFC 1892. It would be a useful addition!
112 return multiPart;
113 }
114
115 }