Passa al contenuto principale

Invio di Email

Prima di iniziare​

Prima di procedere, assicurati di avere nozioni di base di JavaScript e di avere già le nozioni di base di Netuno con la procedura passo passo disponibile nell'Accademia.

Dimostrazione dell'Invio di Email​

Con Netuno è molto semplice inviare email, sia con allegati sia con immagini incorporate nel contenuto stesso (utile nel caso delle firme).

L'applicazione fornita con Netuno denominata demo (applicazione dimostrativa) contiene molti esempi delle possibili implementazioni di codice in vari linguaggi, inclusa la dimostrazione dell'invio di email tramite il servizio mail-send che si trova in:

/apps/demo/server/services/samples/groovy/mail-send.groovy
/apps/demo/server/services/samples/javascript/mail-send.js
/apps/demo/server/services/samples/kotlin/mail-send.kts
/apps/demo/server/services/samples/python/mail-send.py
/apps/demo/server/services/samples/ruby/mail-send.rb

Configurazione​

Il primo passo sarà configurare l'account SMTP che Netuno utilizzerà per l'invio di email.

Per farlo, all'interno dell'applicazione che stai sviluppando, vai al file di configurazione dell'ambiente. In questo esempio utilizzeremo il file di ambiente di sviluppo che si trova in:

  • config/_development.json

Verifica che non esistano già configurazioni per SMTP; se non esistono ancora, alla fine del file di configurazione (in formato JSON) aggiungi i parametri di configurazione SMTP:

{
...,
"smtp": {
"default": {
"enabled": true,
"host": "smtp.gmail.com",
"port": 465,
"ssl": true,
"username": "*****@gmail.com",
"password": "*****"
}
}
...
}

Se stai configurando per Gmail, sostituisci solo gli asterischi con le tue credenziali e attiva la connessione SMTP nelle impostazioni del tuo account Gmail. Altrimenti sostituisci tutti i parametri con quelli del tuo account SMTP.

Dopo aver salvato le modifiche, è sufficiente riavviare Netuno per applicare le modifiche alla configurazione. Queste sono le configurazioni predefinite per l'invio di email, come indica il nome default.

...
"default": {
...
}
...

Puoi aggiungere altri account SMTP, ma solo uno potrà essere definito come predefinito.

Per aggiungere altri account SMTP, basta ripetere il blocco di configurazione SMTP predefinito e sostituire il nome default con un altro nome a tua scelta, ad esempio:

{
...,
"smtp": {
"default": {
"enabled": true,
"host": "smtp.gmail.com",
"port": 465, "ssl": true,
"username": "*****@gmail.com",
"password": "*****"
},
"test": {
"enabled": true,
"host": "smtp.gmail.com",
"port": 465,
"ssl": true,
"username": "*****@gmail.com",
"password": "*****"
}
}
...
}

Una configurazione simile all'esempio sopra permetterà di utilizzare l'account default quando viene chiamato nel codice nel modo seguente:

const smtp = _smtp.init()

E per utilizzare la configurazione test, basta aggiungere il nome della configurazione come parametro alla funzione _smtp.init() nel modo seguente:

const smtp = _smtp.init("test")

Se non aggiungi un nome di configurazione come parametro, verrà sempre utilizzato l'account predefinito.

Codice Dettagliato​

Analizziamo ora con attenzione il codice di esempio fornito da Netuno. In questo caso è in JavaScript ed è strutturato come segue:

Inizializzazione di SMTP:

const smtp = _smtp.init()

Ricorda che puoi inizializzare con un'altra configurazione, ad esempio: _smtp.init("test")

Aggiungendo .to alla variabile smtp si definisce l'indirizzo del destinatario dell'email; in caso di più destinatari basta separarli con ‘;‘ o ‘,‘:

smtp.to = '*****@gmail.com'

Aggiungendo .from si definisce l'indirizzo del mittente dell'email:

smtp.from = '*****@gmail.com'

Aggiungendo .cc si definisce l'indirizzo dei destinatari in copia dell'email; in caso di più destinatari in copia basta separarli con ‘;‘ o ‘,‘:

