com/scalagent/joram/mom/dest/mail/JavaMailUtil.java

00001 /*
00002  * JORAM: Java(TM) Open Reliable Asynchronous Messaging
00003  * Copyright (C) 2003 - 2007 ScalAgent Distributed Technologies
00004  *
00005  * This library is free software; you can redistribute it and/or
00006  * modify it under the terms of the GNU Lesser General Public
00007  * License as published by the Free Software Foundation; either
00008  * version 2.1 of the License, or any later version.
00009  * 
00010  * This library is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013  * Lesser General Public License for more details.
00014  * 
00015  * You should have received a copy of the GNU Lesser General Public
00016  * License along with this library; if not, write to the Free Software
00017  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
00018  * USA.
00019  *
00020  * Initial developer(s): ScalAgent Distributed Technologies
00021  * Contributor(s): 
00022  */
00023 package com.scalagent.joram.mom.dest.mail;
00024 
00025 import java.io.BufferedReader;
00026 import java.io.InputStream;
00027 import java.io.InputStreamReader;
00028 import java.util.Date;
00029 import java.util.Enumeration;
00030 import java.util.Properties;
00031 import java.util.StringTokenizer;
00032 import java.util.Vector;
00033 
00034 import javax.mail.Flags;
00035 import javax.mail.Folder;
00036 import javax.mail.MessagingException;
00037 import javax.mail.Multipart;
00038 import javax.mail.Part;
00039 import javax.mail.Session;
00040 import javax.mail.Store;
00041 import javax.mail.Transport;
00042 import javax.mail.internet.InternetAddress;
00043 import javax.mail.internet.MimeBodyPart;
00044 import javax.mail.internet.MimeMessage;
00045 import javax.mail.internet.MimeMultipart;
00046 
00047 import org.objectweb.joram.shared.messages.ConversionHelper;
00048 import org.objectweb.joram.shared.messages.Message;
00049 import org.objectweb.util.monolog.api.BasicLevel;
00050 import org.objectweb.util.monolog.api.Logger;
00051 
00052 import fr.dyade.aaa.util.Debug;
00053 
00058 public class JavaMailUtil {
00059   public static Logger logger = Debug.getLogger(JavaMailUtil.class.getName());
00060   
00061   private Store store = null;
00062   private Folder folder = null;
00063 
00064   public void sendJavaMail(SenderInfo si, MailMessage message)
00065     throws Exception {
00066     if (logger.isLoggable(BasicLevel.DEBUG))
00067       logger.log(BasicLevel.DEBUG, 
00068                  "--- " + this + " sendJavaMail(" + si + "," + message + ")");
00069     
00070     if (si.smtpServer == null || si.smtpServer.length() < 0) {
00071       logger.log(BasicLevel.ERROR, 
00072                  "--- " + this + " sendJavaMail : smtpServer is empty.");
00073       throw new Exception("sendJavaMail : smtpServer is empty.");
00074     }
00075     
00076     
00077     Properties props = System.getProperties();
00078     props.put("mail.smtp.host", si.smtpServer);
00079     Session session = Session.getDefaultInstance(props);
00080     MimeMessage msg = new MimeMessage(session);
00081     MimeMultipart mimeMultiPart = new MimeMultipart();
00082     MimeBodyPart mimeBodyPart = new MimeBodyPart();
00083     
00084     msg.setFrom(new InternetAddress(si.from));
00085     
00086     if (si.to != null) {
00087       StringTokenizer st = new StringTokenizer(si.to,",");
00088       while (st.hasMoreTokens()) {
00089         msg.setRecipients(javax.mail.Message.RecipientType.TO,
00090                           InternetAddress.parse(st.nextToken(),false));
00091       }
00092     } else {
00093       logger.log(BasicLevel.ERROR, 
00094                  "--- " + this + " sendJavaMail : to is null.");
00095       throw new Exception("sendJavaMail : to is null.");
00096     }
00097     
00098     if (si.cc != null) {
00099       StringTokenizer st = new StringTokenizer(si.cc,",");
00100       while (st.hasMoreTokens()) {
00101         msg.setRecipients(javax.mail.Message.RecipientType.CC
00102                           ,InternetAddress.parse(st.nextToken(),false));
00103       }
00104     }
00105     
00106     if (si.bcc != null) {
00107       StringTokenizer st = new StringTokenizer(si.bcc,",");
00108       while (st.hasMoreTokens()) {
00109         msg.setRecipients(javax.mail.Message.RecipientType.BCC
00110                           ,InternetAddress.parse(st.nextToken(),false));
00111       }
00112     }
00113     
00114     msg.setSubject(si.subject);
00115     
00116     if (ConversionHelper.toBoolean(message.getProperty("showProperties"))) {
00117       try {
00118         mimeMultiPart.addBodyPart(getMultipartProp(message));
00119       } catch (Exception exc) {
00120         logger.log(BasicLevel.WARN,
00121                    "--- " + this + " sendJavaMail: setMultipartProp", exc);
00122       }
00123     }
00124     
00125     if (message.getType() == Message.TEXT) {
00126       mimeBodyPart.setText("JoramMessage :\n" + message.getText());
00127       mimeMultiPart.addBodyPart(mimeBodyPart);
00128     } else {
00129       if (logger.isLoggable(BasicLevel.DEBUG))
00130         logger.log(BasicLevel.DEBUG,"not yet implemented");
00131       //message.getBytes()
00132     }
00133     
00134     msg.setHeader("X-Mailer", "JORAM:JavaMailUtil");
00135     msg.setSentDate(new Date());
00136     
00137     msg.setContent(mimeMultiPart);
00138     Transport.send(msg);
00139   }
00140 
00141 
00142   private MimeBodyPart getMultipartProp(MailMessage msg) throws Exception {
00143     MimeBodyPart mbp = new MimeBodyPart();
00144 
00145     StringBuffer buf = new StringBuffer();
00146     buf.append("type=" + msg.getType() + "\n");
00147     buf.append("id=" + msg.getIdentifier() + "\n");
00148     buf.append("persistent=" + msg.getPersistent() + "\n");
00149     buf.append("priority=" + msg.getJMSPriority() + "\n");
00150     buf.append("expiration=" + msg.getJMSExpiration() + "\n");
00151     buf.append("timestamp=" + msg.getTimestamp() + "\n");
00152     buf.append("toId=" + msg.getDestinationId() + "\n");
00153     buf.append("destType=" + msg.getToType() + "\n");
00154     buf.append("correlationId=" + msg.getCorrelationId() + "\n");
00155     buf.append("replyToId=" + msg.getReplyToId() + "\n");
00156     buf.append("replyDestType=" + msg.replyToType() + "\n");
00157     buf.append("deliveryCount=" + msg.getDeliveryCount() + "\n");
00158     buf.append("denied=" + msg.getDenied() + "\n");
00159     
00160     if (msg.getProperty("JMS_JORAM_ERRORCOUNT") != null) {
00161       int errorCount = ((Integer) msg.getProperty("JMS_JORAM_ERRORCOUNT")).intValue();
00162       buf.append("errorCount=" + errorCount + "\n");
00163       for (int i = 1; i <= errorCount; i++) {
00164         buf.append("errorCode" + i + "=" + msg.getProperty("JMS_JORAM_ERRORCODE_" + i) + "\n");
00165         buf.append("errorCause" + i + "=" + msg.getProperty("JMS_JORAM_ERRORCAUSE_" + i) + "\n");
00166       }
00167     }
00168  
00169     mbp.setText(buf.toString());
00170     return mbp;
00171   }
00172 
00173   public synchronized javax.mail.Message[] popMail(String popServer, 
00174                                                    String popUser, 
00175                                                    String popPassword,
00176                                                    boolean expunge) {
00177     
00178     if (logger.isLoggable(BasicLevel.DEBUG))
00179       logger.log(BasicLevel.DEBUG, 
00180                  "--- " + this + " popMail : " + "popServer=" + popServer +
00181                  ", popUser=" + popUser +  ", expunge=" + expunge);
00182 
00183     javax.mail.Message[] msgs = null;
00184 
00185     try {
00186       Properties props = System.getProperties();
00187       Session session = Session.getDefaultInstance(props, null);
00188       
00189       store = session.getStore("pop3");
00190       store.connect(popServer, popUser, popPassword);
00191       
00192       folder = store.getDefaultFolder();
00193       if (folder == null) throw new Exception("No default folder");
00194 
00195       folder = folder.getFolder("INBOX");
00196       if (folder == null) throw new Exception("No POP3 INBOX");
00197 
00198       if (expunge) {
00199         folder.open(Folder.READ_WRITE);
00200         msgs = folder.getMessages();
00201       } else {
00202         folder.open(Folder.READ_ONLY);
00203         msgs = folder.getMessages();
00204       }
00205       return msgs;
00206     } catch (Exception exc) {
00207       logger.log(BasicLevel.ERROR, "JavaMailUtil.popMail", exc);
00208       return msgs;
00209     }
00210   }
00211 
00212   public synchronized void closeFolder(Vector msgs, boolean expunge) {
00213     try {
00214       if (expunge && (msgs != null)) {
00215         for (Enumeration elements = msgs.elements();
00216              elements.hasMoreElements();) {
00217           javax.mail.Message msg = 
00218             (javax.mail.Message) elements.nextElement();
00219           msg.setFlag(Flags.Flag.DELETED,true);
00220         }
00221       }
00222       if (folder != null) folder.close(expunge);
00223       if (store != null) store.close();
00224     } catch (Exception exc) {
00225       logger.log(BasicLevel.ERROR, "JavaMailUtil.closeFolder", exc);
00226     } 
00227   }
00228 
00229   protected MailMessage createMessage(Properties prop, 
00230                                       String mailId,
00231                                       String destType,
00232                                       String toId,
00233                                       String replyDestType) 
00234     throws Exception {
00235     MailMessage msg = new MailMessage();
00236     
00237     msg.setIdentifier(mailId);
00238     msg.setPersistent(ConversionHelper.toBoolean(prop.getProperty("persistent","true")));
00239     msg.setPriority(ConversionHelper.toInt(prop.getProperty("priority","4")));
00240     msg.setExpiration(ConversionHelper.toLong(prop.getProperty("expiration","0")));
00241     if (prop.containsKey("timestamp"))
00242       msg.setTimestamp(ConversionHelper.toLong(prop.getProperty("timestamp")));
00243     msg.setDestination(prop.getProperty("toId",toId),
00244                        prop.getProperty("destType",destType));
00245     if (prop.containsKey("correlationId"))
00246       msg.setCorrelationId(prop.getProperty("correlationId"));
00247     if (prop.containsKey("replyToId"))
00248       msg.setReplyTo(prop.getProperty("replyToId"),
00249                      prop.getProperty("replyDestType",replyDestType));
00250     msg.setDeliveryCount(ConversionHelper.toInt(prop.getProperty("deliveryCount","0")));
00251     msg.setDenied(ConversionHelper.toBoolean(prop.getProperty("denied","false")));
00252     
00253     if (prop.containsKey("errorCount")) {
00254       int errorCount = ConversionHelper.toInt(prop.getProperty("errorCount"));
00255       msg.setProperty("JMS_JORAM_ERRORCOUNT", new Integer(errorCount));
00256       for (int i = 1; i <= errorCount; i++) {
00257         msg.setProperty("JMS_JORAM_ERRORCODE_" + i, new Short(prop.getProperty("errorCode" + i)));
00258         msg.setProperty("JMS_JORAM_ERRORCAUSE_" + i, new Short(prop.getProperty("errorCause" + i)));
00259       }
00260     }
00261     
00262     msg.setText(prop.getProperty("mailMessage"));
00263     
00264     return msg;
00265   }
00266 
00267   public Properties getMOMProperties(javax.mail.Message message)
00268     throws Exception, MessagingException {
00269     Properties prop = new Properties();
00270     
00271     String subject = message.getSubject();
00272     prop.setProperty("subject",subject);
00273 
00274     Part messagePart = message;
00275     Object content = messagePart.getContent();
00276     if (content instanceof Multipart)
00277       messagePart=((Multipart)content).getBodyPart(0);
00278     
00279     String contentType = messagePart.getContentType();
00280 
00281     if (contentType.startsWith("text/plain")
00282         || contentType.startsWith("text/html")) {
00283       InputStream is = messagePart.getInputStream();
00284       BufferedReader reader = new BufferedReader(
00285         new InputStreamReader(is));
00286 
00287       String currentLine = reader.readLine();
00288       while (currentLine != null) {
00289         currentLine = currentLine.trim();
00290         if (currentLine.equalsIgnoreCase("JoramMessage")) break;
00291         if (currentLine.length() > 1) {
00292           String[] buf = currentLine.split("=");
00293           prop.setProperty(buf[0],buf[1]);
00294           if (logger.isLoggable(BasicLevel.DEBUG))
00295             logger.log(BasicLevel.DEBUG,buf[0] + "=" + buf[1]);
00296         }
00297         currentLine = reader.readLine();
00298       }
00299 
00300       StringBuffer sb = new StringBuffer();
00301       currentLine = reader.readLine();
00302       while (currentLine != null) {
00303         sb.append(currentLine + "\n");
00304         currentLine = reader.readLine();
00305       }
00306       prop.setProperty("mailMessage",sb.toString());
00307     }
00308 
00309     if (content instanceof Multipart) {
00310       messagePart=((Multipart)content).getBodyPart(1);
00311       
00312       contentType = messagePart.getContentType();
00313       
00314       if (contentType.startsWith("text/plain")
00315           || contentType.startsWith("text/html")) {
00316         InputStream is = messagePart.getInputStream();
00317         BufferedReader reader = new BufferedReader(
00318           new InputStreamReader(is));
00319         
00320         String currentLine = reader.readLine();
00321         StringBuffer sb = new StringBuffer();
00322         while (currentLine != null) {
00323           if (currentLine.equalsIgnoreCase("JoramMessage")) continue;
00324           sb.append(currentLine + "\n");
00325           currentLine = reader.readLine();
00326         }
00327         prop.setProperty("mailMessage",sb.toString());
00328       }
00329     }
00330 
00331     if (logger.isLoggable(BasicLevel.DEBUG))
00332       logger.log(BasicLevel.DEBUG, 
00333                  "--- " + this + " getMOMProperties : prop=" + prop);
00334     return prop;
00335   }
00336 }

Generated on Tue Sep 16 16:14:23 2008 for joram by  doxygen 1.5.0