Alzi la mano chi ha dovuto inviare una mail con Liferay!
Lo sappiamo, non è poi un'operazione così difficile, tuttavia ci sono sempre alcuni requisiti comuni ad ogni mail:
- preparare un template HTML
- salvare il template HTML da qualche parte
- sostituire tutti i placeholder
- inviare la mail
In questo post voglio fare un pò di chiarezza sui vari punti, così al prossimo invio di una mail sapere dove andare a leggere!
Come prima cosa aggiungiamo nel file build.gradle
tutte le dipendenze che servono:
compileOnly group: "com.liferay", name: "com.liferay.petra.content"
compileOnly group: "com.liferay", name: "com.liferay.petra.mail"
compileOnly group: "com.liferay", name: "com.liferay.petra.string"
Preparare un template HTML e salvarlo nel bundle
Il template HTML alla fine non è altro che una stringa ma se pensiamo al testo di una mail, potrebbe essere molto lungo e quindi scomodo da salvare in una costante; sarebbe molto meglio poterlo salvare in un file di testo.
Pertanto creiamo una sottocartella templates
(chiamatela pure come volete) all'interno di src/main/resources
ed inseritegli un file template_body.tmpl
(anche qui il nome è a vostra scelta) contenente il testo della mail fatto, ad esempio, nel modo seguente:
Gentile [$FIRST_NAME$] [$LAST_NAME$],
grazie per esserti registrato al sito.
Tutte le notifiche verranno spedite all'indirizzo <strong>[$EMAIL_ADDRESS$]</strong>.
Lo staff
Il testo è molto semplice ma serve solamente a mostrare come devono essere inseriti i placeholder all'interno del testo secondo lo standard Liferay: [$
seguito dal nome del placeholder (tutto maiuscolo senza spazi), il tutto chiuso da $]
.
Con il template HTML abbiamo finito; viene salvato all'interno del bundle OSGi e quindi distribuito insieme al JAR.
Sostituire tutti i placeholder
La prima operazione da fare è recuperare il template HTML; per farlo bisogna usare una classe di portale passandogli il percorso del template HTML ed il classloader di una classe situata nel medesimo bundle del template stesso.
Una volta recuperato il template si istanzia un oggetto MailTemplate
che rappresenta appunto il template.
String content = ContentUtil.get(this.getClassLoader(), "templates/template_body.tmpl");
MailTemplate mailTemplate = MailTemplateFactoryUtil.createMailTemplate(content, true);
A questo punto è necessario configurare il contesto del template, ossia l'elenco di tutte le sostituzioni da fare sui placeholder; anche in questo caso utilizzeremo delle classi di portale.
User user = ... // recuperato da qualche parte
MailTemplateContextBuilder mailTemplateContextBuilder = MailTemplateFactoryUtil.createMailTemplateContextBuilder();
mailTemplateContextBuilder.put("[$FIRST_NAME$]", user.getFirstName());
mailTemplateContextBuilder.put("[$LAST_NAME$]", user.getLastName());
mailTemplateContextBuilder.put("[$EMAIL_ADDRESS$]", user.getEmailAddress());
MailTemplateContext mailTemplateContext = mailTemplateContextBuilder.build();
A questo punto possiamo finalmente sostituire i placeholder del testo:
String body = mailTemplate.renderAsString(Locale.ITALY, mailTemplateContext);
Il grosso del lavoro è finito, abbiamo il testo finale da poter inviare via mail ma questo è facile.
MailEngine.send(from, to, subject, body, true);
Enjoy!