smtp.cc = '*****@gmail.com'

Lo stesso vale per .bcc, con cui si definiscono i destinatari in copia nascosta:

smtp.bcc = '*****@gmail.com'

Aggiungendo .subject si definisce l'oggetto dell'email:

smtp.subject = 'Test di Netuno'

Aggiungendo .text si definisce il contenuto in testo semplice:

smtp.text = 'Hai ricevuto questa email?'

Aggiungendo .html si definisce il contenuto dell'email in HTML:

smtp.html = `<div>
<img src="cid:logo" width="200" />
Hai ricevuto questa email?</p>
</div>`

Per aggiungere un'immagine come allegato si procede come mostrato sopra; nell'HTML, per le immagini (img), nell'attributo src si definisce come prefisso il cid: (Content ID) e subito dopo il cid definito quando si aggiungono allegati con la funzione attachment (come mostrato sotto).

Per aggiungere l'immagine allegata all'email, si aggiunge .attachment alla variabile smtp nel modo seguente:

smtp.attachment(
"logo.png", // File
"image/png", // Formato del file
_storage.filesystem("server", "samples/mail", "logo.png").file(), // Posizione del file
"logo" // Nome della variabile definita in "cid:logo"
)

Nota che il cid (Content ID) è necessario solo per incorporare immagini allegate nel contenuto HTML dell'email.

Per aggiungere un allegato senza incorporarlo nell'HTML (ad esempio documenti), si procede nel modo seguente:

smtp.attachment(
"documento.txt",
"text/plain",
_storage.filesystem("server", "samples/mail", "documento.txt").file()
)

Infine, per inviare l'email basta inserire il seguente codice:

smtp.send()

Infine, se tutto è stato configurato correttamente, riceverai un'email simile alla seguente:

invio-email1.png

Nota che, a seconda del tuo client di posta, potrà differire dall'immagine sopra.

Esempio Completo con Template​

Inserire contenuto HTML in mezzo al codice non è molto elegante, come mostrato sopra:

smtp.html = `<div>
<img src="cid:logo" width="200" />
Hai ricevuto questa email?</p>
</div>`

Per evitare questo e mantenere il codice più pulito ed elegante, il contenuto HTML deve essere importato come template, nel modo seguente:

smtp.html = _template.getOutput('email/contatto', dati)

In questo esempio, la configurazione SMTP nella configurazione dell'applicazione sarebbe così:

...
"smtp": {
"contatto": {
"enabled": true,
"host": "MIO.SERVER.com",
"port": 465,
"ssl": true,
"subjectPrefix": "Contatto Sito Web - ",
"from": "noreply@MIO.DOMINIO.com",
"to": "info@MIO.DOMINIO.com",
"username": "noreply@MIO.DOMINIO.com",
"password": "S3gr3d0"
}
},
...

Osserva qui sotto come può essere utilizzato in questo esempio di codice di servizio completo, che potrà trovarsi nel file server/services/contatto.js:

const nome = _req.getString("nome")
const email = _req.getString("email")
const oggetto = _req.getString("oggetto")
const messaggio = _req.getString("messaggio")

const smtp = _smtp.init("contatto")

smtp.subject = oggetto

smtp.text = "Contenuto in HTML."

const dati = _val.map()
.set("nome", nome)
.set("email", email)
.set("oggetto", oggetto)
.set("messaggio", messaggio)

smtp.html = _template.getOutput('email/contatto', dati)

smtp.attachment(
"logo.png",
"image/png",
_app.file("public/images/logo.png"),
"logo"
)

smtp.send()

_out.json(
_val.map()
.set("result", true)
)

Nel percorso relativo del template non è necessario inserire l'estensione .html, e nota che opzionalmente è possibile passare informazioni all'interno del template.

Il contenuto HTML del template deve essere definito in un file separato che deve trovarsi nella cartella server/templates/; questo percorso si trova a partire dalla cartella radice dell'applicazione.

Seguendo l'esempio mostrato sopra, il file template di esempio si troverà qui:

  • server/templates/email/contatto.html

