LEZIONE del 23 Aprile

La sigla SMTP si riferisce al protocollo standard per la trasmissione via internet di e-mail che, in italiano, suona come Protocollo elementare di trasferimento postale. Si tratta di un protocollo relativamente semplice, nel quale vengono specificati uno o più destinatari di un messaggio testuale. Verificata la loro esistenza, il messaggio viene effettivamente trasferito. E' abbastanza facile verificare come funziona un server SMTP mediante un client telnet.

Simple Mail Transfer Protocol

L'SMTP usa il protocollo di trasmissione TCP e, per accedervi, la porta 25. Per associare il server SMTP a un dato nome di dominio (DNS) si usa un record denominato MX (Mail Exchange). L'SMTP iniziò a diffondersi nei primi anni '80. A quel tempo era una alternativa all'UUCP, che era più adatto a gestire il trasferimento di e-mail fra computer la cui connessione era intermittente. L'SMTP, d'altra parte, funziona meglio se i computer sono sempre collegati alla rete.

Sendmail fu uno dei primi (se non proprio il primo) mail transfer agent ad implementare il protocollo SMTP. Fino al 2001 sono stati scritti almeno 50 programmi che implementano il protocollo SMTP come client (mittente dei messaggi) o server (destinatario del messaggio). Fra i server più diffusi si può citare Exim di Philip Hazel, Postfix di [Wietse Venema], qmail di D. J. Bernstein, e Microsoft Exchange Server .

Poichè inizialmente l'SMTP era un protocollo testuale (basato sulla codifica ASCII), non permetteva di trasmettere direttamente file binari. Furono dunque sviluppati standard come MIME per la codifica dei file binari ed il loro trasferimento attraverso SMTP. Al giorno d'oggi molti server SMTP supportano l'estensione 8BITMIME, la quale permette un trasferimento più agevole dei file binari, come se fossero file di testo.

L'SMTP è un protocollo che permette soltanto di inviare messaggi di posta, ma non di richiederli ad un server: per fare questo il client di posta deve usare altri protocolli, quali il POP3, o Post Office Protocol, l'IMAP, o Internet Message Access Protocol.

Indice

Esempio di comunicazione SMTP

Quella che segue è una transazione SMTP valida. Le righe inviate dal client sono precedute da "C:", mentre quelle inviate dal server da "S:". Su molti computer si può stabilire una connessione mediante il comando telnet:
 telnet www.example.com 25

Questo comando apre una connessione a www.example.com sulla porta SMTP.

 S: 220 www.example.com ESMTP Postfix
 C: HELO mydomain.com
 S: 250 Hello mydomain.com
 C: MAIL FROM: <sender@mydomain.com>
 S: 250 Ok
 C: RCPT TO: <friend@example.com>
 S: 250 Ok
 C: DATA
 S: 354 End data with <CR><LF>.<CR><LF>
 C: Subject: messaggio di prova
 C: From: sender@mydomain.com
 C: To: friend@example.com
 C:
 C: Ciao,
 C: questa è una prova.
 C: .
 S: 250 Ok: queued as 12345
 C: QUIT
 S: 221 Bye

Sebbene non sia obbligatorio, quasi tutti i client richiedono al server quali estensioni del protocollo SMTP il server supporta usando il saluto EHLO. Questi client usano HELO soltanto nel caso in cui il server non risponda ad EHLO.

La sicurezza del protocollo SMTP

Una delle limitazioni del protocollo SMTP originario è che non gestisce l'autenticazione dei mittenti. Per ovviare a questo problema è stata sviluppata un'estensione chiamata SMTP-AUTH.

Nonostante questo, lo spam rimane ancor oggi un grave problema. Tuttavia, non si ritiene praticabile una revisione radicale del protocollo SMTP, per via del gran numero di implementazioni del protocollo attuale (ad esempio, è stato proposto Internet Mail 2000 come protocollo alternativo).

Per questo motivo sono stati proposti diversi protocolli ausiliari per assistere le transazioni SMTP. L'Anti-Spam Research Group dell'IRTF sta lavorando su varie proposte di autenticazione e-mail centrate sulla flessibilitè, leggerezza e scalabilità.

Gli standard RFC

SMTP utilizza il protocollo di trasporto TCP, ed in particolare un SMTP server rimane costantemente in ascolto sulla porta 25. Il server SMTP si occupa poi di trasferire i messaggi nelle caselle di posta (mailbox) dei destinatari, oppure qualora non fosse il diretto responsabile di queste, inoltrarli (operazione di relay) al server che provvederà a farlo. La sintassi dei comandi è case-insensitive, ed è composta da istruzioni seguite da uno o più parametri terminate da un CRLF (Invio).

Il protocollo è descritto nella RFC 821, ma lavora in stretta collaborazione con altri standard come la RFC 822 che descrive la sintassi degli headers della mail, la RFC 1049 che definisce le strutture dati per interpretare correttamente il contenuto delle mail e la RFC 974 che si occupa del routing delle mail tramite DNS.

Lo standard definito dalla RFC 821, aveva diversi limiti riguardanti per esempio la dimensioni dei messaggi oppure la trasmissione di mail non in inglese o diverse dal semplice plain text. Per ovviare a questa restrizione è stato necessario estendere il protocollo tramite la RFC 1425 riguardante le SMTP Service Extensions. Per maggiori informazioni si possono consultare direttamente i documenti ufficiali della rete, alcuni link dei quali sono riportati di seguito.

