1 23 package com.scalagent.joram.mom.dest.mail; 24 25 import java.io.BufferedReader ; 26 import java.io.InputStream ; 27 import java.io.InputStreamReader ; 28 import java.util.Date ; 29 import java.util.Enumeration ; 30 import java.util.Properties ; 31 import java.util.StringTokenizer ; 32 import java.util.Vector ; 33 34 import javax.mail.Flags ; 35 import javax.mail.Folder ; 36 import javax.mail.MessagingException ; 37 import javax.mail.Multipart ; 38 import javax.mail.Part ; 39 import javax.mail.Session ; 40 import javax.mail.Store ; 41 import javax.mail.Transport ; 42 import javax.mail.internet.InternetAddress ; 43 import javax.mail.internet.MimeBodyPart ; 44 import javax.mail.internet.MimeMessage ; 45 import javax.mail.internet.MimeMultipart ; 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 58 public class JavaMailUtil { 59 60 public static Logger logger = 61 Debug.getLogger("com.scalagent.joram.mom.dest.mail.JavaMailUtil"); 62 63 private Store store = null; 64 private Folder folder = null; 65 66 public void sendJavaMail(SenderInfo si, MailMessage message) 67 throws Exception { 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 ("sendJavaMail : smtpServer is empty."); 79 } 80 81 82 Properties props = System.getProperties(); 83 props.put("mail.smtp.host", si.smtpServer); 84 Session session = Session.getDefaultInstance(props); 85 MimeMessage msg = new MimeMessage (session); 86 MimeMultipart mimeMultiPart = new MimeMultipart (); 87 MimeBodyPart mimeBodyPart = new MimeBodyPart (); 88 89 msg.setFrom(new InternetAddress (si.from)); 90 91 if (si.to != null) { 92 StringTokenizer st = new StringTokenizer (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 ("sendJavaMail : to is null."); 102 } 103 104 if (si.cc != null) { 105 StringTokenizer st = new StringTokenizer (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 st = new StringTokenizer (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 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 } 141 142 msg.setHeader("X-Mailer", "JORAM:JavaMailUtil"); 143 msg.setSentDate(new Date ()); 144 145 msg.setContent(mimeMultiPart); 146 Transport.send(msg); 147 } 148 149 150 private MimeBodyPart getMultipartProp(MailMessage msg) throws Exception { 151 MimeBodyPart mbp = new MimeBodyPart (); 152 153 StringBuffer buf = new StringBuffer (); 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 [] popMail(String popServer, 177 String popUser, 178 String 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 [] msgs = null; 190 191 try { 192 Properties props = System.getProperties(); 193 Session 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 ("No default folder"); 200 201 folder = folder.getFolder("INBOX"); 202 if (folder == null) throw new Exception ("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 exc) { 213 logger.log(BasicLevel.ERROR, 214 "JavaMailUtil.popMail", 215 exc); 216 return msgs; 217 } 218 } 219 220 public synchronized void closeFolder(Vector msgs, boolean expunge) { 221 try { 222 if (expunge && (msgs != null)) { 223 for (Enumeration elements = msgs.elements(); 224 elements.hasMoreElements();) { 225 javax.mail.Message msg = 226 (javax.mail.Message ) 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 exc) { 233 logger.log(BasicLevel.ERROR, 234 "JavaMailUtil.closeFolder", 235 exc); 236 } 237 } 238 239 protected MailMessage createMessage(Properties prop, 240 String mailId, 241 String destType, 242 String toId, 243 String replyDestType) 244 throws Exception { 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 270 msg.setText((String ) prop.getProperty("mailMessage")); 271 272 return msg; 273 } 274 275 public Properties getMOMProperties(javax.mail.Message message) 276 throws Exception , MessagingException { 277 Properties prop = new Properties (); 278 279 String subject = message.getSubject(); 280 prop.setProperty("subject",subject); 281 282 Part messagePart = message; 283 Object content = messagePart.getContent(); 284 if (content instanceof Multipart ) 285 messagePart=((Multipart )content).getBodyPart(0); 286 287 String contentType = messagePart.getContentType(); 288 289 if (contentType.startsWith("text/plain") 290 || contentType.startsWith("text/html")) { 291 InputStream is = messagePart.getInputStream(); 292 BufferedReader reader = new BufferedReader ( 293 new InputStreamReader (is)); 294 295 String currentLine = reader.readLine(); 296 while (currentLine != null) { 297 currentLine = currentLine.trim(); 298 if (currentLine.equalsIgnoreCase("JoramMessage")) break; 299 if (currentLine.length() > 1) { 300 String [] 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 sb = new StringBuffer (); 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 ) { 318 messagePart=((Multipart )content).getBodyPart(1); 319 320 contentType = messagePart.getContentType(); 321 322 if (contentType.startsWith("text/plain") 323 || contentType.startsWith("text/html")) { 324 InputStream is = messagePart.getInputStream(); 325 BufferedReader reader = new BufferedReader ( 326 new InputStreamReader (is)); 327 328 String currentLine = reader.readLine(); 329 StringBuffer sb = new StringBuffer (); 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 |