Il contenuto di esempio di questo file potrà essere:

<div style="padding: 40px; background: #ffffff;">
<img src="cid:logo" height="60" />
<div style="padding: 20px;"></div>
<div style="padding: 40px; background: #ffffff; font-size: 20px; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; border: 5px solid #666;">
<h1 style="color: #666; font-weight: bold; margin-bottom: 15px;">
Contatto del Sito Web
</h1>
<p>Nome: _{&data=nome}</p>
<p>Email: _{data=email}</p>
<p>Titolo: _{&data=oggetto}</p>
<p>_{&data=messaggio}</p>
</div>
</div>

Quando vengono iniettati dati nel template con _{data=...}, il & viene aggiunto quando deve essere eseguita la codifica dei caratteri speciali in HTML, diventando _{&data=...}; subito dopo il = al posto dei ... c'è la chiave del contenuto che verrà iniettato.

Configurazioni Avanzate​

Le configurazioni di ambiente config/_*.json permettono molte altre configurazioni avanzate.

Le proprietà di smtp utilizzate nel codice come .from, .to, .cc, .bcc, .subject, .text e .html possono essere definite nella configurazione per essere predefinite nel modo seguente:

...
"default": {
...
"from": "*****@gmail.com",
"to": "*****@gmail.com",
"cc": "*****@gmail.com",
"bcc": "*****@gmail.com",
"subject": "Titolo predefinito...",
"text": "Contenuto predefinito... ok!",
"html": "<p>Contenuto predefinito... <b>ok!</b></p>"
...
}
...

Predefinire .from è piuttosto utile, dato che normalmente l'invio delle email avviene sempre dallo stesso indirizzo.

Sono possibili anche altre configurazioni. Segue un elenco completo delle stesse:

PARAMETROTIPOPREDEFINITODESCRIZIONE
enabledbooleantrueAttiva e disattiva l'invio di email.
debugbooleanfalseAbilita la modalità debug, che mostra messaggi che dettagliano la comunicazione con il server.
protocolstringDefinisce il tipo di protocollo, smtp o smtps.
hoststringNome o IP del server SMTP.
portinteger465Numero della porta del server SMTP.
sslbooleantrueAttiva SSL.
tlsbooleanfalseAttiva TLS
socketFactoryFallbackbooleantrueSe fallisce la generazione del Socket, verrà utilizzato il socket nativo java.net.Socket.
socketFactoryClassstringDefinisce una classe che implementa l'interfaccia javax.net.SocketFactory che verrà utilizzata per generare i socket per SMTP.
socketFactoryPortintegerDefinisce la porta che deve essere utilizzata dai socket.
quitWaitbooleanfalseSe attivato attende la risposta del server dopo il comando QUIT; se disattivato chiude subito la connessione con il server dopo il comando QUIT.
authMechanismsstringElenco dei meccanismi di autenticazione; per impostazione predefinita è “LOGIN PLAIN DIGEST-MD5 NTLM”, così supporta tutti i meccanismi.
authNTLMDomainstringDominio di autenticazione NTLM.
usernamestringDefinisce l'utente nell'autenticazione con il server.
htmlstringContenuto HTML dell'email.
passwordstringDefinisce la password nell'autenticazione con il server.
fromstringIndirizzo email di chi invia.
tostringIndirizzo email di chi deve ricevere; possono essere aggiunte altre email separate da “;” o “,”.
ccstringIndirizzo email di chi deve ricevere una copia; possono essere aggiunte altre email separate da “;” o “,”.
bccstringIndirizzo email di chi deve ricevere una copia nascosta; possono essere aggiunte altre email separate da “;” o “,”.
subjectPrefixstringDefinisce un prefisso al titolo dell'email, così garantisce che tutte le email inviate abbiano il prefisso.
subjectstringOggetto dell'email.
textstringContenuto testuale dell'email in testo semplice.

Se hai qualche domanda, non esitare a contattarci tramite i mezzi indicati in fondo alla pagina.

Buon sviluppo!