Sending Authenticated Email
This is an analysis of the work needed to enable CSF-based apps to send authenticated email.
Changes to CSF:
1. Configuration of mailSender Spring Bean
Configure mailSender bean to use additional properties. Currently only uses "host" = "outgoing.mit.edu". This would be a modification to applicationContext-csf-email-scheduler.xml in the csf-email module. The additional properties are:
Code Block |
---|
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="host" value="outgoing.mit.edu"/> <property name="port" value="587"/> <property name="username" value="USERNAME"/> <property name="password" value="PASSWORD"/> <property name="javaMailProperties"> <props> <prop key="mail.debug">false</prop> <prop key="mail.smtp.auth">true</prop> <prop key="mail.smtp.starttls.enable">true</prop> </props> </property> </bean> |
The username, password, port, and possibly host, property values should be externalized to a properties file. We can put these properties in machine.properties - apps should pick this up automatically. Only one copy of this props file per server.
Any app that needs to use this feature would have to upgrade its version of CSF and be retested. Each app would also need to reviewed to make sure it uses "machine.properties" in its property configuration.
2.One Login Per Batch of Email Messages
One question - for a bulk email send, should we authenticate to the server for every single email message in the batch:
Code Block |
---|
DO FOR EACH MAIL MESSAGE authenticate to server send email message END DO |
or just once for the batch:
Code Block |
---|
authenticate to serverDO FOR EACH MAIL MESSAGE send email message END DO |
My initial test with CSF does the former. WTW seems to do the latter.
The latter seems better (only one login per batch rather than one login per message). To do this, the email service needs to change - in fact it may be better to change it anyway. In "batchSend", instead of:
Code Block |
---|
Get list of email events DO FOR each email event create MimeMessagePreparator send message using MimeMessagePreparator update email event END DO |
do this:
Code Block |
---|
Get list of email events DO FOR each email event create MimeMessagePreparator and store in list END DO send messages using list of MimeMessagePreparators update email events |
We would use the "batch" API of Spring's JavaMailSender API:
Code Block |
---|
send(MimeMessagePreparator[]Â mimeMessagePreparators) |
instead of
Code Block |
---|
send(MimeMessagePreparator mimeMessagePreparator) |
Summary
This change would mean:
- Modifications to csf-email (detailed above)
- Changes to common property files (i.e. machine.properties) on each server that hosts CSF web apps.
- Build & release of each web app that needs to use this feature.
- Retest of each rebuilt app.