Angelo Pellegrinon - Divulgazione Open Source e Diario personale

JavaMail con Jboss: configurazione ed esempio di codice

Java Java

Ecco finalmente il primo articolo sull'argomento principale di questo "Diario": informatica. Ho avuto qualche problemino nell'utilizzo di JavaMail in una applicazione Java Enterprise deployata su JBoss. La configurazione è molto banale, bisogna però tenere in cosiderazione un paio di elementi propri di JEE altrimenti c'è il rischio che la nostra bella classe con la risorsa JavaMail iniettata non funzioni.

Come prima cosa dobbiamo configurare una risorsa JavaMail in JBoss, in questo caso la configurazione proposta è per la versione 7.1. Apriamo quindi il file di configurazione dell'application server (dopo averlo stoppato) che solitamente è standalone.xml e cerchiamo il tag:

<subsystem xmlns="urn:jboss:domain:mail:1.1">

Al cui interno inseriamo:

<mail-session jndi-name="java:jboss/mail/mioMailJndi">
  <smtp-server outbound-socket-binding-ref="smtp-mioreference" ssl="true">
<login name="email_user@dominio" password="email_password"/>
</smtp-server> </mail-session>

Fatto questo, aggiungiamo un socket binding nella configurazione dei sockets dentro al tag "socket-binding-group":

<outbound-socket-binding name="smtp-mioreference">
   <remote-destination host="host_server_smtp" port="porta_smtp"/>
</outbound-socket-binding>

Con queste semplici righe abbiamo configurato JBoss. Vi elenco per punti ciò a cui bisogna prestare più attenzione e i parametri di cui si può fare benissimo a meno:

  • Il nome jndi del tag mail-session deve essere univoco e sarà utilizzato dalla nostra applicazione JEE;
  • Il valore di socket-binding-ref nella sezione mail-session deve trovare un omonimo nel nome dell'output-socket-binding;
  • Il parametro ssl non è obbligatorio;
  • I parametri di login sono facoltativi (dipende dalla configurazione del server email che volete utilizzare), eventualmente è possibile omettere tutto il tag di login;
  • Ricordate che la porta smtp di default è la 25, se utilizzate ssl probabilmente sarà la 465.

A questo punto non ci rimane altro che scrivere una servlet o un Bean che utilizza la sessione JavaMail per inviare email:

@Resource(mappedName="java:jboss/mail/mioMailJndi")
private Session mailSession;

public void sendEmail(String mailTo, String mailText) {
    try {
        MimeMessage m = new MimeMessage(mailSession);
        Address from = new InternetAddress("Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.");
        Address[] to = new InternetAddress[] {new InternetAddress(mailTo)};
        m.setFrom(from);
        m.setRecipients(Message.RecipientType.TO, to);
        m.setSubject("Test JavaMail");
        m.setSentDate(new Date());
        m.setContent(mailText, "text/plain");
        Transport.send(m);
    } catch (Exception e) {
        System.out.println("ERRORE INVIO EMAIL");
        e.printStackTrace();
    }
}

Come si può notare il codice è molto semplice; in questo Bean abbiamo iniettato la sessione JavaMail configurata sull'application server utilizzando l'annotazione JEE @Resource:

@Resource(mappedName="java:jboss/mail/mioMailJndi")
private Session mailSession;

Una cosa importantissima da ricordare: il Bean che abbiamo creato deve essere a sua volta iniettato quando deve essere usato, se tentassimo di istanziarlo come un semplice oggetto POJO la nostra risorsa non sarebbe iniettata e non avremmo modo di utlizziare la configurazione Java Mail. Quindi ricordiamoci di non istanziarlo così:

private EmailServer emailServer = new EmailServer();

Ma invece utilizziamo l'annotazione @EJB e iniettiamolo nella classe che lo sfrutterà:

@EBJ
private EmailServer emailServer;

Lascia un commento

Assicurati di inserire (*) le informazioni necessarie ove indicato.
Codice HTML non è permesso.