La posta elettronica esiste, in una forma o nell'altra, sin dagli anni ’60. Le persone si lasciavano messaggi l'un l'altro utilizzando una serie di metodi diversi sui computer mainframe, ma solo nell'agosto 1982, quando l'Information Sciences Institute pubblicò il Simple Mail Transfer Protocol (SMTP; RFC 821), fu proposto un metodo standardizzato per l'invio e la ricezione di e-mail.
SMTP è diventato rapidamente popolare su ARPANET, sostituendo i vecchi metodi più complicati usati per spostare la posta da un mainframe all'altro, ed è stato supportato per la prima volta alla fine del 1982 dal primo agente di trasferimento della posta Sendmail in BSD 4.1c.
Da allora il protocollo è stato rivisto ed esteso con una certa regolarità, ma il metodo fondamentale per l'invio della posta è rimasto in gran parte invariato.
Il protocollo è basato sul testo e inizialmente non supportava la consegna di dati binari. Tuttavia, il fatto di essere basato sul testo ha reso il protocollo facile da implementare e mantenere. MIME (Multipurpose Internet Mail Extensions) è diventato popolare alla fine degli anni ’80 per la codifica e l'invio di dati binari tramite SMTP. Oggi SMTP è il protocollo dominante per l'invio e la ricezione di e-mail su Internet e la sua conoscenza è essenziale per qualsiasi amministratore di rete.
Poiché SMTP è basato sul testo, l'apprendimento del protocollo è molto più semplice rispetto a molti altri e un programma in grado di inviare dati ASCII sulla porta 25 del TCP/IP, come Telnet, è tutto ciò che è necessario per comunicare direttamente con un server SMTP.
La posta viene inviata via SMTP in una transazione, cioè se l'invio del messaggio non si completa completamente e senza generare un errore, il messaggio viene abbandonato. La RFC 821 descrive una transazione come composta da tre fasi: specificare un mittente, fornire uno o più destinatari e quindi inviare il messaggio stesso. Tuttavia, è più semplice pensare a una transazione SMTP in 5 fasi:
- Stretta di mano
- Indirizzo di invio della risposta
- Inviare i destinatari
- Inviare i dati del messaggio
- Fine della transazione
Stretta di mano
Al momento della connessione a un server SMTP sulla porta 25, il mittente di un messaggio deve attendere che il destinatario accetti la connessione e si identifichi nel seguente formato:
220 [dominio] [Informazioni sul servizio]
Esempio: 220 example.com Servizio pronto
Il mittente deve quindi identificarsi con il destinatario utilizzando il comando HELO.
HELO [dominio]
Esempio: HELO example.com
I server di posta si aspettano che ciascuno di essi si identifichi utilizzando un nome di dominio che può essere utilizzato per verificare l'identità del server eseguendo una ricerca del record MX, tuttavia il server ricevente non deve rifiutare la connessione in questa fase anche se l'identità del mittente non può essere verificata e quindi deve rispondere con:
250 [Messaggio]
Esempio: 250 example.com Hello bob at example.com
Il codice di risposta 250 è la risposta generica ‘OK’ di un server SMTP che indica che l'ultima azione è stata completata con successo.
Inviare l'indirizzo di risposta:
Una volta che i due server hanno eseguito l'handshake, la transazione SMTP è iniziata e si può iniziare a inviare comandi al server. Se si desidera vedere i comandi supportati dal server, inviare il comando HELP e il server SMTP dovrebbe rispondere con un messaggio che specifica quali comandi sono supportati.
Per inviare un messaggio a un utente su questo server, però, dobbiamo prima impostare un indirizzo di risposta. L'indirizzo di risposta deve essere fornito per primo, in modo che se si verificano errori durante la transazione SMTP, questi possano essere segnalati a questo indirizzo. A tale scopo si utilizza il comando ‘MAIL FROM:’:
MAIL DA:
Esempio: MAIL DA:
Notare i caratteri Meno di e Maggiore di. Questi sono richiesti dalla RFC 821 per contenere l'indirizzo e-mail stesso. Se l'indirizzo viene accettato, SMTP restituirà una risposta 250 OK.
Inviare i destinatari
Dopo aver impostato un indirizzo di risposta, SMTP ci permetterà di identificare i destinatari del messaggio. A tale scopo si utilizza il comando ‘RCPT TO:’:
RCPT TO:
Esempio: RCPT TO:
Se il destinatario accetta la posta per questo utente e può accettare il messaggio in questo momento, deve rispondere con una risposta 250 OK. Se invece la posta non viene accettata per questo utente, verrà inviata una risposta di fallimento 550 o il codice di errore appropriato. Se riceviamo una risposta 250 OK, possiamo continuare a inviare i dati del messaggio.
Inviare i dati del messaggio
L'invio di dati via SMTP è abbastanza semplice, ma i formati dei messaggi possono essere piuttosto complicati, soprattutto quando si inviano allegati binari. Per iniziare l'invio di dati si deve impartire il comando ‘DATA’, al quale il server deve rispondere con 354 Intermediate reply, ossia:
354 Inserire il messaggio che termina con “.” su una riga a sé stante
Il messaggio più semplice che possiamo inviare è un messaggio di testo semplice, che non richiede l'uso del formato di messaggio MIME a più parti. Tutti i messaggi, di testo semplice o meno, si concludono con l'invio di una riga contenente solo un carattere punto. Inoltre, prima dell'invio di un messaggio si possono inviare alcune informazioni di intestazione come Data, Oggetto, A, Cc e Da.
Esempio:
DATI
354 Inserire il messaggio che termina con “.” su una riga a sé stante
Oggetto: Questo è l'oggetto del messaggio di testo del piano.
Questo è il corpo del messaggio in chiaro.
Se accettato, il server SMTP restituirà una risposta 250 OK o un codice di errore se la transazione è fallita o incompleta. Si noti il carattere punto alla fine della riga del corpo del messaggio: è solo quando un carattere punto si trova su una riga da solo che il server interrompe l'ascolto dei dati. Se il server mittente sta inviando un messaggio che causerebbe la chiusura prematura della sessione di dati, poiché il messaggio contiene un singolo carattere punto su una riga, deve aggiungere un ulteriore carattere punto alla riga.
Conclusione della transazione
Fino a questo momento, tutto ciò che è stato inviato al server SMTP ricevente è considerato monouso. Se il comando ‘QUIT’ non viene inviato prima della chiusura della connessione, il server di destinazione cancellerà semplicemente tutti i dati del messaggio che sono stati memorizzati. Utilizzato originariamente per chiudere una connessione, oggi è comunemente usato per rappresentare una transazione completata: molti server di posta attendono il comando QUIT prima di accodare la posta all'agente di trasferimento dei messaggi. Una volta inviato il comando QUIT, il server di destinazione dovrebbe inviare una risposta 221 per confermare il completamento della transazione e la chiusura della connessione.
Se state imparando il protocollo SMTP, vi consigliamo di leggere le RFC 821, 2476 e 2554. È necessario ricordare, soprattutto quando si legge l'RFC 821, che dal 1982 i server di posta elettronica sono cambiati in modo significativo, in parte in risposta all'abuso da parte degli spammer.
