Il protocollo SMTP
Quando viene spedita una e-mail, si usa un programma
che, tramite il protocollo SMTP,
invia un messaggio ad un server in ascolto, tipicamente un ISP (Internet
Service Provider).
SMTP sta per Simple
Mail Transfer Protocol ed e' descritto
nell'RFC 821
(vedi sito "The Internet Engineering Task
Force" all'indirizzo http://www.ietf.org).
Il funzionamento del protocollo e' molto semplice:
si basa su uno scambio di messaggi, il cui numero e significato dipende
dai diversi possibili esiti della comunicazione (destinatario conosciuto,
destinatario sconosciuto, host sconosciuto, ecc.).
Vediamone il funzionamento ad un livello di dettaglio
descrittivo.
-
L'utente
invia una richiesta di invio
per una e-mail con un programma (mittente).
-
Viene stabilita una comunicazione bidirezionale fra il mittente ed il server
che risponde alla richiesta. Questo server puo' essere un intermediario
fra il mittente ed il destinatario, oppure puo' essere il destinatario
stesso. Per comodita' verra' chiamato comunque destinatario.
Le entita' che prendono parte alla comunicazione, si scambiano messaggi
uno alla volta, aspettando poi la risposta dell'altro.
-
Il destinatario risponde al mittente, indicando che
la connessione e' andata a buon fine e lo scambio di messaggi puo' aver
luogo.
-
Il mittente si fa riconoscere inviando la propria
identita'.
-
Il destinatario puo' rispondere sia affermativamente
(la comunicazione puo' andare avanti) che negativamente (il mittente non
puo' inviare alcun messaggio, almeno non con questa connessione ed in questo
momento). Supponiamo che risponda affermativamente.
-
Il mittente indica, quindi, uno
o piu' utenti che dovranno ricevere il
messaggio. Gli utenti de raggiungere potranno essere altri destinatari,
oppure utenti nel dominio di questo destinatario.
-
Il destinatario puo' accettare uno, tutti o nessuno
degli utenti segnalati. Supponiamo che ne venga accettato almeno uno.
-
Il mittente invia il testo
della e-mail.
-
Il destinatario prova a girare il testo all'utente
corretto, non mancando di segnalare un eventuale errore.
-
La comunicazione giunge allora al termine.
Il mittente, comunica con il destinatario mediante
messaggi ben definiti. Nella tabella seguente vengono mostrati i tipi
di messaggio che puo' mandare il mittente,
definiti nell'RFC821. Seguendo i link si arriva ad una descrizione piu'
dettagliata dei singoli messaggi (<invio>=CRLF, cioe' "Carriage return+Line
feed", in ASCII "13"+"10" decimali; [...] = opzionale; messaggio=DATA,EXPN,
ecc.; "testo e-mail"="cio' che si vuole spedire").
| DATA |
Le linee successive vengono considerate come
i dati del messaggio. |
EXPN
(expand) |
Se l'argomento e' una mailing-list, allora viene
restituito un elenco di nominativi e relativi indirizzi. |
| HELO(hello) |
Identificazione del mittente da parte del ricevente. |
HELP |
Richiesta da parte del mittente di alcune informazioni
utili (fra cui i comandi). |
| MAIL |
Inizio dello scambio di informazioni relative
alla e-mail. |
NOOP
(no operation) |
Nessun effetto. |
| QUIT |
Termine della connessione. |
RCPT
(recipient) |
Indirizzo di arrivo del messaggio. |
| RSET
(reset) |
Interruzione del processo di scambio dei messaggi. |
SAML
(send and mail) |
Invio al terminali dell'utente destinatario ed
alla relativa casella di posta. |
|
| SEND |
Invio ad uno o piu' terminali. |
SOML
(send or mail) |
Prova ad inviare il messaggio al terminale dell'utente
destinatario. Se l'operazione non riesce, viene mandato nella casella di
posta. |
| TURN |
|
VRFY
(verify) |
Verifica che l'argomento passato rappresenti
un utente. |
I messaggi visti possiedono la particolarita'
di non essere sensibili alle maiuscole e minuscole (non
sono case-sensitive). Ad esempio, si puo'
scrivere "MAIL", come si puo' scrivere "mAil": e' sempre lo stesso messaggio.
Ogni messaggio mandato, se non ci sono problemi
con la connessione, riceve una risposta formata da un codice numerico seguito
da un testo esplicativo:
<numero> <testo>
Nella seguente tabella vengono mostrati i codici
numerici che il server puo mandare come risposta ed il significato del
testo che li segue. I testi indicati dopo i codici potrebbero non corrispondere
letteralmente per ogni server, ma essere simili.
|
211
|
Indica lo stato del sistema o la risposta ad
una richiesta di aiuto.
Viene generato a seguito dell'invio del messaggio
HELP.
E' usato in caso successo. |
|
214
|
Spiega l'utilizzo di un comando.
Viene generato a seguito dell'invio del messaggio
HELP.
E' usato in caso di successo. |
|
220
|
Riporta il dominio e l'indicazione di servizio
pronto:
220 <spazio> <dominio> <spazio> Service ready <invio>
Viene generato appena viene stabilita la connessione
con il ricevente. Il mittente, si connette, legge dal canale (di solito
un socket) ed il testo letto ha la sintassi specificata. Indica che la
connessione e' stata stabilita con successo
e che si puo' cominciare a scambiare messaggi. |
|
221
|
Riporta il dominio e l'indicazione di chiusura
del canale di trasmissione:
221 <spazio> <dominio> <spazio> Service closing transmission channel <invio>
Viene generato in seguito alla chiusura della comunicazione
con il messaggio QUIT.
Indica il successo
dell'operazione. |
| 250
|
Indica che la richiesta (o l'azione) specificata
con il messaggio mandato e' stata accettata (successo).
Generalmente, al codice segue un "OK", ma potrebbero seguire anche altre
cose a seconda dei messaggi che generano tale risposta.
250 <spazio> OK <invio>
250 <spazio> <dominio> <invio>
250 <spazio> [<utente> <spazio>] < <indirizzo> > <invio>
...
La prima e' la risposta
generale. La seconda e' generata dal messaggio
HELO.
La terza risposta viene a seguito di una richiesta con VRFY
o con EXPN.
I messaggi che non portano alla generazione di questo codice sono HELP
e QUIT. |
|
251
|
Puo' essere restituito a seguito di RCPT
o VRFY,
ed indica che il comando jmpartito con il messaggio, ha avuto successo,
ma l'utente non e' locale ed il testo della mail verra' spedito all'indirizzo
indicato dopo il valore numerico.
251 <spazio> User not local; will forward to <spazio> < <indirizzo> > <invio>
|
|
354
|
Dopo aver ricevuto questo messaggio, si puo'
iniziare ad inviare, linea per linea, il testo della mail. Viene generato
da DATA.
La sintassi e' la seguente:
354 <spazio> Start mail input; end with <CRLF>.<CRLF> <invio>
354 <spazio> Send the mail data, end with . <invio>
...
dove "<CRLF>" e' inteso letteralmente e non come
sostituzione di un carattere. |
|
421
|
Indica che il servizio non e' disponibile presso
il dominio contattato (anche a seguito di uno shutdown del server). E'
usato in caso di insuccesso:
la connessione viene successivamente chiusa. E' generato da tutti
i tipi di messaggio, tranne che da QUIT e TURN.
421 <spazio> <dominio> <spazio> Service not available, closing transmission channel <invio>
|
|
450
|
Viene generato da RCPT
in caso di insuccesso.
Serve a specificare che la casella postale indicata come destinatario,
non e' disponibile (momentaneamente). Se esiste un solo recipiente (destinatario),
la mail non viene mandata.
450 <spazio> User not active now <invio>
...
|
|
451
|
Indica che l'azione richiesta con il messaggio
che ha generato questo codice, e' stata interrotta per un errore occorso
durante l'esecuzione (insuccesso).
Il codice puo' essere generato da MAIL,
RCPT,
DATA,
SEND,
SOML
e
SAML.
451 <spazio> Requested action aborted: error in processing <invio>
...
|
|
452
|
Ottenere questo messaggio in risposta, significa
che l'azione richiesta non puo' essere compiuta a causa della scarsita'
di risorse (insuccesso).
Puo' essere generato da MAIL,
RCPT,
DATA,
SEND,
SOML,
SAML.
452 <spazio> Requested action not taken: insufficient system storage <invio>
...
|
|
500
|
E' generato in caso di errore di sintassi o messaggio
sconosciuto (insuccesso)
da tutti
i tipi di messaggio.
500 <spazio> <comando_digitato> command unrecognized <invio>
...
|
|
501
|
Il 501 ricalca in qualche modo il 500. Infatti,
viene generato in caso di errore di sintassi nei parametri o negli argomenti
del messaggio inviato (insuccesso).
Puo' essere generato da tutti
i tipi di messaggio tranne NOOP, QUIT,
TURN.
501 <spazio> Syntax error in parameters scanning "<nome_messaggio>" <invio>
501 <spazio> RCPT <indirizzo_dopo_il_TO:> Invalid source route address syntax <invio>
...
|
|
502
|
Interviene nel caso il messaggio inviato non
sia implementato dal server con cui si e' connessi. Percio' indica insuccesso.
Oltre che da messaggi "strani", puo' essere generato anche da SEND,
SOML,
SAML,
VRFY,
EXPN,
HELP,
TURN
(non fanno parte del set minimo di comandi da implementare in un server
SMTP.
502 <spazio> Command not implemented <invio>
...
|
|
503
|
Puo' essere generato a seguito di RCPT,
DATA,
TURN,
sempre in caso di errore (insuccesso)
per una sequenza errata.
503 <spazio> Bad sequence of commands <invio>
...
|
|
504
|
Se uno o piu' parametri passati ad un messaggio,
non sono implementati dal server SMTP, viene generato questo errore (insuccesso).
Puo' seguire l'invio di HELO,
RSET,
VRFY,
EXPN,
HELP.
504 <spazio> Command parameter not implemented <invio>
...
|
|
550
|
Puo' essere generato da VRFY,
RCPT
e
EXPN
per
insuccesso.
Indica che la casella postale indicata come destinatario non e' disponibile
(permanentemente, ad esempio, per non esistenza o diritti di accesso).
Come per 450, se esiste un solo destinatario ed il messaggio che genera
questo errore e' RCPT, allora la mail non viene spedita.
550 <spazio> No such user here <invio>
550 <spazio> String does not matching anything <invio>
550 <spazio> Access Denied to You <invio>
...
|
|
551
|
Indica un percorso alternativo per un utente
non trovato. Viene generato da RCPT
o da VRFY. Puo'
essere considerato come un insuccesso.
551 <spazio> User not local; please try < <altro_indirizzo> > <invio>
...
|
|
552
|
L'azione specificata con il messaggio mandato
e' stata interrotta a causa di limiti di risorse (insuccesso).
Puo' essere generato da MAIL,
RCPT,
DATA,
SEND,
SOML,
SAML.
552 <spazio> Requested mail action aborted: exceeded storage allocation <invio>
...
|
|
553
|
Se l'azione richiesta con il messaggio inviato
non viene eseguita a causa di un problema con l'indirizzo, questo puo'
essere un errore restituito (insuccesso).
Puo' venire da RCPT
o da VRFY.
553 <spazio> User mbiguous <invio>
553 <spazio> Requested action not taken: mailbox name not allowed <invio>
...
|
|
554
|
Errore nell'operazione: e' questo il caso in
cui si puo' verificare questa risposta (insuccesso).
Puo' essere generata a seguito di DATA.
554 <spazio> Transaction failed <invio>
...
|
Provare manualmente il protocollo non e' un compito
arduo. Basta il programma telnet
ed una connessione attiva:
ecco un esempio di invio di un messaggio (novembre
1999).
telnet allnet.it 25
Trying 195.120.231.3...
Connected to allnet.it.
Escape character is '^]'.
220 zeus.allnet.it ESMTP Sendmail 8.8.5/8.8.5; Sat, 4 Dec 1999 22:55:38 +0100
HELO localhost.localdomain
250 zeus.allnet.it Hello (c'era l'indirizzo + l'IP), pleased to meet you
MAIL FROM ^H
501 Syntax error in parameters scanning "FROM"
MAIL FROM:<gvgsoft@allnet.it>
250 <gvgsoft@allnet.it>... Sender ok
RCPT TO:gar
550 gar... User unknown
RCPT TO:gabriele@feelinglinux.com
250 gabriele@feelinglinux.com... Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Questa e' una prova.
.
250 WAA08051 Message accepted for delivery
QUIT
221 zeus.allnet.it closing connection
Connection closed by foreign host.
La porta del servizio di invio posta elettronica
(SMTP) e' la 25
(vedere il file "/etc/services").
Con "telnet" all'indirizzo del server SMTP, e' possibile interagire direttamente
con il server. Ad ogni nostro messaggio, arrivera' una risposta piu' o
meno immediata. Si inizia con il messaggio d'apertura da parte del server
(220 ...), e si continua scambiando messaggi, coerentemente con il protocollo
SMTP. Come si puo' notare, i messaggi di
risposta variano da server a server. Si
guardi, infatti, il comportamento diverso di quest'altro server SMTP, specie
in corrispondenza degli errori (novembre
1999):
telnet smtp.tiscalinet.it 25
Trying 195.130.224.67...
Connected to fornax.tiscalinet.it.
Escape character is '^]'.
220 smtp.tiscalinet.it ESMTP
HELO localhost.localdomain
250 smtp.tiscalinet.it
MAIL FROM ^H
250 ok
MAIL FROM:<gvgsoft@allnet.it>
250 ok
RCPT TO:gar
250 ok
RCPT TO:gabriele@feelinglinux.com
250 ok
^[[C^HDATA
502 unimplemented (#5.5.1)
DATA
354 go ahead
Questa e' una prova.
.
250 ok 944346656 qp 14552
quit
221 smtp.tiscalinet.it
Connection closed by foreign host.
Vorrei far vedere un ultimo esempio (novembre
1999). Si distingue per la severita' nel
controllare i messaggi ricevuti e nella somiglianza delle risposte date
alla tabella vista sopra.
telnet mail.libero.it 25
Trying 193.70.192.50...
Connected to smtp.libero.it.
Escape character is '^]'.
220 smtp1.libero.it ESMTP Service (NPlex 2.1.077.02) ready
HELO localhost.localdomain
250 smtp1.libero.it
MAIL FROM ^H
500 MAIL FROM ^H command unrecognized
MAIL FROM:<gvgsoft@allnet.it>
250 MAIL FROM:<gvgsoft@allnet.it> OK
RCPT TO:gar
501 RCPT gar Invalid source route address syntax
RCPT TO:gabriele@feelinglinux.com
501 RCPT gabriele@feelinglinux.com Invalid source route address syntax
RCPT TO:<gabriele@feelinglinux.com>
250 RCPT <gabriele@feelinglinux.com> OK
^[[C^HDATA
500 ^[[C^HDATA command unrecognized
DATA
354 Start mail input; end with <CRLF>.<CRLF>
Questa e' una prova.
.
250 Mail accepted
quit
221 smtp1.libero.it Service closing transmission channel
Connection closed by foreign host.
Un'ultima, ma importante osservazione: nelle
risposte
multiple, ogni linea comincia con il codice
della risposta (tre cifre), seguito dal carattere "-". L'ultima riga della
risposta presenta un carattere di spazio al posto del "-". Ad esempio:
cod-linea 1
cod-linea 2
...
cod-linea n-1
cod linea n
Per ulteriori informazioni sul protocollo SMTP, si
consiglia la lettura diretta dell'RFC 821.
MESSAGGI POSSIBILI:
DATA
<invio>
...
<invio>.<invio>
Il messaggio DATA serve a richiedere il permesso
a mandare il testo della mail. Una volta che il server ha risposto, puo'
cominciare la spedizione del testo che va mandato linea per linea. L'ultima
linea deve contenere solamente un punto per indicare la fine del messaggio.
Ad esempio, se indichiamo con "M"
il mittente
e con "R"
il ricevente,
si puo' avere:
M,R: [...]
M: DATA
R: 354 Start mail input; end with <CRLF>.<CRLF>
M: Ciao a tutti.
M: Questo e' un messaggio di prova.
M: Spero di non disturbare.
M: .
R: 250 OK
M,R: [...]
C'e' un vincolo sia per il tipo di caratteri utilizzabili,
sia riguardo alla lunghezza massima di una linea. Come caratteri, si puo'
usare il set ASCII
di 128 caratteri. La lunghezza massima di una linea del testo della mail
e' 1000
caratteri, compreso l'invio alla fine della linea.
EXPN
<spazio> <mailing_list> <invio>
L'utilita' di questo mssaggio sta nella possibilita'
di ottenere i nomi registrati in una mailing-list. Il ricevente legge il
nome della mailing-list, cerca di ottenere i nomi e gli indirizzi e-mail
registrati, restituendoli al mittente con tanti messaggi
250 quanti sono gli utenti (risposta a
piu' riprese, cioe' su piu' linee). C'e' anche la possibilita' che l'accesso
all'elenco degli utenti della maling-list sia proibito: in questo caso
il messaggio restituito dovrebbe essere il 550
con l'indicazione dell'accesso negato.
HELO
<spazio> <dominio_partenza> <invio>
Una volta che il mittente e' connesso con il ricevente,
e' necessario che il primo si identifichi: cio' viene fatto con il messaggio
HELO. La lunghezza massima per il nome del dominio e' 64 caratteri.
HELP
[<spazio> <messaggio>] <invio>
Il messaggio HELP consente di ottenere informazioni
dal ricevente. In particolare, puo' essere usato per chiedere informazioni
su determinati messaggi.
MAIL
<spazio>
FROM:<<indirizzo_partenza>>
<invio>
Indica il mittente del messaggio. La differenza
con il successivo messaggio "SEND", e' che MAIL
serve ad inizializzare il processo di invio della mail ad una mailbox.
L'indirizzo non deve essere piu' lungo di 256 caratteri.
NOOP
<invio>
Letteralmente significa "nessuna
operazione". Causa solo l'invio da parte
del ricevente di un messaggio di OK.
QUIT
<invio>
QUIT e' l'invito ufficiale a chiudere la connessione.
Il mittente invia questo messaggio per terminare il colloquio con il ricevente.
Quest'ultimo, a sua volta, dopo aver ricevuto il messaggio QUIT, invia
un messaggio di OK al mittente e chiude la connessione. Altrettanto fara'
il mittente, appena ricevuto l'OK dal ricevente.
RCPT
<spazio>
TO:<<indirizzo/i_di_arrivo>>
<invio>
L'indicazione dei destinatari del messaggio, avviene
per mezzo di RCPT. Per indicare piu' destinatari, si usano piu' RCPT consecutivi.
L'indirizzo non deve essere piu' lungo di 256 caratteri.
RSET
<invio>
Annulla le operazioni che non sono ancora state
portate a termine. Riporta lo stato del ricevente all'analogo della connessione
appena avvenuta.
SAML
<spazio> FROM:<<indirizzo_partenza>>
<invio>
SAML, riunisce le funzioni di MAIL e SEND. Con
SAML, viene inizializzato il processo di invio del messaggio sia alla mailbox
che all'eventuale terminale attivo ceh accetti messaggi. L'indirizzo non
deve essere piu' lungo di 256 caratteri.
SEND<spazio>
FROM:<<indirizzo_partenza>>
<invio>
Inizializza il processo di invio del messaggio,
ma a differenza di MAIL, i destinatari dovranno essere uno
o piu' terminali. Va indicato l'indirizzo
del mittente. L'indirizzo non deve essere piu' lungo di 256 caratteri.
SOML
<spazio>
FROM:<<indirizzo_partenza>>
<invio>
SOML e' simile a SAML, ma cerca di mandare prima
il messaggio ad uno o piu' terminali che accettano messaggi. Se cio'
non fosse possibile, allora il messaggio verrebbe inviato alle mailbox.
L'indirizzo non deve essere piu' lungo di 256 caratteri.
VRFY
<spazio> <nome_utente> <invio>
Con questo messaggio, si chiede al server SMTP
di confermare o meno l'esistenza dell'utente specificato. In caso di esistenza,
viene (dovrebbe venire) restituito il nome completo e l'indirizzo della
mailbox. La lunghezza massima per il nome dell'utente e' 64 caratteri.
|