001: /****************************************************************
002: * Licensed to the Apache Software Foundation (ASF) under one *
003: * or more contributor license agreements. See the NOTICE file *
004: * distributed with this work for additional information *
005: * regarding copyright ownership. The ASF licenses this file *
006: * to you under the Apache License, Version 2.0 (the *
007: * "License"); you may not use this file except in compliance *
008: * with the License. You may obtain a copy of the License at *
009: * *
010: * http://www.apache.org/licenses/LICENSE-2.0 *
011: * *
012: * Unless required by applicable law or agreed to in writing, *
013: * software distributed under the License is distributed on an *
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
015: * KIND, either express or implied. See the License for the *
016: * specific language governing permissions and limitations *
017: * under the License. *
018: ****************************************************************/package org.apache.james.transport.mailets;
019:
020: import org.apache.mailet.GenericMailet;
021: import org.apache.mailet.Mail;
022: import org.apache.mailet.MailAddress;
023:
024: import javax.mail.MessagingException;
025: import javax.mail.internet.InternetAddress;
026: import javax.mail.internet.MimeMessage;
027: import java.util.Collection;
028: import java.util.StringTokenizer;
029: import java.util.Vector;
030:
031: /**
032: * <p>Mailet designed to process the recipients from the mail headers rather
033: * than the recipients specified in the SMTP message header. This can be
034: * useful if your mail is redirected on-route by a mail server that
035: * substitutes a fixed recipient address for the original.</p>
036: *
037: * <p>To use this, match against the redirection address using the
038: * <code>RecipientIs</code> matcher and set the mailet 'class' to
039: * <code>UseHeaderRecipients</code>. This will cause the email to be
040: * re-injected into the root process with the recipient substituted
041: * by all the recipients in the Mail-For, To and Cc headers
042: * of the message.</p>
043: *
044: * <p>e.g.</p>
045: * <pre>
046: * <mailet match="RecipientIs=forwarded@myhost"
047: * class="UseHeaderRecipients">
048: * </mailet>
049: * </pre>
050: *
051: * @version 1.0.0, 24/11/2000
052: */
053: public class UseHeaderRecipients extends GenericMailet {
054:
055: /**
056: * Controls certain log messages
057: */
058: private boolean isDebug = false;
059:
060: /**
061: * Initialize the mailet
062: *
063: * initializes the DEBUG flag
064: */
065: public void init() {
066: isDebug = (getInitParameter("debug") == null) ? false
067: : new Boolean(getInitParameter("debug")).booleanValue();
068: }
069:
070: /**
071: * Process an incoming email, removing the currently identified
072: * recipients and replacing them with the recipients indicated in
073: * the Mail-For, To and Cc headers of the actual email.
074: *
075: * @param mail incoming email
076: */
077: public void service(Mail mail) throws MessagingException {
078: MimeMessage message = mail.getMessage();
079:
080: // Utilise features of Set Collections such that they automatically
081: // ensure that no two entries are equal using the equality method
082: // of the element objects. MailAddress objects test equality based
083: // on equivalent but not necessarily visually identical addresses.
084: Collection recipients = mail.getRecipients();
085: // Wipe all the exist recipients
086: recipients.clear();
087: recipients.addAll(getHeaderMailAddresses(message, "Mail-For"));
088: if (recipients.isEmpty()) {
089: recipients.addAll(getHeaderMailAddresses(message, "To"));
090: recipients.addAll(getHeaderMailAddresses(message, "Cc"));
091: }
092: if (isDebug) {
093: log("All recipients = " + recipients.toString());
094: log("Reprocessing mail using recipients in message headers");
095: }
096:
097: // Return email to the "root" process.
098: getMailetContext().sendMail(mail.getSender(),
099: mail.getRecipients(), mail.getMessage());
100: mail.setState(Mail.GHOST);
101: }
102:
103: /**
104: * Return a string describing this mailet.
105: *
106: * @return a string describing this mailet
107: */
108: public String getMailetInfo() {
109: return "UseHeaderRecipients Mailet";
110: }
111:
112: /**
113: * Work through all the headers of the email with a matching name and
114: * extract all the mail addresses as a collection of addresses.
115: *
116: * @param mail the mail message to read
117: * @param name the header name as a String
118: * @return the collection of MailAddress objects.
119: */
120: private Collection getHeaderMailAddresses(MimeMessage message,
121: String name) throws MessagingException {
122:
123: if (isDebug) {
124: StringBuffer logBuffer = new StringBuffer(64).append(
125: "Checking ").append(name).append(" headers");
126: log(logBuffer.toString());
127: }
128: Collection addresses = new Vector();
129: String[] headers = message.getHeader(name);
130: String addressString;
131: InternetAddress iAddress;
132: if (headers != null) {
133: for (int i = 0; i < headers.length; i++) {
134: StringTokenizer st = new StringTokenizer(headers[i],
135: ",", 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: }
|