Odesílání e-mailů

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“).

Komentáře

Téma neobsahuje žádné komentáře.

Vložit komentář

Můžete používat značkovací jazyk Texy!


Jméno:
E-mail:
Url:
Komentář:
1 + 2 =
 
MoroSystems, s.r.o.