package de.rwth.idsg.bikeman.service; import de.rwth.idsg.bikeman.domain.User; import org.apache.commons.lang.CharEncoding; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.MessageSource; import org.springframework.core.env.Environment; import org.springframework.mail.MailSendException; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.thymeleaf.context.Context; import org.thymeleaf.spring4.SpringTemplateEngine; import javax.annotation.PostConstruct; import javax.inject.Inject; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; /** * Service for sending e-mails. * <p/> * <p> * We use the @Async annotation to send e-mails asynchronously. * </p> */ @Service public class MailService { private final Logger log = LoggerFactory.getLogger(MailService.class); @Inject private Environment env; @Inject private JavaMailSenderImpl javaMailSender; @Inject private MessageSource messageSource; @Inject private SpringTemplateEngine templateEngine; /** * System default email address that sends the e-mails. */ private String from; private String passwordUrl; private String activationUrl; @PostConstruct public void init() { this.from = env.getProperty("spring.mail.from"); this.passwordUrl = env.getProperty("spring.mail.passwordUrl"); this.activationUrl = env.getProperty("spring.mail.activationUrl"); } @Async public void sendEmail(String to, String subject, String content, boolean isMultipart, boolean isHtml) throws Exception { log.debug("Send e-mail[multipart '{}' and html '{}'] to '{}' with subject '{}' and content={}", isMultipart, isHtml, to, subject, content); // Prepare message using a Spring helper MimeMessage mimeMessage = javaMailSender.createMimeMessage(); try { MimeMessageHelper message = new MimeMessageHelper(mimeMessage, isMultipart, CharEncoding.UTF_8); message.setTo(to); message.setFrom(from); message.setSubject(subject); message.setText(content, isHtml); javaMailSender.send(mimeMessage); log.debug("Sent e-mail to User '{}'", to); } catch (Exception e) { throw new Exception("E-mail could not be sent to user '" + to + "', exception is: " + e.getMessage()); } } @Async public void sendActivationEmail(User user, String key) throws Exception { MimeMessage mimeMessage = javaMailSender.createMimeMessage(); try { MimeMessageHelper message = new MimeMessageHelper(mimeMessage, false, CharEncoding.UTF_8); message.setTo(user.getLogin()); message.setFrom(from); message.setSubject("Welcome"); message.setText("Hello,\n" + "please open the following link to activate your user account:\n" + "<" + this.activationUrl + ">\n", false); javaMailSender.send(mimeMessage); log.debug("Sent e-mail to User '{}'", user.getLogin()); } catch (MessagingException e) { log.error("Error creating Mail: ", e); } catch (MailSendException e) { log.error("Error sending mail: ", e); } } @Async public void sendPasswortResetEmail(User user, String key) { MimeMessage mimeMessage = javaMailSender.createMimeMessage(); try { MimeMessageHelper message = new MimeMessageHelper(mimeMessage, false, CharEncoding.UTF_8); message.setTo(user.getLogin()); message.setFrom(from); message.setSubject("Password reset"); message.setText("Hello,\n" + "you or someone else requested a reset of your password.\n" + "To define a new password follow this link:\n" + "<" + this.passwordUrl + key + ">\n", false); javaMailSender.send(mimeMessage); log.debug("Sent e-mail to User '{}'", user.getLogin()); } catch (MessagingException e) { log.error("Error creating Mail: ", e); } catch (MailSendException e) { log.error("Error sending mail: ", e); } } /*@Async public void sendActivationEmail(User user, String baseUrl) { log.debug("Sending activation e-mail to '{}'", user.getLogin()); // Locale locale = Locale.forLanguageTag(user.getLangKey()); Context context = new Context(); // Context context = new Context(locale); context.setVariable("user", user); context.setVariable("baseUrl", baseUrl); String content = templateEngine.process("activationEmail", context); // String subject = messageSource.getMessage("email.activation.title", null, locale); String subject = messageSource.getMessage("email.activation.title", null, null); try { sendEmail(user.getLogin(), subject, content, false, true); } catch (Exception e) { log.warn("E-mail could not be sent to user '{}', exception is: {}", user.getLogin(), e.getMessage()); } }*/ }