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
21
22 package org.apache.james.transport.mailets;
23
24 import org.apache.mailet.MailAddress;
25
26 import javax.mail.MessagingException;
27 import javax.mail.internet.InternetAddress;
28 import java.util.Collection;
29 import java.util.HashSet;
30
31 /**
32 * <P>Replaces incoming recipients with those specified, and resends the message unaltered.</P>
33 * <P>Can be totally replaced by an equivalent usage of {@link Resend} (see below),
34 * simply replacing <I><forwardto></I> with <I><recipients></I>.
35 *
36 * <P>Sample configuration:</P>
37 * <PRE><CODE>
38 * <mailet match="All" class="Forward">
39 * <forwardTo><I>comma delimited list of email addresses</I></forwardTo>
40 * <passThrough><I>true or false, default=false</I></passThrough>
41 * <fakeDomainCheck><I>true or false, default=true</I></fakeDomainCheck>
42 * <debug><I>true or false, default=false</I></debug>
43 * </mailet>
44 * </CODE></PRE>
45 *
46 * <P>The behaviour of this mailet is equivalent to using Resend with the following
47 * configuration:</P>
48 * <PRE><CODE>
49 * <mailet match="All" class="Resend">
50 * <recipients>comma delimited list of email addresses</recipients>
51 * <passThrough>true or false</passThrough>
52 * <fakeDomainCheck><I>true or false</I></fakeDomainCheck>
53 * <debug><I>true or false</I></debug>
54 * </mailet>
55 * </CODE></PRE>
56 * <P><I>forwardto</I> can be used instead of
57 * <I>forwardTo</I>; such name is kept for backward compatibility.</P>
58 *
59 * @version CVS $Revision: 426007 $ $Date: 2006-07-27 09:52:06 +0100 (Thu, 27 Jul 2006) $
60 */
61 public class Forward extends AbstractRedirect {
62
63 /**
64 * Return a string describing this mailet.
65 *
66 * @return a string describing this mailet
67 */
68 public String getMailetInfo() {
69 return "Forward Mailet";
70 }
71
72 /** Gets the expected init parameters. */
73 protected String[] getAllowedInitParameters() {
74 String[] allowedArray = {
75 // "static",
76 "debug",
77 "passThrough",
78 "fakeDomainCheck",
79 "forwardto",
80 "forwardTo"
81 };
82 return allowedArray;
83 }
84
85 /* ******************************************************************** */
86 /* ****************** Begin of getX and setX methods ****************** */
87 /* ******************************************************************** */
88
89 /**
90 * @return UNALTERED
91 */
92 protected int getInLineType() throws MessagingException {
93 return UNALTERED;
94 }
95
96 /**
97 * @return NONE
98 */
99 protected int getAttachmentType() throws MessagingException {
100 return NONE;
101 }
102
103 /**
104 * @return ""
105 */
106 protected String getMessage() throws MessagingException {
107 return "";
108 }
109
110 /**
111 * @return the <CODE>recipients</CODE> init parameter or null if missing
112 */
113 protected Collection getRecipients() throws MessagingException {
114 Collection newRecipients = new HashSet();
115 String addressList = getInitParameter("forwardto",getInitParameter("forwardTo"));
116
117 // if nothing was specified, throw an exception
118 if (addressList == null) {
119 throw new MessagingException("Failed to initialize \"recipients\" list: no <forwardTo> or <forwardto> init parameter found");
120 }
121
122 try {
123 InternetAddress[] iaarray = InternetAddress.parse(addressList, false);
124 for (int i = 0; i < iaarray.length; i++) {
125 String addressString = iaarray[i].getAddress();
126 MailAddress specialAddress = getSpecialAddress(addressString,
127 new String[] {"postmaster", "sender", "from", "replyTo", "reversePath", "unaltered", "recipients", "to", "null"});
128 if (specialAddress != null) {
129 newRecipients.add(specialAddress);
130 } else {
131 newRecipients.add(new MailAddress(iaarray[i]));
132 }
133 }
134 } catch (Exception e) {
135 throw new MessagingException("Exception thrown in getRecipients() parsing: " + addressList, e);
136 }
137 if (newRecipients.size() == 0) {
138 throw new MessagingException("Failed to initialize \"recipients\" list; empty <recipients> init parameter found.");
139 }
140
141 return newRecipients;
142 }
143
144 /**
145 * @return null
146 */
147 protected InternetAddress[] getTo() throws MessagingException {
148 return null;
149 }
150
151 /**
152 * @return null
153 */
154 protected MailAddress getReplyTo() throws MessagingException {
155 return null;
156 }
157
158 /**
159 * @return null
160 */
161 protected MailAddress getReversePath() throws MessagingException {
162 return null;
163 }
164
165 /**
166 * @return null
167 */
168 protected MailAddress getSender() throws MessagingException {
169 return null;
170 }
171
172 /**
173 * @return null
174 */
175 protected String getSubject() throws MessagingException {
176 return null;
177 }
178
179 /**
180 * @return ""
181 */
182 protected String getSubjectPrefix() throws MessagingException {
183 return null;
184 }
185
186 /**
187 * @return false
188 */
189 protected boolean attachError() {
190 return false;
191 }
192
193 /**
194 * @return false
195 */
196 protected boolean isReply() throws MessagingException {
197 return false;
198 }
199
200 /* ******************************************************************** */
201 /* ******************* End of getX and setX methods ******************* */
202 /* ******************************************************************** */
203
204 }
205