Nelle scorse due puntate è stata descritta Cartolina.java, una servlet capace di gestire il servizio di e-card. In quei numeri ci si era concentrati sulla servlet, dando per scontato che una classe esterna, SendMail.java, si assumesse l'onere di generare automaticamente un messaggio di posta elettronica al destinatario. Oggetto di questo articolo è proprio quella classe.
Introduzione
Nei numeri scorsi, per spiegare il funzionamento delle cartoline elettroniche, veniva usata la metafora della cartolina postale: l'utente sceglie l'immagine, il destinatario, scrive un messaggio e la firma. Ma mentre le cartoline postali vengono fisicamente portate al destinatario, le e-card vengono salvate su un server.
Affinché il destinatario le possa leggere è necessario che gli sia inviato un messaggio di notifica che lo avvisi che qualcuno gli ha mandato la cartolina, specificando l'indirizzo a cui si deve collegare per vederla. Naturalmente il mezzo più indicato per la notifica è dato dalla posta elettronica, ed un servizio di e-card deve essere capace di inviare automaticamente un messaggio personalizzato al destinatario.
La posta elettronica è lo strumento più usato da chi si collega alla rete. Ognuno sa come spedire un messaggio, ma pochi sanno cosa succede dietro le quinte, in base a quali meccanismi i client di posta riescano a scrivere e leggere i messaggi.
Le procedure necessarie per dialogare con i server di posta non sono banali ma nemmeno eccessivamente complesse, grazie all'efficacia dei protocolli utilizzati. I client di posta sono capaci sia di inviare che di leggere messaggi, ma le due funzioni avvengono tramite protocolli diversi, SMTP e POP, spesso utilizzando server differenti.
Poiché lo scopo dell'articolo è l'invio di messaggi, il focus è sul protocollo SMTP.
Il protocollo SMTP
SMTP è un protocollo di comunicazione fra due processi:
- un
sender-SMTP
- un
receiver-SMTP
Il processo sender viene generalmente gestito da un client di posta elettronica che, su richiesta dell'utente, stabilisce una connessione con un receiver.
Attraverso il protocollo SMTP il sender comunica l'indirizzo del mittente e la lista di indirizzi dei destinatari. Se il receiver risponde positivamente, il sender inizia ad inviare i dati veri e propri relativi alla mail. Infine tra i due processi intercorre un codice di saluto e la connessione viene interrotta.
Il receiver può essere il nodo finale del processo oppure semplicemente un intermediario. In questo secondo caso il receiver stabilirà una connessione con un altro server, che a sua volta farà altrettanto fino ad arrivare al server che ospita la casella del destinatario. In questo processo a catena, denominato relay, si stabiliscono nuovamente connessioni attraverso il protocollo SMTP.
La sintassi del protocollo SMTP
L'articolo si focalizza soltanto sugli aspetti del protocollo essenziali allo scopo di generare automaticamente una mail di notifica.
L'invio del messaggio può essere scomposto in quattro parti:
1. il sender stabilisce una connessione con il receiver; 2. il sender dichiara il mittente e la lista dei destinatari; 3. il sender invia, attraverso la connessione, il messaggio vero e proprio; 4. il sender si disconnette.
L'iniziativa del dialogo è sempre gestita dal sender, mentre il receiver si limita a porsi in ascolto e a fornire una risposta, di conferma o di errore, ad ogni comando del sender.
Il sender stabilisce una connessione con il proprio server SMTP attraverso una porta TCP/IP, la porta standard è la 25. Su quella porta vi è un demone SMTP in ascolto, che accetta la connessione inviando, se tutto va bene, il messaggio 220, service ready.
Il sender saluta il receiver attraverso il comando:
HELO nomedelserver
e il receiver risponde con un messaggio 250, OK reply.
Conclusioni
L'articolo ha un taglio molto concreto: per capire SendMail.java non basta usare una libreria, bisogna prima comprendere il dialogo SMTP che la classe incapsula.
Il risultato è una lettura utile non solo per il servizio di e-card, ma per capire in generale come un programma Java possa costruire e inviare una mail interagendo direttamente con il server di posta.