Some applications are required to send emails. What can I say? These are the things we have to do for money…
The JavaMail API is pretty much boring and a little cumbersome to use. Once again you find yourself fiddling with connection management, exception handling, etc. And once again Spring comes to the rescue :)
Spring-Mail has neat and easy to use email API, including MIME messages support.
Let’s imagine we need to implement “forgot my password” feature. So here goes.
The EmailFacade:
package mail; public interface EmailFacade { public void sendPasswordReminderEmailTemplate(String user, String password, String email); }The implementations:
package mail; import org.springframework.mail.MailSender; import org.springframework.mail.SimpleMailMessage; import org.springframework.util.Assert; class EmailFacadeImpl implements EmailFacade { private final MailSender mailSender; private final SimpleMailMessage passwordReminderEmailTemplate; public EmailFacadeImpl(MailSender mailSender, SimpleMailMessage passwordReminderEmailTemplate) { Assert.notNull(mailSender, "mailSender may not be null"); Assert.notNull(passwordReminderEmailTemplate, "passwordReminderEmailTemplate may not be null"); this.mailSender = mailSender; this.passwordReminderEmailTemplate = passwordReminderEmailTemplate; } public void sendPasswordReminderEmailTemplate(String user, String password, String email) { // Create a thread safe instance of the template message and customize it SimpleMailMessage msg = new SimpleMailMessage(passwordReminderEmailTemplate); String formatedText = String.format(passwordReminderEmailTemplate.getText(), user, password); msg.setText(formatedText); msg.setTo(email); mailSender.send(msg); } }And the Spring Configuration:
<bean id="emailFacade" class="mail.EmailFacadeImpl"> <constructor-arg> <bean class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="host" value="${emailServerURL}"/> <property name="username" value="${emailPrincipal}"/> <property name="password" value="${emailPassword}"/> </bean> </constructor-arg> <constructor-arg ref="passwordReminderEmailTemplate"/> </bean> <bean id="passwordReminderEmailTemplate" class="org.springframework.mail.SimpleMailMessage"> <property name="from" value="me@mycompany.com"/> <property name="subject" value="Password Reminder"/> <property name="text"> <!-- Text template to be used with String.format() --> <value><![CDATA[Hi %s, Your password is %s]]> </value> </property> </bean>TADA!
For some use cases it would be better to replace the String.format() call with some templating engine such as Velocity. I left it here for brevity.
A very nice templating engine (far better than velocity) is StringTemplate http://www.stringtemplate.org/
ReplyDelete