KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > scalagent > joram > mom > dest > mail > JavaMailUtil


1 /*
2  * JORAM: Java(TM) Open Reliable Asynchronous Messaging
3  * Copyright (C) 2003 - 2007 ScalAgent Distributed Technologies
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
18  * USA.
19  *
20  * Initial developer(s): Nicolas Tachker (ScalAgent)
21  * Contributor(s):
22  */

23 package com.scalagent.joram.mom.dest.mail;
24
25 import java.io.BufferedReader JavaDoc;
26 import java.io.InputStream JavaDoc;
27 import java.io.InputStreamReader JavaDoc;
28 import java.util.Date JavaDoc;
29 import java.util.Enumeration JavaDoc;
30 import java.util.Properties JavaDoc;
31 import java.util.StringTokenizer JavaDoc;
32 import java.util.Vector JavaDoc;
33
34 import javax.mail.Flags JavaDoc;
35 import javax.mail.Folder JavaDoc;
36 import javax.mail.MessagingException JavaDoc;
37 import javax.mail.Multipart JavaDoc;
38 import javax.mail.Part JavaDoc;
39 import javax.mail.Session JavaDoc;
40 import javax.mail.Store JavaDoc;
41 import javax.mail.Transport JavaDoc;
42 import javax.mail.internet.InternetAddress JavaDoc;
43 import javax.mail.internet.MimeBodyPart JavaDoc;
44 import javax.mail.internet.MimeMessage JavaDoc;
45 import javax.mail.internet.MimeMultipart JavaDoc;
46
47 import org.objectweb.joram.shared.messages.ConversionHelper;
48 import org.objectweb.joram.shared.messages.Message;
49 import org.objectweb.util.monolog.api.BasicLevel;
50 import org.objectweb.util.monolog.api.Logger;
51
52 import fr.dyade.aaa.agent.Debug;
53
54 /**
55  * The <code>JavaMailUtil</code> class giv utils to get, send, ...
56  * mail.
57  */

