| 1 16 17 package info.jtrac.mail; 18 19 import info.jtrac.domain.Item; 20 import info.jtrac.domain.ItemUser; 21 import info.jtrac.domain.User; 22 import info.jtrac.util.ItemUtils; 23 import java.util.Date ; 24 import java.util.Enumeration ; 25 import java.util.Locale ; 26 import java.util.Map ; 27 import java.util.Properties ; 28 import javax.mail.Header ; 29 import javax.mail.internet.MimeMessage ; 30 import org.apache.commons.logging.Log; 31 import org.apache.commons.logging.LogFactory; 32 import org.springframework.context.MessageSource; 33 import org.springframework.mail.javamail.JavaMailSenderImpl; 34 import org.springframework.mail.javamail.MimeMessageHelper; 35 import org.springframework.util.StringUtils; 36 37 40 public class MailSender { 41 42 private final Log logger = LogFactory.getLog(getClass()); 43 private JavaMailSenderImpl sender; 44 private String prefix; 45 private String from; 46 private String url; 47 private MessageSource messageSource; 48 private Locale defaultLocale; 49 50 public MailSender(Map <String , String > config, MessageSource messageSource, String defaultLocale) { 51 this.messageSource = messageSource; 53 this.defaultLocale = StringUtils.parseLocaleString(defaultLocale); 54 String host = config.get("mail.server.host"); 55 if (host == null) { 56 logger.warn("'mail.server.host' config is null, mail adapter not initialized"); 57 return; 58 } 59 String port = config.get("mail.server.port"); 60 String url = config.get("jtrac.url.base"); 61 from = config.get("mail.from"); 62 prefix = config.get("mail.subject.prefix"); 63 String userName = config.get("mail.server.username"); 64 String password = config.get("mail.server.password"); 65 String startTls = config.get("mail.server.starttls.enable"); 66 logger.debug("initializing email adapter: host = '" + host + "', port = '" + 67 port + "', url = '" + url + "', from = '" + from + "', prefix = '" + prefix + "'"); 68 this.prefix = prefix == null ? "[jtrac]" : prefix; 69 this.from = from == null ? "jtrac" : from; 70 this.url = url == null ? "http://localhost/jtrac/" : url; 71 if (!this.url.endsWith("/")) { 72 this.url = url + "/"; 73 } 74 int p = 25; 75 if (port != null) { 76 try { 77 p = Integer.parseInt(port); 78 } catch (NumberFormatException e) { 79 logger.warn("mail.server.port not an integer : '" + port + "', defaulting to 25"); 80 } 81 } 82 sender = new JavaMailSenderImpl(); 83 sender.setHost(host); 84 sender.setPort(p); 85 if (userName != null) { 86 Properties props = new Properties (); 88 props.put("mail.smtp.auth", "true"); 89 if (startTls != null && startTls.toLowerCase().equals("true")) { 90 props.put("mail.smtp.starttls.enable", "true"); 91 } 92 sender.setJavaMailProperties(props); 93 sender.setUsername(userName); 94 sender.setPassword(password); 95 } 96 logger.info("email sender initialized: host = '" + host + "', port = '" + p + "'"); 97 } 98 99 107 private void sendInNewThread(final MimeMessage message) { 108 new Thread (){ 109 public void run() { 110 logger.debug("send mail thread start"); 111 try { 112 sender.send(message); 113 logger.debug("send mail thread successfull"); 114 } catch (Exception e) { 115 logger.error("send mail thread failed", e); 116 logger.error("mail headers dump start"); 117 try { 118 Enumeration headers = message.getAllHeaders(); 119 while(headers.hasMoreElements()) { 120 Header h = (Header ) headers.nextElement(); 121 logger.info(h.getName() + ": " + h.getValue()); 122 } 123 } catch (Exception f) { 124 } 126 logger.error("mail headers dump end"); 127 } 128 } 129 }.start(); 130 } 131 132 private String fmt(String key, Locale locale) { 133 try { 134 return messageSource.getMessage("mail_sender." + key, null, locale); 135 } catch (Exception e) { 136 logger.debug(e); 137 return "???mail_sender." + key + "???"; 138 } 139 } 140 141 private String addHeaderAndFooter(StringBuffer html) { 142 StringBuffer sb = new StringBuffer (); 143 sb.append("<html><body><style type='text/css'>table.jtrac th, table.jtrac td { padding-left: 0.2em; padding-right: 0.2em; }</style>"); 147 sb.append(html); 148 sb.append("<hr/></html>"); 149 return sb.toString(); 150 } 151 152 private String getItemViewAnchor(Item item, Locale locale) { 153 return "<p><a HREF='" + url + "flow/item_view?itemId=" + item.getId() + "'>" 154 + fmt("clickHereToAccess", locale) + " " + item.getRefId() + "</a></p>"; 155 } 156 157 private String getSubject(Item item) { 158 String summary = null; 159 if (item.getSummary() == null) { 160 summary = ""; 161 } else if (item.getSummary().length() > 80) { 162 summary = item.getSummary().substring(0, 80); 163 } else { 164 summary = item.getSummary(); 165 } 166 return prefix + " #" + item.getRefId() + " " + summary; 167 } 168 169 public void send(Item item, MessageSource messageSource) { 170 if (sender == null) { 171 logger.debug("mail sender is null, not sending notifications"); 172 return; 173 } 174 logger.debug("attempting to send mail for item update"); 176 StringBuffer sb = new StringBuffer (); 178 String anchor = getItemViewAnchor(item, defaultLocale); 179 sb.append(anchor); 180 sb.append(ItemUtils.getAsHtml(item, messageSource, defaultLocale)); 181 sb.append(anchor); 182 if (logger.isDebugEnabled()) { 183 logger.debug("html content: " + sb); 184 } 185 MimeMessage message = sender.createMimeMessage(); 187 MimeMessageHelper helper = new MimeMessageHelper(message, "UTF-8"); 188 try { 189 helper.setText(addHeaderAndFooter(sb), true); 190 helper.setSubject(getSubject(item)); 191 helper.setSentDate(new Date ()); 192 helper.setFrom(from); 193 if (item.getAssignedTo() != null) { 195 helper.setTo(item.getAssignedTo().getEmail()); 196 } else { 197 helper.setTo(item.getLoggedBy().getEmail()); 198 } 199 if (item.getItemUsers() != null) { 201 String [] cc = new String [item.getItemUsers().size()]; 202 int i = 0; 203 for (ItemUser itemUser : item.getItemUsers()) { 204 cc[i++] = itemUser.getUser().getEmail(); 205 } 206 helper.setCc(cc); 207 } 208 sendInNewThread(message); 210 } catch (Exception e) { 211 logger.error("failed to prepare e-mail", e); 212 } 213 } 214 215 public void sendUserPassword(User user, String clearText) { 216 if (sender == null) { 217 logger.debug("mail sender is null, not sending new user / password change notification"); 218 return; 219 } 220 logger.debug("attempting to send mail for user password"); 221 String localeString = user.getLocale(); 222 Locale locale = null; 223 if(localeString == null) { 224 locale = defaultLocale; 225 } else { 226 locale = StringUtils.parseLocaleString(localeString); 227 } 228 MimeMessage message = sender.createMimeMessage(); 229 MimeMessageHelper helper = new MimeMessageHelper(message, "UTF-8"); 230 try { 231 helper.setTo(user.getEmail()); 232 helper.setSubject(prefix + " " + fmt("loginMailSubject", locale)); 233 StringBuffer sb = new StringBuffer (); 234 sb.append("<p>" + fmt("loginMailGreeting", locale) + " " + user.getName()+ ",</p>"); 235 sb.append("<p>" + fmt("loginMailLine1", locale) + "</p>"); 236 sb.append("<table class='jtrac'>"); 237 sb.append("<tr><th style='background: #CCCCCC'>" + fmt("loginName", locale) 238 + "</th><td style='border: 1px solid black'>" + user.getLoginName() + "</td></tr>"); 239 sb.append("<tr><th style='background: #CCCCCC'>" + fmt("password", locale) 240 + "</th><td style='border: 1px solid black'>" + clearText + "</td></tr>"); 241 sb.append("</table>"); 242 sb.append("<p>" + fmt("loginMailLine2", locale) + "</p>"); 243 sb.append("<p><a HREF='" + url + "'>" + url + "</a></p>"); 244 helper.setText(addHeaderAndFooter(sb), true); 245 helper.setSentDate(new Date ()); 246 helper.setCc(from); 247 helper.setFrom(from); 248 sendInNewThread(message); 249 } catch (Exception e) { 250 logger.error("failed to prepare e-mail", e); 251 } 252 } 253 254 } 255 | Popular Tags |