Spring Mail a JNDI

Spring Mail a JNDI

Last modified by Jakub Jirůtka on 2013-11-11, 21:46

V tomto návodu se dozvíte jak posílat emaily z javovské aplikace postavené na Spring Frameworku s využitím Spring Mail, a to prostřednictvím mailové služby na úrovni Tomcatu sdílené přes JNDI, nebo samostatně přímo ze Springu. V obou případech se předpokládá, že máte externí SMTP server, přes který se budou emaily posílat.

Spring Mail s JNDI

Spring poskytuje šikovnou abstrakci nad Java Mail API, se kterou je posílání e-mailů v Javě hračka. Jeho základní nastavení je otázka pár řádek konfigurace, kterou zde popíši. Více najdete v přehledné dokumentaci.

Knihovny projektu

Nejprve je potřeba si do závislostí projektu přidat javax.mail-api (musí být jako „provided“, implementaci poskytne servlet kontejner) a spring-context-support (obsahuje kýženou podporu pro maily):

<dependency>
   <groupId>javax.mail</groupId>
   <artifactId>javax.mail-api</artifactId>
   <version>1.5.0</version>
   <scope>provided</scope>
</dependency>

<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context-support</artifactId>
   <version> ... </version>
</dependency>

Konfigurace ve Springu

V konfiguraci Springovského kontextu poté zadefinujte:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:p="http://www.springframework.org/schema/p"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:jee="http://www.springframework.org/schema/jee"
      xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
       http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd"
>

   <jee:jndi-lookup id="mailSession" jndi-name="mail/Session"
                    lookup-on-startup="true" cache="true" />

   <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"
         p:defaultEncoding="utf-8"
         p:session-ref="mailSession" />

   <!-- This is a template message that we can pre-load with default state. -->
   <bean id="templateMessage" class="org.springframework.mail.SimpleMailMessage"
         p:from="no-reply@example.org"
         p:subject="Testing message FTW!" />

</beans>

…nebo pokud preferujete Java-based Configuration (zde zapsanou v Groovy):

@Configuration
class MailConfig {

   @Resource(mappedName='mail/Session')
    Session mailSession

   @Bean mailSender() {
       new JavaMailSenderImpl (
           defaultEncoding: 'utf-8',
           session: mailSession
       )
   }

   @Bean templateMessage() {
       new SimpleMailMessage (
           from:    'test@dev.fit.cvut.cz',
           subject: 'Testing message FTW!'
       )
   }
}

Ukázka použití

A nakonec následuje jednoduchý ukázkový kód pro odeslání emailu.

@Slf4j
public class EmailSenderExample {
   
   private MailSender mailSender;
   private SimpleMailMessage templateMessage;

   public void sendMail() {
        log.info("Sending email...");

       // Create a thread-safe "copy" of the template message and customize it.
       SimpleMailMessage msg = new SimpleMailMessage(templateMessage);
        msg.setTo("flynn@encom.com");
        msg.setText("Greetings, programs!");

       try{
            mailSender.send(msg);
       } catch(MailException ex) {
            log.warn("Email sending failed", ex);
       }
   }
}

Konfigurace Tomcatu

Nejprve je potřeba do Tomcatu přidat knihovny s implementací Java Mail API, aby je měl k dispozici už v průběhu inicializace kontejneru. Potřebujete-li pouze odesílat e-maily přes SMTP, stáhněte si com.sun.mail:mailapi a com.sun.mail:smtp a nahrajte je do ${CATALINA_BASE}/lib nebo ${CATALINA_HOME}/lib.

Nyní pokročíme k samotné konfiguraci a nastavíme globální (sdílený) JNDI zdroj pro JavaMail Session.

  1. V souboru server.xml (typicky v ${CATALINA_BASE}/conf) přidejte pod Server/GlobalNamingResources konfiguraci globálního zdroje javax.mail.Session s nastavením odchozího SMTP serveru:

    <Resource name="mail/Session" auth="Container"
             type="javax.mail.Session"
             mail.smtp.host="smtp.example.org"
             mail.smtp.port="25" />
  2. Následně do META-INF/context.xml vaší webové aplikace, nebo globálního context.xml v ${CATALINA_BASE}/conf (zdroj pak bude automaticky dostupný všem aplikacím v kontejneru) přidejte odkaz na globální JNDI zdroj definovaný v předchozím kroku:

    <ResourceLink global="mail/Session" name="mail/Session" type="javax.mail.Session" />

Spring Mail bez JNDI

Tento návod byl psán primárně pro použití na portálu, kde je výhodné mít sdílenou mailovou službu nakonfigurovanou na úrovni servlet kontejneru. Pokud toto není váš případ a chcete jednodušší řešení, postupujte následovně.

Místo knihovny javax.mail-api, která obsahuje pouze API, přidejte přímo jeho implementaci společně s SMTP providerem:

<dependency>
   <groupId>com.sun.mail</groupId>
   <artifactId>mailapi</artifactId>
   <version>1.5.0</version>
</dependency>

<dependency>
   <groupId>com.sun.mail</groupId>
   <artifactId>smtp</artifactId>
   <version>1.5.0</version>
</dependency>

Konfigurace Springového kontextu se bude lišit pouze nepatrně – místo session se třídě JavaMailSenderImpl nastaví přímo parametry SMTP serveru:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:p="http://www.springframework.org/schema/p"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
>

   <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"
         p:defaultEncoding="utf-8"
         p:host="smtp.example.org"
         p:port="25" />

   <!-- templateMessage ... -->

</beans>

Java-based konfiguraci už lze odvodit snadno. Způsob práce s JavaMailSender se nemění, takže ukázka kódu v předchozí sekci platí i pro případ bez JNDI, a konfigurace JNDI v Tomcatu už se vás netýká.

Tags: Java návod
Created by Jakub Jirůtka on 2013-11-11, 21:46

My Recent Modifications


This wiki is licensed under a Creative Commons BY-SA 3.0 license
XWiki Enterprise 5.4.1 - Documentation