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.listservcommands;
19
20 import org.apache.avalon.framework.configuration.Configuration;
21 import org.apache.avalon.framework.configuration.ConfigurationException;
22 import org.apache.james.services.UsersRepository;
23 import org.apache.james.transport.mailets.ICommandListservManager;
24 import org.apache.mailet.RFC2822Headers;
25 import org.apache.james.util.XMLResources;
26 import org.apache.mailet.Mail;
27 import org.apache.mailet.MailAddress;
28 import org.apache.mailet.MailetContext;
29
30 import javax.activation.DataHandler;
31 import javax.mail.Message;
32 import javax.mail.MessagingException;
33 import javax.mail.Session;
34 import javax.mail.internet.InternetAddress;
35 import javax.mail.internet.MimeBodyPart;
36 import javax.mail.internet.MimeMessage;
37 import javax.mail.internet.MimeMultipart;
38 import java.util.Properties;
39
40 /***
41 * BaseCommand is a convience base class for any class that wishes to implement {@link IListServCommand}.
42 * It provides some functions like:
43 * <ul>
44 * <li>{@link #log}
45 * <li>{@link #sendStandardReply}
46 * <li>{@link #generateMail}
47 * </ul>
48 *
49 * <br />
50 * <br />
51 *
52 * @version CVS $Revision: 365582 $ $Date: 2006-01-03 08:51:21 +0000 (mar, 03 gen 2006) $
53 * @since 2.2.0
54 * @see org.apache.james.transport.mailets.CommandListservManager
55 */
56 public abstract class BaseCommand implements IListServCommand {
57
58 protected Configuration configuration;
59 protected ICommandListservManager commandListservManager;
60 protected String commandName;
61 protected MailetContext mailetContext;
62
63 /***
64 * Perform any required initialization
65 * @param configuration
66 * @throws ConfigurationException
67 */
68 public void init(ICommandListservManager commandListservManager, Configuration configuration) throws ConfigurationException {
69 this.commandListservManager = commandListservManager;
70 this.configuration = configuration;
71 commandName = configuration.getAttribute("name");
72 mailetContext = this.commandListservManager.getMailetConfig().getMailetContext();
73 log("Initialized listserv command: [" + commandName + ", " + getClass().getName() + "]");
74 }
75
76 /***
77 * The name of this command
78 * @see IListServCommand#getCommandName
79 */
80 public String getCommandName() {
81 return commandName;
82 }
83
84 /***
85 * @see Configuration
86 */
87 protected Configuration getConfiguration() {
88 return configuration;
89 }
90
91 /***
92 * The list serv manager
93 * @return {@link ICommandListservManager}
94 */
95 protected ICommandListservManager getCommandListservManager() {
96 return commandListservManager;
97 }
98
99 /***
100 * The current mailet context
101 * @return {@link MailetContext}
102 */
103 protected MailetContext getMailetContext() {
104 return mailetContext;
105 }
106
107 /***
108 * @see ICommandListservManager#getUsersRepository
109 */
110 protected UsersRepository getUsersRepository() {
111 return commandListservManager.getUsersRepository();
112 }
113
114 /***
115 * Writes the specified message to a mailet log file, prepended by
116 * the mailet's name.
117 *
118 * @param message - a String specifying the message to be written to the log file
119 */
120 protected void log(String message) {
121 StringBuffer logBuffer =
122 new StringBuffer(256)
123 .append(getCommandName())
124 .append(": ")
125 .append(message);
126 mailetContext.log(logBuffer.toString());
127 }
128
129 /***
130 * Writes an explanatory message and a stack trace for a given Throwable
131 * exception to the mailet log file, prepended by the mailet's name.
132 *
133 * @param message - a String that describes the error or exception
134 * @param t - the java.lang.Throwable error or exception
135 */
136 protected void log(String message, Throwable t) {
137 StringBuffer logBuffer =
138 new StringBuffer(256)
139 .append(getCommandName())
140 .append(": ")
141 .append(message);
142 mailetContext.log(logBuffer.toString(), t);
143 }
144
145 /***
146 * Produces a standard response replyAddress to the sender
147 * @param origMail
148 * @param subject
149 * @param message
150 * @param replyAddress an optional custom replyAddress address
151 * @throws MessagingException
152 *
153 * @see #generateMail
154 * @see MailetContext#sendMail
155 */
156 protected void sendStandardReply(Mail origMail, String subject, String message, String replyAddress) throws MessagingException {
157 MailAddress senderAddress = origMail.getSender();
158 try {
159 MimeMessage mimeMessage = generateMail(senderAddress.toString(),
160 senderAddress.getUser(),
161 getCommandListservManager().getListOwner(),
162 getCommandListservManager().getListName(true),
163 subject,
164 message);
165 if (replyAddress != null) {
166 mimeMessage.setHeader(RFC2822Headers.REPLY_TO, replyAddress);
167 }
168
169 getMailetContext().sendMail(mimeMessage);
170 } catch (Exception e) {
171 throw new MessagingException(e.getMessage(), e);
172 }
173 }
174
175 /***
176 * Use this to get standard properties for future calls to {@link org.apache.james.util.XMLResources}
177 * @return properties with the "LIST_NAME" and the "DOMAIN_NAME" properties
178 */
179 protected Properties getStandardProperties() {
180 return commandListservManager.getStandardProperties();
181 }
182
183 /***
184 * Send mail
185 *
186 * @param destEmailAddr the destination email addr: user@server.com
187 * @param destDisplayName the display name
188 * @param fromEmailAddr
189 * @param fromDisplayName
190 * @param emailSubject
191 * @param emailPlainText
192 * @throws Exception
193 */
194 protected MimeMessage generateMail(String destEmailAddr,
195 String destDisplayName,
196 String fromEmailAddr,
197 String fromDisplayName,
198 String emailSubject,
199 String emailPlainText) throws Exception {
200 MimeMessage message = new MimeMessage(Session.getDefaultInstance(System.getProperties(), null));
201
202 InternetAddress[] toAddrs = InternetAddress.parse(destEmailAddr, false);
203 toAddrs[0].setPersonal(destDisplayName);
204 InternetAddress from = new InternetAddress(fromEmailAddr);
205 from.setPersonal(fromDisplayName);
206
207 message.setRecipients(Message.RecipientType.TO, toAddrs);
208 message.setFrom(from);
209 message.setSubject(emailSubject);
210 message.setSentDate(new java.util.Date());
211
212 MimeMultipart msgbody = new MimeMultipart();
213 MimeBodyPart html = new MimeBodyPart();
214 html.setDataHandler(new DataHandler(new MailDataSource(emailPlainText, "text/plain")));
215 msgbody.addBodyPart(html);
216 message.setContent(msgbody);
217 return message;
218 }
219
220 protected XMLResources[] initXMLResources(String[] names) throws ConfigurationException {
221 return commandListservManager.initXMLResources(names);
222 }
223 }