58 public class JavaMailUtil {
59
60   public static Logger logger =
61     Debug.getLogger("com.scalagent.joram.mom.dest.mail.JavaMailUtil");
62   
63   private Store JavaDoc store = null;
64   private Folder JavaDoc folder = null;
65
66   public void sendJavaMail(SenderInfo si, MailMessage message)
67     throws Exception JavaDoc {
68     if (logger.isLoggable(BasicLevel.DEBUG))
69       logger.log(BasicLevel.DEBUG,
70                                     "--- " + this +
71                                     " sendJavaMail(" + si +
72                                     "," + message + ")");
73     
74     if (si.smtpServer == null || si.smtpServer.length() < 0) {
75       logger.log(BasicLevel.ERROR,
76                                     "--- " + this +
77                                     " sendJavaMail : smtpServer is empty.");
78       throw new Exception JavaDoc("sendJavaMail : smtpServer is empty.");
79     }
80     
81     
82     Properties JavaDoc props = System.getProperties();
83     props.put("mail.smtp.host", si.smtpServer);
84     Session JavaDoc session = Session.getDefaultInstance(props);
85     MimeMessage JavaDoc msg = new MimeMessage JavaDoc(session);
86     MimeMultipart JavaDoc mimeMultiPart = new MimeMultipart JavaDoc();
87     MimeBodyPart JavaDoc mimeBodyPart = new MimeBodyPart JavaDoc();
88     
89     msg.setFrom(new InternetAddress JavaDoc(si.from));
90     
91     if (si.to != null) {
92       StringTokenizer JavaDoc st = new StringTokenizer JavaDoc(si.to,",");
93       while (st.hasMoreTokens()) {
94         msg.setRecipients(javax.mail.Message.RecipientType.TO,
95                           InternetAddress.parse(st.nextToken(),false));
96       }
97     } else {
98       logger.log(BasicLevel.ERROR,
99                                     "--- " + this +
100                                     " sendJavaMail : to is null.");
101       throw new Exception JavaDoc("sendJavaMail : to is null.");
102     }
103     
104     if (si.cc != null) {
105       StringTokenizer JavaDoc st = new StringTokenizer JavaDoc(si.cc,",");
106       while (st.hasMoreTokens()) {
107         msg.setRecipients(javax.mail.Message.RecipientType.CC
108                           ,InternetAddress.parse(st.nextToken(),false));
109       }
110     }
111     
112     if (si.bcc != null) {
113       StringTokenizer JavaDoc st = new StringTokenizer JavaDoc(si.bcc,",");
114       while (st.hasMoreTokens()) {
115         msg.setRecipients(javax.mail.Message.RecipientType.BCC
116                           ,InternetAddress.parse(st.nextToken(),false));
117       }
118     }
119     
120     msg.setSubject(si.subject);
121     
122     if (ConversionHelper.toBoolean(message.getProperty("showProperties"))) {
123       try {
124         mimeMultiPart.addBodyPart(getMultipartProp(message));
125       } catch (Exception JavaDoc exc) {
126         logger.log(BasicLevel.WARN,
127                                       "--- " + this +
128                                       " sendJavaMail: setMultipartProp",
129                                       exc);
130       }
131     }
132     
133     if (message.getType() == Message.TEXT) {
134       mimeBodyPart.setText("JoramMessage :\n" + message.getText());
135       mimeMultiPart.addBodyPart(mimeBodyPart);
136     } else {
137       if (logger.isLoggable(BasicLevel.DEBUG))
138         logger.log(BasicLevel.DEBUG,"not yet impl.");
139       //message.getBytes()
140
}
141     
142     msg.setHeader("X-Mailer", "JORAM:JavaMailUtil");
143     msg.setSentDate(new Date JavaDoc());
144     
145     msg.setContent(mimeMultiPart);
146     Transport.send(msg);
147   }
148
149
150   private MimeBodyPart JavaDoc getMultipartProp(MailMessage msg) throws Exception JavaDoc {
151     MimeBodyPart JavaDoc mbp = new MimeBodyPart JavaDoc();
152
153     StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
154     buf.append("type=" + msg.getType() + "\n");
155     buf.append("id=" + msg.getIdentifier() + "\n");
156     buf.append("persistent=" + msg.getPersistent() + "\n");
157     buf.append("priority=" + msg.getJMSPriority() + "\n");
158     buf.append("expiration=" + msg.getJMSExpiration() + "\n");
159     buf.append("timestamp=" + msg.getTimestamp() + "\n");
160     buf.append("toId=" + msg.getDestinationId() + "\n");
161     buf.append("destType=" + msg.getToType() + "\n");
162     buf.append("correlationId=" + msg.getCorrelationId() + "\n");
163     buf.append("replyToId=" + msg.getReplyToId() + "\n");
164     buf.append("replyDestType=" + msg.replyToType() + "\n");
165     buf.append("deliveryCount=" + msg.getDeliveryCount() + "\n");
166     buf.append("denied=" + msg.getDenied() + "\n");
167     buf.append("deletedDest=" + msg.getDeletedDest() + "\n");
168     buf.append("expired=" + msg.getExpired() + "\n");
169     buf.append("notWriteable=" + msg.getNotWriteable() + "\n");
170     buf.append("undeliverable=" + msg.getUndeliverable() + "\n");
171  
172     mbp.setText(buf.toString());
173     return mbp;
174   }
175
176   public synchronized javax.mail.Message JavaDoc[] popMail(String JavaDoc popServer,
177                                                    String JavaDoc popUser,
178                                                    String JavaDoc popPassword,
179                                                    boolean expunge) {
180     
181     if (logger.isLoggable(BasicLevel.DEBUG))
182       logger.log(BasicLevel.DEBUG,
183                                     "--- " + this +
184                                     " popMail : " +
185                                     "popServer=" + popServer +
186                                     ", popUser=" + popUser +
187                                     ", expunge=" + expunge);
188
189     javax.mail.Message JavaDoc[] msgs = null;
190
191     try {
192       Properties JavaDoc props = System.getProperties();
193       Session JavaDoc session = Session.getDefaultInstance(props, null);
194       
195       store = session.getStore("pop3");
196       store.connect(popServer, popUser, popPassword);
197       
198       folder = store.getDefaultFolder();
199       if (folder == null) throw new Exception JavaDoc("No default folder");
200
201       folder = folder.getFolder("INBOX");
202       if (folder == null) throw new Exception JavaDoc("No POP3 INBOX");
203
204       if (expunge) {
205         folder.open(Folder.READ_WRITE);
206         msgs = folder.getMessages();
207       } else {
208         folder.open(Folder.READ_ONLY);
209         msgs = folder.getMessages();
210       }
211       return msgs;
212     } catch (Exception JavaDoc exc) {
213       logger.log(BasicLevel.ERROR,
214                                     "JavaMailUtil.popMail",
215                                     exc);
216       return msgs;
217     }
218   }
219
220   public synchronized void closeFolder(Vector JavaDoc msgs, boolean expunge) {
221     try {
222       if (expunge && (msgs != null)) {
223         for (Enumeration JavaDoc elements = msgs.elements();
224              elements.hasMoreElements();) {
225           javax.mail.Message JavaDoc msg =
226             (javax.mail.Message JavaDoc) elements.nextElement();
227           msg.setFlag(Flags.Flag.DELETED,true);
228         }
229       }
230       if (folder != null) folder.close(expunge);
231       if (store != null) store.close();
232     } catch (Exception JavaDoc exc) {
233       logger.log(BasicLevel.ERROR,
234                                     "JavaMailUtil.closeFolder",
235                                     exc);
236     }
237   }
238
239   protected MailMessage createMessage(Properties JavaDoc prop,
240                                   String JavaDoc mailId,
241                                   String JavaDoc destType,
242                                   String JavaDoc toId,
243                                   String JavaDoc replyDestType)
244     throws Exception JavaDoc {
245     MailMessage msg = new MailMessage();
246     
247     msg.setIdentifier(mailId);
248     msg.setPersistent(ConversionHelper.toBoolean(prop.getProperty("persistent","true")));
249     msg.setPriority(ConversionHelper.toInt(prop.getProperty("priority","4")));
250     msg.setExpiration(ConversionHelper.toLong(prop.getProperty("expiration","0")));
251     if (prop.containsKey("timestamp"))
252       msg.setTimestamp(ConversionHelper.toLong(prop.getProperty("timestamp")));
253     msg.setDestination(prop.getProperty("toId",toId),
254                        prop.getProperty("destType",destType));
255     if (prop.containsKey("correlationId"))
256       msg.setCorrelationId(prop.getProperty("correlationId"));
257     if (prop.containsKey("replyToId"))
258       msg.setReplyTo(prop.getProperty("replyToId"),
259                      prop.getProperty("replyDestType",replyDestType));
260     msg.setDeliveryCount(ConversionHelper.toInt(prop.getProperty("deliveryCount","0")));
261     msg.setDenied(ConversionHelper.toBoolean(prop.getProperty("denied","false")));
262     msg.setDeletedDest(ConversionHelper.toBoolean(prop.getProperty("deletedDest","false")));
263     msg.setExpired(ConversionHelper.toBoolean(prop.getProperty("expired","false")));
264     msg.setNotWriteable(ConversionHelper.toBoolean(prop.getProperty("notWriteable","false")));
265     msg.setUndeliverable(ConversionHelper.toBoolean(prop.getProperty("undeliverable","false")));
266     
267 // msg.setOptionalHeader((Hashtable) h.getProperty("optionalHeader"));
268
// msg.setProperties((Hashtable) h.getProperty("properties"));
269

270     msg.setText((String JavaDoc) prop.getProperty("mailMessage"));
271     
272     return msg;
273   }
274
275   public Properties JavaDoc getMOMProperties(javax.mail.Message JavaDoc message)
276     throws Exception JavaDoc, MessagingException JavaDoc {
277     Properties JavaDoc prop = new Properties JavaDoc();
278     
279     String JavaDoc subject = message.getSubject();
280     prop.setProperty("subject",subject);
281
282     Part JavaDoc messagePart = message;
283     Object JavaDoc content = messagePart.getContent();
284     if (content instanceof Multipart JavaDoc)
285       messagePart=((Multipart JavaDoc)content).getBodyPart(0);
286     
287     String JavaDoc contentType = messagePart.getContentType();
288
289     if (contentType.startsWith("text/plain")
290         || contentType.startsWith("text/html")) {
291       InputStream JavaDoc is = messagePart.getInputStream();
292       BufferedReader JavaDoc reader = new BufferedReader JavaDoc(
293         new InputStreamReader JavaDoc(is));
294
295       String JavaDoc currentLine = reader.readLine();
296       while (currentLine != null) {
297         currentLine = currentLine.trim();
298         if (currentLine.equalsIgnoreCase("JoramMessage")) break;
299         if (currentLine.length() > 1) {
300           String JavaDoc[] buf = currentLine.split("=");
301           prop.setProperty(buf[0],buf[1]);
302           if (logger.isLoggable(BasicLevel.DEBUG))
303             logger.log(BasicLevel.DEBUG,buf[0] + "=" + buf[1]);
304         }
305         currentLine = reader.readLine();
306       }
307
308       StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
309       currentLine = reader.readLine();
310       while (currentLine != null) {
311         sb.append(currentLine + "\n");
312         currentLine = reader.readLine();
313       }
314       prop.setProperty("mailMessage",sb.toString());
315     }
316
317     if (content instanceof Multipart JavaDoc) {
318       messagePart=((Multipart JavaDoc)content).getBodyPart(1);
319       
320       contentType = messagePart.getContentType();
321       
322       if (contentType.startsWith("text/plain")
323           || contentType.startsWith("text/html")) {
324         InputStream JavaDoc is = messagePart.getInputStream();
325         BufferedReader JavaDoc reader = new BufferedReader JavaDoc(
326           new InputStreamReader JavaDoc(is));
327         
328         String JavaDoc currentLine = reader.readLine();
329         StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
330         while (currentLine != null) {
331           if (currentLine.equalsIgnoreCase("JoramMessage")) continue;
332           sb.append(currentLine + "\n");
333           currentLine = reader.readLine();
334         }
335         prop.setProperty("mailMessage",sb.toString());
336       }
337     }
338
339     if (logger.isLoggable(BasicLevel.DEBUG))
340       logger.log(BasicLevel.DEBUG,
341                                     "--- " + this +
342                                     " getMOMProperties : prop=" + prop);
343     return prop;
344   }
345 }
346
Popular Tags