1 package com.dotmarketing.factories; 2 3 5 import java.io.StringWriter ; 6 import java.util.HashMap ; 7 import java.util.List ; 8 9 import org.apache.velocity.Template; 10 import org.apache.velocity.VelocityContext; 11 import org.apache.velocity.context.Context; 12 import org.apache.velocity.exception.ResourceNotFoundException; 13 14 import com.dotmarketing.beans.Identifier; 15 import com.dotmarketing.beans.UserProxy; 16 import com.dotmarketing.cache.IdentifierCache; 17 import com.dotmarketing.cms.factories.PublicCompanyFactory; 18 import com.dotmarketing.cms.login.factories.LoginFactory; 19 import com.dotmarketing.portlets.campaigns.factories.CampaignFactory; 20 import com.dotmarketing.portlets.campaigns.factories.RecipientFactory; 21 import com.dotmarketing.portlets.campaigns.model.Campaign; 22 import com.dotmarketing.portlets.campaigns.model.Recipient; 23 import com.dotmarketing.portlets.communications.model.Communication; 24 import com.dotmarketing.portlets.htmlpages.model.HTMLPage; 25 import com.dotmarketing.portlets.mailinglists.factories.MailingListFactory; 26 import com.dotmarketing.portlets.mailinglists.model.MailingList; 27 import com.dotmarketing.portlets.user.factories.UserCommentsFactory; 28 import com.dotmarketing.threads.DeliverCampaignThread; 29 import com.dotmarketing.util.Config; 30 import com.dotmarketing.util.Logger; 31 import com.dotmarketing.util.Mailer; 32 import com.dotmarketing.util.UtilMethods; 33 import com.liferay.portal.ejb.UserLocalManagerUtil; 34 import com.liferay.portal.model.User; 35 36 42 public class EmailFactory { 43 44 47 48 private static StringBuffer alterBodyHTML(StringBuffer HTML, String serverName) { 49 String message = HTML 52 .toString() 53 .replaceAll( 54 "(?i)(?s)<a[^>]+href=\"([^>]+)\"[^>]*>(.*?)</[^>]*a[^>]*>", 55 "<a HREF=\"http://" 56 + serverName 57 + "/redirect?r=<rId>&redir=$1\">$2</a>") 58 .replaceAll("<a HREF=\"http://" + serverName + "/redirect\\?r=<rId>&redir=(mailto:[^\"]+)\">", "<a HREF=\"$1\">"); 59 message = message 61 .replaceAll( 62 "<\\s*td([^>]*)background\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?([^>]*)>", 63 "<td$1background=\"http://" 64 + serverName 65 + "$2\"$3>"); 66 message = message 68 .replaceAll( 69 "<\\s*tr([^>]*)background\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?([^>]*)>", 70 "<tr$1background=\"http://" 71 + serverName 72 + "$2\"$3>"); 73 message = message.replaceAll( 75 "<\\s*img([^>]*)src\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?([^>]*)>", 76 "<img$1src=\"http://" + serverName 77 + "$2\"$3>"); 78 message = message 80 .replaceAll( 81 "<\\s*link([^>]*)href\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?([^>]*)>", 82 "<link$1href=\"http://" 83 + serverName 84 + "$2\"$3>"); 85 message = message 87 .replaceAll( 88 "<\\s*script([^>]*)src\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?([^>]*)>", 89 "<script$1src=\"http://" 90 + serverName 91 + "$2\"$3>"); 92 message = message 94 .replaceAll( 95 "<\\s*applet([^>]*)codebase\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?([^>]*)>", 96 "<applet$1codebase=\"http://" 97 + serverName 98 + "$2\"$3>"); 99 message = message 101 .replaceAll( 102 "<\\s*applet(([^>][^(codebase)])*)code\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?(([^>][^(codebase)])*)>", 103 "<applet$1code=\"http://" 104 + serverName 105 + "$4\"$5>"); 106 message = message 108 .replaceAll( 109 "<\\s*iframe([^>]*)src\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?([^>]*)>", 110 "<iframe$1src=\"http://" 111 + serverName 112 + "$2\"$3>"); 113 message = message 115 .replaceAll( 116 "<\\s*iframe([^>]*)longdesc\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?([^>]*)>", 117 "<iframe$1longdesc=\"http://" 118 + serverName 119 + "$2\"$3>"); 120 message = message 122 .replaceAll( 123 "<\\s*frame([^>]*)src\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?([^>]*)>", 124 "<frame$1src=\"http://" 125 + serverName 126 + "$2\"$3>"); 127 message = message 129 .replaceAll( 130 "<\\s*frame([^>]*)longdesc\\s*=\\s*[\"\']?([^\'\">]*)[\"\']?([^>]*)>", 131 "<frame$1longdesc=\"http://" 132 + serverName 133 + "$2\"$3>"); 134 message = message 136 .replaceAll( 137 "<([^>]*)style\\s*=\\s*[\"\']?([^\'\">]*)url\\s*\\(\\s*([^>]*)\\s*\\)([^\'\">]*)[\"\']?([^>]*)>", 138 "<$1style=\"$2url(http://" 139 + serverName 140 + "$3)$4\"$5>"); 141 message = message.replaceAll("http://" 143 + serverName + "\\s*http://", 144 "http://"); 145 return new StringBuffer (message); 146 147 } 148 149 155 156 public static void deliverCampaigns() { 157 158 StringBuffer message = null; 159 java.util.List attachments = null; 160 boolean html = false; 161 162 List campaigns = CampaignFactory.getWaitingCampaigns(); 164 if (campaigns.size() == 0) 165 { 166 campaigns = null; 167 return; 168 } 169 Logger.debug(EmailFactory.class, "GOING to deliver campaigns"); 170 java.util.Iterator campIter = campaigns.iterator(); 171 172 java.util.Map <String , com.dotmarketing.threads.DeliverCampaignThread> deliverThreads = new HashMap <String , com.dotmarketing.threads.DeliverCampaignThread>(); 174 175 while (campIter.hasNext()) 177 { 178 Campaign c = (Campaign) campIter.next(); 180 Communication comm = (Communication) InodeFactory.getChildOfClass(c, Communication.class); 181 182 Logger.debug(EmailFactory.class, "got campaign:" + c.getTitle()); 183 MailingList ml = (MailingList) InodeFactory.getChildOfClass(c,MailingList.class); 185 186 if (ml.getInode() == 0) 187 { 188 Logger.warn(EmailFactory.class,"I didn't find a mailing list!"); 189 c.setLocked(false); 190 InodeFactory.saveInode(c); 191 continue; 192 } 193 else 194 { 195 Logger.debug(EmailFactory.class, "got mailingList:" + ml.getTitle()); 196 } 197 198 MailingList unSubscribers = MailingListFactory.getUnsubscribersMailingList(); 200 201 List subscribers = InodeFactory.getChildrenClass(ml, UserProxy.class); 204 Logger.debug(EmailFactory.class, "Got subscribers:" + subscribers.size()); 205 206 String alternateTextMessage = null; 208 HTMLPage htmlPage = (HTMLPage) InodeFactory.getChildOfClass(comm,HTMLPage.class); 210 if (htmlPage.getInode() > 0) { 211 html = true; 212 Logger.debug(EmailFactory.class, "Got htmlPage:"+ htmlPage.getTitle()); 213 214 Identifier id = IdentifierCache.getIdentifierByInodeFromCache(htmlPage); 216 217 218 String serverName = HostFactory.getHost(id.getHostInode()).getHostname(); 219 220 message = alterBodyHTML(UtilMethods.getURL("http://"+ serverName + id.getURI()), serverName ); 222 alternateTextMessage = "If you are having trouble reading this message, click here: "+ "http://"+ serverName + id.getURI(); 223 message.append("<img SRC='http://"+ serverName + "/imageShim?r=<rId>' width='1' height='1'>"); 225 226 } else { 227 html = false; 228 message = new StringBuffer (comm.getTextMessage()); 230 } 231 232 java.util.Iterator subscriberIterator = subscribers.iterator(); 234 String send_per_hour = c.getSendsPerHour(); 235 236 while (subscriberIterator.hasNext()) 238 { 239 DeliverCampaignThread deliveryThread = null; 241 while(deliveryThread == null) 242 { 243 for (int j = 0; j < Config.getIntProperty("EMAIL_SENDING_THREADS",10); j++) 244 { 245 deliveryThread = (DeliverCampaignThread) deliverThreads.get("thread" + j); 246 if (deliveryThread == null || !deliveryThread.isAlive()) 248 { 249 deliveryThread = new DeliverCampaignThread("thread" + j); 250 deliverThreads.put("thread" + j, deliveryThread); 251 break; 252 } else if (deliveryThread.isAlive()) { 253 continue; 254 } 255 } 256 try 257 { 258 Thread.sleep(1000); 259 } 260 catch(Exception ex) 261 { 262 Logger.debug(EmailFactory.class,ex.toString()); 263 } 264 } 265 266 UserProxy subscriber = (UserProxy) subscriberIterator.next(); 268 User member = new User(); 269 try { 270 String companyId = PublicCompanyFactory.getDefaultCompanyId(); 271 member = UserLocalManagerUtil.getUserById(companyId, subscriber.getUserId()); 272 } catch (Exception e) { 273 Logger.error(LoginFactory.class, "deliverCampaigns Failed" + e); 274 e.printStackTrace(System.out); 275 } 276 277 Recipient recipient = RecipientFactory.getRecipientByCampaignAndSubscriber(c, member); 278 if (isSubscribed(unSubscribers,member)) 279 { 280 recipient.setLastMessage("On Do Not Send List"); 281 recipient.setLastResult(500); 282 subscriber.setLastMessage("On Do Not Send List"); 283 subscriber.setLastResult(500); 284 c.addChild(recipient); 285 continue; 286 } 287 288 List l = UserCommentsFactory.getUserCommentsByComm(subscriber.getInode(), comm.getInode()); 290 291 if (recipient.getInode() > 0 || l.size() > 0) 292 { 293 Logger.debug(EmailFactory.class,"Already got this email:" + recipient.getEmail()); 294 if (!c.isSendEmail()) { 295 continue; 296 } 297 } 298 299 recipient.setEmail(member.getEmailAddress()); 300 recipient.setName(member.getFirstName()); 301 recipient.setLastname(member.getLastName()); 302 303 recipient.setSent(new java.util.Date ()); 304 InodeFactory.saveInode(recipient); 305 306 deliveryThread.setRecipient(recipient); 307 deliveryThread.setAttachments(attachments); 308 deliveryThread.setCampaign(c); 309 deliveryThread.setSubscriber(member); 310 deliveryThread.setAlternateTextMessage(alternateTextMessage); 311 deliveryThread.setMessage(message); 312 deliveryThread.setHtml(html); 313 deliveryThread.start(); 314 315 long sleepTime = 10; 316 if(UtilMethods.isSet(send_per_hour) && !send_per_hour.equals("unlimited")) 317 { 318 sleepTime = 3600000 / Integer.parseInt(send_per_hour); 319 } 320 try 321 { 322 Thread.sleep(sleepTime); 323 } 324 catch(Exception t) 325 { 326 t.printStackTrace(); 327 } 328 } 329 c.setCompletedDate(new java.util.Date ()); 330 c.setLocked(false); 331 attachments = null; 332 message = null; 333 InodeFactory.saveInode(c); 334 Logger.debug(EmailFactory.class, "Camapign sent: " + c.getTitle()); 335 336 } 337 338 341 for (int j = 0; j < Config.getIntProperty("EMAIL_SENDING_THREADS", 10); j++) 342 { 343 deliverThreads.put("thread" + j, null); 344 } 345 deliverThreads = null; 347 } 348 349 350 351 352 public static boolean sendForgotPassword(User user, String newPassword, 353 long hostId) { 354 Context context = new VelocityContext(); 356 context.put("user", user); 357 context.put("UtilMethods", new UtilMethods()); 358 context.put("language", "1"); 359 context.put("password", newPassword); 360 361 StringWriter writer = new StringWriter (); 362 363 long idInode = IdentifierCache.getPathFromIdCache(Config 364 .getStringProperty("PATH_FORGOT_PASSWORD_EMAIL"), hostId).getInode(); 365 366 HTMLPage page = (HTMLPage) IdentifierFactory.getLiveChildOfClass( 367 InodeFactory.getInode(idInode, Identifier.class), 368 HTMLPage.class); 369 370 try { 371 String message = ""; 372 try { 373 Template t = UtilMethods.getVelocityTemplate("live/"+ idInode+ "."+ Config.getStringProperty("VELOCITY_HTMLPAGE_EXTENSION")); 374 t.merge(context, writer); 375 Logger 376 .debug(EmailFactory.class, "writer:" 377 + writer.getBuffer()); 378 message = writer.toString().trim(); 379 } catch (ResourceNotFoundException ex) { 380 message = "<center><b>And error has ocurred loading de message's page<b></center>"; 381 } 382 383 Mailer m = new Mailer(); 384 m.setToEmail(user.getEmailAddress()); 385 m.setSubject(page.getTitle()); 386 m.setHTMLBody(message); 387 m.setFromEmail(Config.getStringProperty("EMAIL_SYSTEM_ADDRESS")); 388 return m.sendMessage(); 389 } catch (Exception e) { 390 Logger.warn(EmailFactory.class, e.toString(), e); 391 return false; 392 } 393 394 } 395 396 private static boolean isSubscribed(MailingList list, User s){ 397 398 UserProxy sub = (UserProxy) InodeFactory.getChildOfClassbyCondition(list, UserProxy.class, "user_id like '" + s.getUserId() + "'"); 399 400 return (sub.getInode() > 0); 401 } 402 403 } 404 | Popular Tags |