1 /************************************************************************
2 * Copyright (c) 2000-2006 The Apache Software Foundation. *
3 * All rights reserved. *
4 * ------------------------------------------------------------------- *
5 * Licensed under the Apache License, Version 2.0 (the "License"); you *
6 * may not use this file except in compliance with the License. You *
7 * may obtain a copy of the License at: *
8 * *
9 * http://www.apache.org/licenses/LICENSE-2.0 *
10 * *
11 * Unless required by applicable law or agreed to in writing, software *
12 * distributed under the License is distributed on an "AS IS" BASIS, *
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or *
14 * implied. See the License for the specific language governing *
15 * permissions and limitations under the License. *
16 ***********************************************************************/
17
18 package org.apache.james.transport.mailets;
19
20 import org.apache.mailet.GenericMailet;
21 import org.apache.mailet.Mail;
22 import org.apache.mailet.MailAddress;
23
24 import javax.mail.MessagingException;
25 import javax.mail.internet.InternetAddress;
26 import javax.mail.internet.MimeMessage;
27 import java.util.Collection;
28 import java.util.StringTokenizer;
29 import java.util.Vector;
30
31 /***
32 * <p>Mailet designed to process the recipients from the mail headers rather
33 * than the recipients specified in the SMTP message header. This can be
34 * useful if your mail is redirected on-route by a mail server that
35 * substitutes a fixed recipient address for the original.</p>
36 *
37 * <p>To use this, match against the redirection address using the
38 * <code>RecipientIs</code> matcher and set the mailet 'class' to
39 * <code>UseHeaderRecipients</code>. This will cause the email to be
40 * re-injected into the root process with the recipient substituted
41 * by all the recipients in the Mail-For, To and Cc headers
42 * of the message.</p>
43 *
44 * <p>e.g.</p>
45 * <pre>
46 * <mailet match="RecipientIs=forwarded@myhost"
47 * class="UseHeaderRecipients">
48 * </mailet>
49 * </pre>
50 *
51 * @version 1.0.0, 24/11/2000
52 */
53 public class UseHeaderRecipients extends GenericMailet {
54
55 /***
56 * Controls certain log messages
57 */
58 private boolean isDebug = false;
59
60 /***
61 * Initialize the mailet
62 *
63 * initializes the DEBUG flag
64 */
65 public void init() {
66 isDebug = (getInitParameter("debug") == null) ? false : new Boolean(getInitParameter("debug")).booleanValue();
67 }
68
69 /***
70 * Process an incoming email, removing the currently identified
71 * recipients and replacing them with the recipients indicated in
72 * the Mail-For, To and Cc headers of the actual email.
73 *
74 * @param mail incoming email
75 */
76 public void service(Mail mail) throws MessagingException {
77 MimeMessage message = mail.getMessage();
78
79
80
81
82
83 Collection recipients = mail.getRecipients();
84
85 recipients.clear();
86 recipients.addAll(getHeaderMailAddresses(message, "Mail-For"));
87 if (recipients.isEmpty()) {
88 recipients.addAll(getHeaderMailAddresses(message, "To"));
89 recipients.addAll(getHeaderMailAddresses(message, "Cc"));
90 }
91 if (isDebug) {
92 log("All recipients = " + recipients.toString());
93 log("Reprocessing mail using recipients in message headers");
94 }
95
96
97 getMailetContext().sendMail(mail.getSender(), mail.getRecipients(), mail.getMessage());
98 mail.setState(Mail.GHOST);
99 }
100
101
102 /***
103 * Return a string describing this mailet.
104 *
105 * @return a string describing this mailet
106 */
107 public String getMailetInfo() {
108 return "UseHeaderRecipients Mailet";
109 }
110
111 /***
112 * Work through all the headers of the email with a matching name and
113 * extract all the mail addresses as a collection of addresses.
114 *
115 * @param mail the mail message to read
116 * @param name the header name as a String
117 * @return the collection of MailAddress objects.
118 */
119 private Collection getHeaderMailAddresses(MimeMessage message, String name) throws MessagingException {
120
121 if (isDebug) {
122 StringBuffer logBuffer =
123 new StringBuffer(64)
124 .append("Checking ")
125 .append(name)
126 .append(" headers");
127 log(logBuffer.toString());
128 }
129 Collection addresses = new Vector();
130 String[] headers = message.getHeader(name);
131 String addressString;
132 InternetAddress iAddress;
133 if (headers != null) {
134 for(int i = 0; i < headers.length; i++) {
135 StringTokenizer st = new StringTokenizer(headers[i], ",", false);
136 while (st.hasMoreTokens()) {
137 addressString = st.nextToken();
138 iAddress = new InternetAddress(addressString);
139 if (isDebug) {
140 log("Address = " + iAddress.toString());
141 }
142 addresses.add(new MailAddress(iAddress));
143 }
144 }
145 }
146 return addresses;
147 }
148
149 }