Posielanie emailov a J2EE

Posielanie e-mailov z java aplikácie nie je určite žiadna veda a nepochybne už mnoho vývojárov takúto funkcionalitu vo svojej aplikácii implementovalo. Samotné posielanie s využitím JavaMail API sa dá nájsť a naimplementovať doslova za pár minút. Čo ak ale potrebujeme mať aplikáciu jednoducho konfigurovateľnú alebo potrebujeme použiť zabezpečené pripojenie k mailovému serveru? Ak je aplikácia nasadená v aplikačnom serveri GlassFish, k dispozícii máme všetko čo potrebujeme. Stačí len vedieť ako na to.

Konfigurácia cez webové administrátorské rozhranie

Cez menu sa treba dostať cez “Resources > JavaMail Sessions > New”.
V editore pre session sa nachádzajú nasledovné polia:

  • JNDI Name: názov zdroja
  • Mail Host: adresa mailového servera
  • Default User:používateľ
  • Default Sender Address: defaultnúe-mailovú adresu používateľa
  • Store Protocol: Poštový Protokol pop3 alebo imap
  • Store Protocol Class: v prípade imap-u bude trieda com.sun.mail.imap.IMAPStore
  • Transport Protocol: smtp alebo smtps.
  • Transport Protocol Class: v prípade smtps to bude com.sun.mail.smtp.SMTPSSLTransport.

Ak je potrebné nastaviť aj port či heslo, treba ich zadať cez „Additional Properties“. Takto potom vyzerá konfigurácia JavaMail Session priamo v domain.xml:

<mail-resource 
  transport-protocol-class="com.sun.mail.smtp.SMTPSSLTransport" 
  host="smtp.mail.swan.sk" jndi-name="mail/4q" transport-protocol="smtps" 
  from="mail@4q.sk" user="mail@4q.sk">
<property name="mail-smtps-port" value="465"></property>
<property name="mail-smtps-auth" value="true"></property>
<property name="mail-smtps-password" value="SrdmzA3?r"></property>
</mail-resource>

Pridanie certifikátu do TrustStoru Glassfishu

Ak chcete používať zabezpečený prístup, je potrebné pridať aj certifikát emailového servera do TrustStore aplikačného servera (v našom prípade Glassfish 4.1). Ako na to?

  • Stiahnite certifikát mailového servera napr. pomocou InstallCert:
java -jar InstallCert.jar smtp.mail.swan.sk:465
  • Po výbere certifikátu sa vytvorí v aktuálnom adresári súbor jssecacerts. Vyexportujte certifikát:
keytool -export -alias smtp.mail.swan.sk-1 -keystore jssecacerts 
-file swan_cert.cer -storepass changeit
  • Vznikne súbor swan_cert.cer. Pridajte certifikát do TrustedStore GlassFish servera:
keytool -import -alias smtp.mail.swan.sk-1 -file swan_cert.cer 
-keystore /opt/glassfish/prod/glassfish/domains/domain1/config/cacerts.jks 
-storepass changeit

Posielanie e-mailu z kódu

A teraz nám už nič nebráni odoslať email v rámci vyvíjanej aplikácie. Takto by mohol vyzerať príklad zdrojového kódu:

Context initCtx = new InitialContext();
Session mailSession = (Session) initCtx.lookup(“mail/4q“);

Message message = new MimeMessage(mailSession);
recipients = InternetAddress.parse(mailAddresses, false);
message.setRecipients(RecipientType.TO, recipients);
message.setSubject(fileName);

BodyPart textMessageBody = new MimeBodyPart();
textMessageBody.setText("Toto je automatický email.");

from = new InternetAddress(mailSession.getProperty("mail.from"))
message.addFrom(new InternetAddress[]{from});

Pridanie prílohy do odosielaného emailu

MimeBodyPart attachmentBody = new MimeBodyPart();
DataSource source = new ByteArrayDataSource(pdf, "application/pdf");
attachmentBody.setDataHandler(new DataHandler(source));
attachmentBody.setFileName(fileName + ".pdf");

Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textMessageBody);
multipart.addBodyPart(attachmentBody);
message.setContent(multipart);
message.setSentDate(new Date());
Transport.send(message);