Cloud with rain
.:G
G:.
0 and 1 serie, black on white
pulled card
myjsp.feelinglinux.com
ver. 1.1.9-4
Hallo, welcome to my world.
Here you can find some stuff about computer science.
<<< Enjoy your visit! >>>
0 and 1 serie, white on black

Il protocollo SMTP

        Scritto: Giansante Gabriele, 05/12/1999     

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.

  1. L'utente invia una richiesta di invio per una e-mail con un programma (mittente).
  2. 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.
  3. Il destinatario risponde al mittente, indicando che la connessione e' andata a buon fine e lo scambio di messaggi puo' aver luogo.
  4. Il mittente si fa riconoscere inviando la propria identita'.
  5. 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.
  6. 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.
  7. Il destinatario puo' accettare uno, tutti o nessuno degli utenti segnalati. Supponiamo che ne venga accettato almeno uno.
  8. Il mittente invia il testo della e-mail.
  9. Il destinatario prova a girare il testo all'utente corretto, non mancando di segnalare un eventuale errore.
  10. 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.

Codice Descrizione
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.

Pubblicita'
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 che 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.

Hai trovato utile questo articolo?
Aiutami a condividerlo o metti un "mi piace".
Grazie mille!


Gli strumenti di condivisione (Google+, Facebook) sono visibili in alto a destra solo dopo aver accettato la policy di utilizzo dei cookie per questo sito.
FAQ - Come faccio a cambiare la mia scelta?

 

Strumenti (myjsp.feelinglinux.com)
Gioco: allenamento con la tastiera Strumenti di codifica/decodifica URI (%-encoding) e Base64 Strumenti di calcolo online per IP e Reti
QUIZ GAME
Quiz game

Cerca @myjsp.feelinglinux.com

Pubblicita'