Principali Comandi SMTP

Il protocollo SMTP utilizza, per la trasmissione di messaggi, un certo numero di comandi attraverso i quali il client trasmette al server le informazioni necessarie all'invio della posta elettronica verso l'host destinatario.

I principali comandi SMTP, accompagnati da una breve spiegazione, sono elencati di seguito perchè, altrimenti, è possibile ottenere una spiegazione più esauriente e completa a partire dal link indicato:

Una sessione SMTP è costituita da almeno sei fasi:

  1. Il client SMTP contatta il server sulla porta TCP 25. Se questo è in ascolto e la connessione viene accettata risponde con un messaggio 220 (Ready);
  2. Il client chiede di stabilire la sessione SMTP inviando il comando HELO seguito dal FQDN (Fully Qualified Domani Name). Se il server accetta rispondo con un messaggio 250 (Ok);
  3. Il client indica il proprio indirizzo tramite il comando MAIL FROM: <indirizzo mittente>. Il server risponde con 250 (Ok) per ogni destinatario accettato;
  4. Successivamente il client indica al server i destinatari del messaggio tramite RCPT TO: <indirizzo destinatario> ed il server risponde per ogni destinatario accettato un codice 250 (Ok);
  5. Il client comunica al server l'intenzione di scrivere il corpo del messaggio con DATA. Il server risponde con un codice 354 e indica come marcare il termine del messaggio. I campi come Date, Subject, To, Cc, From vanno inseriti tra i dati della mail;
  6. Completato il messaggio da scrivere tramite . il server memorizza la mail. A questo punto è possibile, scrivere un nuovo messaggio oppure inviare il comando QUIT, dopo il quale il server invia i messaggi e risponde con un codice 221 (Closing) e la connessione TCP viene terminata;

Esempio di una sessione SMTP da linea di comando:
telnet localhost 25
Trying 127.0.0.1...
Connected to localhost (127.0.0.1).
Escape character is '^]'.
220 cezanne.swan.org ESMTP Sendmail 8.13.5/8.13.5; Mon, 16 Apr 2007 23:14:54 +0200
Tramite il programma telnet viene contattato il server SMTP sulla porta TCP 25
E' possibile notare dal messaggio ESMTP Service che il server supporta le SMTP Service Extensions

HELO
501 5.0.0 HELO requires domain address
HELO swan.org
250 cezanne.swan.org Hello localhost [127.0.0.1], pleased to meet you
L'autenticazione avviene con HELO anzichè EHLO e quindi il client non usufruisce delle SMTP Service Extensions qui supportate
HELP
214-2.0.0 This is sendmail version 8.13.5
214-2.0.0 Topics:
214-2.0.0 HELO EHLO MAIL RCPT DATA
214-2.0.0 RSET NOOP QUIT HELP VRFY
214-2.0.0 EXPN VERB ETRN DSN AUTH
214-2.0.0 STARTTLS
214-2.0.0 For more info use "HELP <topic>".
214-2.0.0 To report bugs in the implementation send email to
214-2.0.0 sendmail-bugs@sendmail.org.
214-2.0.0 For local information send email to Postmaster at your site.
214 2.0.0 End of HELP info
HELP MAIL
214-2.0.0 MAIL From:<sender> [ <parameters> ]
214-2.0.0 Specifies the sender. Parameters are ESMTP extensions.
214-2.0.0 See "HELP DSN" for details.
214 2.0.0 End of HELP info
Il client richiede una lista dei comandi disponibili tramite help e successivamente un aiuto per il comando MAIL
MAIL FROM:antonio@swan.org
250 2.1.0 antonio@swan.org... Sender ok
RCPT TO:antonio@localhost
250 2.1.5 antonio@localhost... Recipient ok
DATA
Inizia l'inserimento del corpo della mail
354 Enter mail, end with "." on a line by itself
From:antonio@swan.org
To:antonio@localhost
Ciao,
questo è un messaggio di prova
per esemplificare il funzionamento
del protocollo SMTP.
Antonio
.
Il comando "." punto termina l'inserimento del messaggio; Il server SMTP lo accetta
250 2.0.0 l3GLEsMI002555 Message accepted for delivery
QUIT
221 2.0.0 cezanne.swan.org closing connection
Connection closed by foreign host.
La connessione TCP termina e si ritorna al prompt

Il client di posta elettronica (Kmail, Outlook o Eudora) si occupa solitamente di comunicare con il server al posto nostro in base alla propria configurazione.

Il server SMTP dopo aver ricevuto il messaggio da inoltrare, lo imbusta opportunamente, aggiungendo un header di informazioni e poi lo consegna al destinatario. Quello che si ottiene è riportato di seguito

From antonio@swan.org  Mon Apr 16 23:20:35 2007
Return-Path: 
Received: from swan.org (localhost [127.0.0.1])
        by cezanne.swan.org (8.13.5/8.13.5) with SMTP id l3GLEsMI002555
        for antonio@localhost; Mon, 16 Apr 2007 23:18:33 +0200
Date: Mon, 16 Apr 2007 23:14:54 +0200
Message-Id: <200704162118.l3GLEsMI002555@cezanne.swan.org>
From: antonio@swan.org
To: antonio@cezanne.swan.org

Ciao,
questo e' un messaggio di prova
per esemplificare il funzionamento
del protocollo SMTP.
Antonio

Si confronti le informazioni che sono state rispetto a quelle che il server ha effettivamente ricevuto tramite i comandi del protocollo SMTP.