Jedním z klasických JEE rozhraní, jejichž návrh
je poměrně složitý a jejichž použití působí programátorům nemalé
problémy, je JavaMail API™, tedy JEE rozhraní pro
odesílání e-mailů. Rámec Spring™ proto nabízí
vlastní abstrakční vrstvu, která je postavena na JavaMail
API™ a která práci s e-maily usnadňuje. Tato vrstva se nachází v balíku
org.springframework.mail.
Klíčovými členy celého balíku jsou rozhraní
MailSender, které má na starosti odesílání
e-mailů, třída SimpleMailMessage, která je
jakýmsi hodnotovým objektem (value object), zapouzdřujícím běžné atributy e-mailových
zpráv (from, to, subject, text, ...) a konečně hierarchie běhových
výjimek, které slouží jako náhrada výjimek JavaMail
API™.
Vzhledem k tomu, že při odesílání obyčejných e-mailů
prostřednictvím třídy SimpleMailMessage nelze
specifikovat kódování textu odesílané zprávy, tak v našich národních
podmínkách je tato možnost téměř nepoužitelná. Pro bohatší možnosti
funkcionality (nastavení kódování, přílohy, ...) musíme zvolit použití
MIME zpráv a k jejich odesílání pak rozhraní
org.springframework.mail.javamail.JavaMailSender.
Podívejme se rovnou na příklad odeslání jednoduchého e-mailu. V
přiložené vzorové aplikaci používáme pro odesílání e-mailů speciální
servisní rozhraní
cz.morosystems.sportportal.managers.MailManager.
Definice jeho implementace
cz.morosystems.sportportal.managers.MailManagerImpl
v konfiguračním souboru vypadá přibližně takto:
<bean id="mailManager"
class="cz.morosystems.sportportal.managers.MailManagerImpl">
<property name="mailSender" ref="mailSender"/>
<property name="commonFrom" value="info@seznam.cz" />
</bean>
<bean id="mailSender"
class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="adresa.smtp.serveru" />
</bean>
Ukažme si i úryvek ze třídy
MailManagerImpl:
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.springframework.context.support.ApplicationObjectSupport;
import org.springframework.mail.MailException;
import org.springframework.mail.MailSendException;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.core.io.ByteArrayResource;
public class MailManagerImpl extends ApplicationObjectSupport
implements MailManager {
private JavaMailSender mailSender;
private String commonFrom;
public void sendActivationEmail(String to, String url, Locale locale)
throws MailException {
try {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,"UTF-8");
helper.setTo(to);
helper.setFrom(getCommonFrom());
helper.setSubject(getMessageSourceAccessor()
.getMessage("mail.registration.subject",locale));
helper.setText(getMessageSourceAccessor()
.getMessage("mail.registration.text.prefix",
new Object[]{url}, locale));
/*přiložit soubor lze pomocí metody helper.addAttachment
byte[] obsah_souboru_jako_byte_array = ...;
helper.addAttachment("nazev_souboru.dat",
new ByteArrayResource(obsah_souboru_jako_byte_array));
*/
mailSender.send(mimeMessage);
} catch(MessagingException expc) {
... zaloguj výjimku ...
throw new MailSendException("Mail message couldn't be sent",expc);
}
}
... mailSender, commonFrom get/set metody ...
}
Je vidět, že programátor v podstatě vůbec nepřijde do styku
s JavaMail API a odeslání e-mailů je poměrně jednoduché. Metodu
sendActivationEmail lze volat jak z kontrolerů,
tak z ostatních manažerských objektů. Příklad jsme využili také k
ilustraci způsobu přístupu k lokalizovaným a parametrizovaným textům z
aplikační vrstvy na základě národního prostředí (viz „Zdroje zpráv“).