1 10 package org.mmbase.applications.email; 11 12 import java.io.*; 13 import java.net.*; 14 import java.util.*; 15 import javax.mail.internet.MimeMultipart ; 16 17 import org.mmbase.util.StringObject; 18 import org.mmbase.module.core.*; 19 20 21 import org.mmbase.util.logging.Logger; 22 import org.mmbase.util.logging.Logging; 23 24 35 public class EmailHandler { 36 37 38 private static final Logger log = Logging.getLoggerInstance(EmailHandler.class); 39 40 41 47 public static MMObjectNode sendMailNode(MMObjectNode node) { 48 SendMailInterface sendmail = EmailBuilder.getSendMail(); 50 if (sendmail == null) { 51 log.error("sendmail module not active, cannot send email"); 52 53 55 return node; } 57 58 59 60 String from = node.getStringValue("from"); 61 Set toGroup = getAttachedGroups(node); 62 63 String body = node.getStringValue("body"); 65 66 Map headers = getHeaders(node); 67 68 if (toGroup.size() > 0) { 69 Set toUsers = new LinkedHashSet(getTo(node)); 71 toUsers.addAll(toGroup); 72 73 Iterator i = toUsers.iterator(); 75 while (i.hasNext()) { 76 NodeRecipient to = (NodeRecipient) i.next(); 78 sendMail(node, from, to, body, headers); 79 80 headers.put("CC", null); 82 headers.put("BCC", null); 83 84 } 85 } else { 86 NodeRecipient to = new NodeRecipient(-1, node.getStringValue("to")); 88 sendMail(node, from, to, body, headers); 89 } 90 node.setValue("mailedtime", (int)(System.currentTimeMillis()/1000)); 94 95 if (node.getNumber() > 0) { 97 node.commit(); 98 } 99 return node; 100 } 101 102 106 private static Map getHeaders(MMObjectNode node) { 107 Map headers = new HashMap(); 108 109 MMObjectBuilder email = node.getBuilder(); 110 if (email.hasField("replyto")) { 112 headers.put("Reply-To", unemptyString(node.getStringValue("replyto"))); 113 } 114 if (email.hasField("cc")) { 115 headers.put("CC", unemptyString(node.getStringValue("cc"))); 116 } 117 if (email.hasField("bcc")) { 118 headers.put("BCC", unemptyString(node.getStringValue("bcc"))); 119 } 120 headers.put("Subject", unemptyString(node.getStringValue("subject"))); return headers; 122 } 123 124 128 129 private static String unemptyString(String string) { 130 return "".equals(string) ? null : string; 131 } 132 133 134 138 private static Set getTo(MMObjectNode node) { 139 Set toUsers = new LinkedHashSet(); 140 String to = node.getStringValue("to"); 141 if (to != null && !to.equals("")) { 142 toUsers.add(new NodeRecipient(-1, to)); 143 } 144 return toUsers; 145 } 146 147 148 149 152 private static Set getAttachedGroups(MMObjectNode node) { 153 Set toUsers = new LinkedHashSet(); 154 if (MMBase.getMMBase().getBuilder(EmailBuilder.groupsBuilder) != null) { List rels = node.getRelatedNodes(EmailBuilder.groupsBuilder); 156 if (rels != null) { 157 Iterator i = rels.iterator(); 158 while (i.hasNext()) { 159 MMObjectNode pnode = (MMObjectNode) i.next(); 160 toUsers.addAll(getAttachedUsers(pnode)); 161 } 162 } 163 } 164 165 return toUsers; 166 167 } 168 169 172 private static Set getAttachedUsers(MMObjectNode node) { 173 Set toUsers = new LinkedHashSet(); 174 if (MMBase.getMMBase().getBuilder(EmailBuilder.usersBuilder) != null) { List rels = node.getRelatedNodes(EmailBuilder.usersBuilder); 177 if (rels != null) { 178 Iterator i = rels.iterator(); 179 while (i.hasNext()) { 180 MMObjectNode pnode = (MMObjectNode) i.next(); 181 toUsers.add(new NodeRecipient(pnode.getNumber(), pnode.getStringValue(EmailBuilder.usersEmailField))); 182 } 183 } 184 } 185 return toUsers; 186 } 187 188 189 190 private static String getUrlExtern(String absoluteUrl,String params,String usernumber) { 191 try { 192 if (usernumber != null) { 193 params += "&usernumber=" + usernumber; 194 } 195 String prefix = "?"; 196 if (absoluteUrl.indexOf("?") != -1) { 197 prefix = "&"; 198 } 199 URL includeURL = new URL(absoluteUrl + prefix + params); 200 HttpURLConnection connection = (HttpURLConnection) includeURL.openConnection(); 201 String contentType = connection.getContentType(); 202 203 String encoding = "ISO-8859-1"; 205 206 if (contentType != null) { 208 209 StringTokenizer tokenizer = new StringTokenizer(contentType, "; "); 210 while (tokenizer.hasMoreTokens()) { 211 String value = tokenizer.nextToken(); 212 if (value.startsWith("charset=")) { 213 encoding = value.substring(8); 215 } else if (value.equals("text/xml")) { 216 encoding = "utf-8"; 218 } 219 221 } 222 } 223 BufferedReader in = new BufferedReader(new InputStreamReader (connection.getInputStream(), encoding)); 224 int buffersize = 10240; 225 char[] buffer = new char[buffersize]; 226 StringBuffer string = new StringBuffer (); 227 int len; 228 while ((len = in.read(buffer, 0, buffersize)) != -1) { 229 string.append(buffer, 0, len); 230 } 231 String result = string.toString(); 232 return result; 233 234 } catch(Exception e) { 235 } 238 return ""; 239 } 240 241 private static String stripToOneLine(String input) { 242 StringBuffer result = new StringBuffer (); 243 StringTokenizer tok = new StringTokenizer(input,",\n\r"); 244 while (tok.hasMoreTokens()) { 245 result.append(tok.nextToken()); 246 } 247 return result.toString(); 248 } 249 250 251 256 private static String html2plain(String input) { 257 StringBuffer result = new StringBuffer (); 259 260 StringTokenizer tok = new StringTokenizer(input,"\n\r"); 263 while (tok.hasMoreTokens()) { 264 result.append(tok.nextToken()); 266 } 267 268 StringObject obj = new StringObject(result.toString()); 271 obj.replace("<br/>","\n"); 272 obj.replace("<br />","\n"); 273 obj.replace("<BR/>","\n"); 274 obj.replace("<BR />","\n"); 275 obj.replace("<br>","\n"); 276 obj.replace("<BR>","\n"); 277 obj.replace("<p>","\n\n"); 278 obj.replace("<p/>","\n\n"); 279 obj.replace("<p />","\n\n"); 280 obj.replace("<P>","\n\n"); 281 282 283 return obj.toString(); 285 } 286 287 296 297 private static boolean sendMail(MMObjectNode node, String from, NodeRecipient to, String body, Map headers) { 298 String obody = body; 299 300 if (obody.indexOf("http://") == 0) { 302 body = getUrlExtern(obody, "", "" + to.nodeNumber); 303 304 if (body.indexOf("<html>")==-1 && body.indexOf("<HTML>")==-1) { 306 } 308 } 309 310 String osubject = (String ) headers.get("Subject"); 311 312 if (osubject != null && osubject.indexOf("http://") == 0) { 314 String subject = getUrlExtern(osubject, "" , "" + to.nodeNumber); 315 subject = stripToOneLine(subject); 316 headers.put("Subject", subject); 317 } 318 319 320 if (body.indexOf("<HTML>") != -1 && body.indexOf("</HTML>")!=-1) { 323 headers.put("Mime-Version", "1.0"); 324 headers.put("Content-Type", "text/html; charset=\"ISO-8859-1\""); 325 } 326 327 if (body.indexOf("<DONTMAIL>") == -1) { 333 String subject = (String ) headers.get("Subject"); 337 if (subject != null && subject.indexOf("fakemail")!=-1) { 338 log.info("Email -> fake send to " + to); 341 return true; 342 } else { 343 344 boolean mailResult; 345 if (body.indexOf("<multipart") == -1) { 347 mailResult = EmailBuilder.getSendMail().sendMail(from, to.email, body, headers); 348 } else { 349 MimeMultipart mmpart = MimeMessageGenerator.getMimeMultipart(body); 350 mailResult = EmailBuilder.getSendMail().sendMultiPartMail(from, to.email, headers, mmpart); 351 } 352 353 354 if (! mailResult) { 355 log.debug("Email -> mail failed"); 356 node.setValue("mailstatus", EmailBuilder.STATE_FAILED); 357 } else { 360 log.debug("Email -> mail send"); 363 node.setValue("mailstatus", EmailBuilder.STATE_DELIVERED); 364 } 365 return true; 366 } 367 } else { 368 log.debug("Don't mail tag found"); 369 return true; 370 } 371 } 372 375 376 static class NodeRecipient { 377 int nodeNumber; 378 String email; 379 NodeRecipient(int i, String s) { 380 nodeNumber = i; 381 email = s; 382 } 383 public boolean equals(Object o) { 384 if (o instanceof NodeRecipient) { 385 NodeRecipient other = (NodeRecipient) o; 386 return other.nodeNumber == nodeNumber && other.email.equals(email); 387 } else { 388 return false; 389 } 390 } 391 public int hashCode() { 392 return email.hashCode() + nodeNumber; 393 } 394 public String toString() { 395 return email; 396 } 397 } 398 399 } 400 401 | Popular Tags |