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