00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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
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 }