I comandi SMTP
I servizi TCP/IP (5 livello iso/osi) si fondano sullo scambio di comandi testuali tra client e server. I programmi client (come outlook, thunderbird, eudora, Kmail, ...) forniscono un'interfaccia grafica che, semplificando la vita all'utente finale, evita la digitazione diretta di comandi complessi che il server interpreta ed esegue. Vediamo la dimostrazione di quanto affermato applicata al protocollo di servizio SMTP: invio della posta.
Sendmail fu uno dei primi (se non proprio il primo) mail transfer agent (MTA)
ad implementare il protocollo SMTP. Alcuni esempi di server SMTP sono:
- Exim di Philip Hazel
- Postfix di Wietse Venema
- Qmail di D. J. Bernstein
- Courier di Sam Varshavchik
- Microsoft Exchange Server.
Poiché SMTP è un protocollo testuale basato sulla codifica ASCII a 7 bit
(l'ottavo é posto esplicitamente a zero) non è possibile trasmettere direttamente
del testo composto con un diverso set di caratteri ne tantomeno file binari. Lo
standard MIME permette di estendere il formato base dei messaggi SMTP mantenendo la
compatibilità con il software esistente. Ad esempio, al giorno d'oggi, molti server SMTP supportano l'estensione
8BITMIME che consente l'invio di testo contenente caratteri accentati (non-ASCII).
Un altro limite del protocollo SMTP è la lunghezza massima di una riga che
impedisce la spedizione di file binari senza una opportuna codifica.
Un'altra delle limitazioni del protocollo SMTP originario è che non gestisce
l'autenticazione dei mittenti e quindi consente lo spam. Infatti
è possibile stabilire una connessione ad un mail-server senza possedere un
account d'accesso ed inviare un messaggio
utilizzando i comandi SMTP nativi.
Per ovviare a questi problemi è 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).
Oltre al rischio di spam, esiste anche la possibilità
di inviare una e-mail facendo apparire come mittente un indirizzo di fantasia
oppure corrispondente ad
un altro account.
La presenza di estensioni che ampliano il protocollo base di SMTP implica,
sebbene non sia obbligatorio, che quasi tutti i client richiedano al server
quali estensioni SMTP siano attive e lo fanno
mediante il comando di saluto EHLO. Questi client usano HELO soltanto nel caso
in cui il server non risponda ad EHLO.
Il servizio SMTP utilizza come
protocollo di trasporto il TCP. Una sessione SMTP Client-Server attraversa almeno sei fasi:
1. Il client SMTP contatta il server sulla porta TCP 25. Se questo è in ascolto
e la connessione è 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 risponde
con un messaggio 250 (Ok);
3. Il client indica il proprio indirizzo e-mail tramite il comando MAIL FROM:
<indirizzo mittente>. Il server risponde con 250 (Ok);
4. Successivamente il client indica al server i destinatari del messaggio
tramite RCPT TO: <indirizzo destinatario> ed il server risponde per ogni
destinatario accettato con il codice 250 (Ok);
5. Il client comunica al server l'inizio del corpo del messaggio
mediante il comando DATA. Il server risponde con un codice 354 e indica come marcare
la fine
del messaggio. I campi come Date, Subject, To, Cc,
Bcc, From (data headers) vanno inseriti in questa sezione. Il messaggio viene trasmesso con caratteri ASCII a 7 bit.
Eventuali allegati sono codificati a 7 bit tramite BinHex, uuencode, o
MIME.
6. Il messaggio da spedire viene concluso con un singolo punto ed il server lo
memorizza. Adesso è possibile o scrivere un nuovo messaggio, oppure inviare il comando
QUIT. In tal caso il server invia i messaggi ricevuti, risponde al client con un codice 221 (Closing)
e chiude la connessione TCP;
Sessione Client-Server SMTP mediante TELNET
Vediamo ora un esempio pratico: immaginiamo di voler spedire un messaggio ad alta priorità, utilizzando la nostra casella di posta marco.sechi@tin.it, alla casella e-mail marco.sechi@libero.com. Mandiamo la stessa mail per conoscenza alle caselle marco.sechi@tiscali.it e marco.sechi@hotmail.it e per conoscenza nascosta alla casella cormatron@brescianet.com. Ecco la sequenza dei comandi:
- Apriamo una finestra DOS e digitiamo:
Telnet smtp.tin.it 25
La finestra DOS a questo punto si pulisce.
- Digitiamo quindi il comando EHLO SERVER
(non importa se in maiuscolo o minuscolo!) seguito da un <invio>
(contrariamente all'esempio sul protocollo HTTP il testo battuto risulta visibile). Se
il server SMTP supporta le estensioni ci viene inviato l'elenco di quella che
risultano attive:
250-vsmtp15.tin.it
250-DSN
250-8BITMIME
250-PIPELINING
250-HELP
250-AUTH=LOGIN
250-AUTH LOGIN CRAM-MD5 DIGEST-MD5 PLAIN
250-DELIVERBY 300
250 SIZE 31457280
- Il server del nostro esempio supporta l'autenticazione e pertanto è necessario inserire il comando
(seguito dal solito <invio> di conferma)
AUTH LOGIN
-
Digitiamo quindi lo Username e la relativa Password di accesso al server SMTP
che abbiamo impostato al momento della creazione della nostra casella
di posta. Tali informazioni vanno inviate con codifica in Base64 (il form sottostante ci
consente di effettuare la conversione in base64 delle informazioni necessarie)
E:\Users\Administrator>telnet
smtp.tin.it 25 220 vsmtp15.tin.it ESMTP Service ready EHLO SERVER 250-vsmtp15.tin.it 250-DSN 250-8BITMIME 250-PIPELINING 250-HELP 250-AUTH=LOGIN 250-AUTH LOGIN CRAM-MD5 DIGEST-MD5 PLAIN 250-DELIVERBY 300 250 SIZE 31457280 AUTH LOGIN 334 VXNlcm5hbWU6 <== è la codifica in base64 della parola: Username: Y29ybWF0cm9uZ2hvc3Q= 334 UGFzc3dvcmQ6 <== è la codifica in base64 della parola: Password: bWFyY29zZWNoaQ== 235 LOGIN authentication successful MAIL FROM:<marco.sechi@tin.it> 250 MAIL FROM:<marco.sechi@tin.it> OK RCPT TO:<marco.sechi@libero.it> 250 RCPT TO:<marco.sechi@libero.it> OK RCPT TO:<marco.sechi@tiscali.it> 250 RCPT TO:<marco.sechi@tiscali.it> OK RCPT TO:<marco.sechi@hotmail.it> 250 RCPT TO:<marco.sechi@hotmail.it> OK RCPT TO:<cormatron@brescianet.com> 250 RCPT TO:<cormatron@brescianet.com> OK DATA 354 Start mail input; end with <CRLF>.<CRLF> From: Marco Sechi su TIN <marco.sechi@tin.it> <== è il nome che appare sul client come mittente To: Undisclosed Recipients <== In questo modo chi riceve non vede i destinatari Cc: Amico su Tiscali <marco.sechi@tiscali.it>, Amico su HotMail <marco.sechi@hotmail.it> Bcc: <cormatron@brescianet.com> Date: Wed, 03 Jan 1964 18:33:29 Disposition-Notification-To: "Marco Sechi" <marco.sechi@gmail.com> <== richiesta conferma di lettura X-Priority: 1 <== indica la priorità: 1 alta - 5 bassa - 3 Normale X-Mailer: Client SMTP Manuale 1.3.64 Subject: Prova Invio Mail con Telnet <== oggetto del messaggio <== questa linea vuota deve esserci assolutamente Questa mail serve per illustrare il funzionamento del protocollo SMTP --- Marco Sechi [CormatroGhost] . <== il punto isolato indica la fine del testo del messaggio 250 <4AFD48E61AA48D1A> Mail accepted QUIT 221 vsmtp15.tin.it QUIT Connessione all'host perduta. |
Vediamo ora i messaggi ricevuti sulle singole caselle:
- ecco la mail ricevuta (con outlook express) dal destinatario indicato nella voce "per conoscenza nascosta" (BCC:).
- ecco la lettura da parte di uno dei due destinatari (precisamente marco.sechi@tiscali.it)
indicati nel data header "per conoscenza" (CC:)
- Si osservi che questo WEB client visualizza anche la sezione BCC
(Cnn: per conoscenza nascosta) che in
realtà non dovrebbe essere visibile poiché l'obbiettivo della clausola BCC
è quello di far arrivare in copia una mail ad un destinatario senza che gli
altri lo sappiano.
- Infine la lettura da parte del diretto destinatario (TO:)
0
Sessione Server SMTP Mittente/Destinatario mediante TELNET
Una volta che il server SMTP del mittente ha ricevuto il messaggio
da inviare deve contattare il
server SMTP del destinatario per trasmettergli le e-mail commissionate.
Affinché questo avvenga, è necessario risolvere la parte dominio di
un indirizzo email (in pratica tutto ciò che segue “@”), e normalmente questo
compito viene assolto dal DNS. Interrogando un DNS (ed esattamente leggendo il
valore del record MX:Mail eXchanger) è possibile ricavare l’indirizzo IP
associato al server SMTP incaricato dello scambio di posta per un certo dominio.
Vediamo ora tutto il processo di comunicazione tra i due server. Proveremo ad
inviare una e-mail mandando direttamente al server SMTP del destinatario i
comandi testuali necessari e questo utilizzando l’interfaccia a caratteri
DOS e il programma telnet.
Manderemo un messaggio da paperino@waltdisney.com a
marco.sechi@libero.it. Questa
volta non sarà necessario autenticarsi semplicemente perché ci comporteremo come
il server SMTP del mittente che contatta quello del destinatario per depositare
il messaggio.
Per prima cosa scopriamo qual’è il server SMTP destinato a ricevere la posta per
libero.it. Apriamo una finestra DOS ed impartiamo il comando nslookup.
Al prompt “>” digitiamo
set type=mx, per specificare che abbiamo bisogno di
interrogare un record MX, quindi inseriamo il dominio da controllare: libero.it
E:\Users\Administrator>nslookup Server predefinito: ns4.tin.it Address: 212.216.112.112 > set type=MX > libero.it Server: ns4.tin.it Address: 212.216.112.112 Risposta da un server non autorevole: libero.it MX preference = 10, mail exchanger = mxlibero1.libero.it libero.it MX preference = 5, mail exchanger = mxlibero2.libero.it libero.it MX preference = 10, mail exchanger = mxlibero3.libero.it libero.it nameserver = ns2.libero.it libero.it nameserver = ns1.libero.it mxlibero3.libero.it internet address = 212.52.84.99 mxlibero1.libero.it internet address = 212.52.84.83 mxlibero2.libero.it internet address = 212.52.84.84 ns2.libero.it internet address = 193.70.192.100 ns1.libero.it internet address = 195.210.91.100 > help Comandi: (gli identificatori sono indicati in maiuscolo, [] significa facoltativo) NOME - stampa informazioni sul NOME host/dominio utilizzando il server predefinito NOME1 NOME2 - come sopra, ma usa NOME2 come server help o ? - stampa informazioni su comandi comuni set OPZIONE - imposta una opzione all - stampa opzioni, server corrente e host [no]debug - stampa informazioni di debug [no]d2 - stampa informazioni dettagliate di debug [no]defname - aggiunge il nome di dominio a ogni query [no]recurse - richiede risposte ricorsive alla query [no]search - usa elenco di ricerca dominio [no]vc - usa sempre un circuito virtuale domain=NOME - imposta il NOME predefinito del dominio srchlist=N1[/N2/.../N6] - imposta dominio su N1 e l'elenco di ricerca su N1,N2 e così via. root=NOME - imposta il server radice su NOME retry=X - imposta il numero tentativi su X timeout=X - imposta l'intervallo di timeout iniziale su X secondi type=X - imposta il tipo di query (es. A,AAAA,A+AAAA,ANY,CNAME,MX,NS,PTR,SOA,SRV) querytype=X - come type class=X - imposta la classe di query (es. IN (Internet), ANY) [no]msxfr - usa il trasferimento di zona rapido MS ixfrver=X - versione corrente da usare nelle richieste di trasferimento IXFR server NOME - imposta il server predefinito su NOME, utilizzando il server corrente predefinito lserver NOME - imposta il server predefinito su NOME, utilizzando il server iniziale finger [UTENTE] - usa finger per il NOME facoltativo nell'host predefinito corrente root - imposta il server predefinito corrente sulla radice ls [facoltativo] DOMINIO [> FILE] - elenca gli indirizzi nel DOMINIO (facoltativo: output in FILE) -a - elenca nomi canonici e alias -d - elenca tutti i record -t TIPO - elenca i record del tipo di record RFC specificato (es. A,CNAME,MX,NS,PTR e così via) view FILE - ordina un file di output 'ls' e lo visualizza con pg exit - esce dal programma > Exit |
Dei 3 server ritornati scegliamo quello con il valore MX
preference più basso: gli altri sono a priorità minore, da contattare in caso il
primario non risponda.
Usciamo da nslookup con exit.
Colleghiamoci ora al server SMTP con il comando: telnet
mxlibero2.libero.it 25.
Ecco la sequenza dei comandi da digitare (evidenziata in giallo). Si osservi
l'errore "Relaying not allowed" se tento una spedizione ad una mail fuori
dal dominio del server SMTP (i.e. non del tipo @libero.it)
E: 220 mailrelay23.libero.it ESMTP Service ready EHLO paperino@waltdisney.com 250-mailrelay23.libero.it 250-DSN 250-8BITMIME 250-PIPELINING 250-HELP 250-DELIVERBY 300 250 SIZE 15728640 mail from: <paperino@waltdisney.com> 250 MAIL FROM:<paperino@waltdisney.com> OK rcpt to: <marco.sechi@tin.it> 550 RCPT TO:<marco.sechi@tin.it> Relaying not allowed rcpt to: <marco.sechi@libero.it> 250 RCPT TO:<marco.sechi@libero.it> OK Data 354 Start mail input; end with <CRLF>.<CRLF> From: "Marco Sechi" <paperino@caio.it> To: Marco su Libero Date: Thu, 21 May 1998 05:33:29 Subject: Prova con connessione diretta al server SMTP del destinatario <== questa linea vuota deve esserci assolutamente Ciao sono Marco Sechi e sto provando selvaggiamente dei comandi SMTP . 250 <4B6AE715000BE5A8> Mail accepted quit 221 mailrelay23.libero.it QUIT Connessione all'host perduta. |
Si osservi che per inviare il messaggio questa volta non ci siamo minimamente
autenticati. Semplicemente abbiamo bypassato la connessione con il server SMTP
del mittente e ci siamo collegati direttamente sul server SMTP del
destinatario. In soldoni abbiamo inviato gli stessi comandi che il server SMTP mittente
invia al server SMTP destinatario.
Terminata la sessione SMTP sulla casella del destinatario arriva il messaggio
appena inviato (si noti la casella e-mail di pura fantasia inserita come mittente).
Protezioni AntiSpam
Vediamo ora alcuni esempi che evidenziano i meccanismi di
controllo per evitare lo spam:
1) Verifica dell'esistenza del dominio del mittente.
Alcuni server SMTP consentono di indicare come mittente una mail non appartenente al dominio del server SMPT (tin.it) purché
il dominio indicato esista realmente (il dominio estrabello.it che è inesistente viene scartato mentre è il dominio brescianet.com
è accettato).
E:\Users\Administrator>telnet
smtp.tin.it 25 220 vsmtp8.tin.it ESMTP Service ready HELO Server 250 vsmtp8.tin.it MAIL FROM: <sechiareinfo@estrabello.it> 553 <sechiareinfo@estrabello.it> unable to verify address MAIL FROM: <marco@brescianet.com> 250 MAIL FROM:<marco@brescianet.com> OK |
2) Login: In alcuni domini senza aver fatto il login al server SMTP non è possibile inviare la posta.
E:\Users\Administrator>telnet
smtp.tin.it 25 220 vsmtp8.tin.it ESMTP Service ready HELO Server 250 vsmtp8.tin.it MAIL FROM: <marco@brescianet.com> 250 MAIL FROM:<marco@brescianet.com> OK RCPT TO: <marco.sechi@libero.it> 550 RCPT TO:<marco.sechi@libero.it> Relaying not allowed - please use SMTP AUTH |
3) Vincolo: il mittente è associato alla login: Alcune regole restrittive inibiscono l'invio della mail quando si indica come mittente una mail non associata alla login appena effettuata
E:\Users\Administrator>telnet
smtp.libero.it 25 220 cp-out11.libero.it ESMTP Service ready EHLO Server 250-cp-out11.libero.it 250-DSN 250-8BITMIME 250-PIPELINING 250-HELP 250-AUTH=LOGIN 250-AUTH LOGIN CRAM-MD5 DIGEST-MD5 PLAIN 250-DELIVERBY 300 250 SIZE 30000000 AUTH LOGIN 334 VXNlcm5hbWU6 bWFyY28uc2VjaGlAbGliZXJvLml0 <== è la userID in base64: marco.sechi@libero.it 334 UGFzc3dvcmQ6 bWFyY29zZWNoaQ== 235 LOGIN authentication successful MAIL FROM:<marco.sechi@tin.it> 553 MAIL FROM:<marco.sechi@tin.it> does not match authenticated user name |
Comandi
SMTP
Il server SMTP fornisce anche un breve help sui comandi disponibili (in grigio i comandi che non presentano un help specifico sul server SMTP usato per le prove):
E:\Users\Administrator>telnet
smtp.tin.it 25 220 vsmtp8.tin.it ESMTP Service ready HELP 214-Valid SMTP commands: 214- HELO, EHLO, NOOP, RSET, QUIT, STARTTLS 214- MAIL, RCPT, DATA, VRFY, EXPN, HELP, ETRN 214-For more info, use HELP <valid SMTP command> 214 end of help HELP HELO 214-Syntax: HELO <client hostname> 214-Purpose: Identify SMTP client host at start of connection 214 end of help HELP EHLO 214-Syntax: EHLO <client hostname> 214-Purpose: Identify ESMTP client host at start of connection 214 end of help HELP NOOP 214-Syntax: NOOP 214-Purpose: Check if server is connected 214 end of help HELP RSET 214-Syntax: RSET 214-Purpose: abort transaction in progress and reset server to initial state 214 end of help HELP QUIT 214-Syntax: QUIT 214-Purpose: request closing of the connection 214 end of help HELP MAIL 214-Syntax: MAIL FROM:<mailbox> 214-Syntax: MAIL FROM:<mailbox> SIZE=<decimal number> 214-Syntax: MAIL FROM:<mailbox> BODY=<7BIT|8BITMIME> 214-Syntax: MAIL FROM:<mailbox> RET=<FULL|HDRS> 214-Syntax: MAIL FROM:<mailbox> ENVID=<xtext> 214-Syntax: MAIL FROM:<mailbox> AUTH=<xtext> 214-Syntax: MAIL FROM:<mailbox> BY=<decimal number>[;"N"|"R"T 214-Purpose: Initiate a mail transaction and identify sender 214 end of help HELP RCPT 214-Syntax: RCPT TO:<mailbox> 214-Syntax: RCPT TO:<mailbox> ORCPT=<xtext> 214-Syntax: RCPT TO:<mailbox> NOTIFY=NEVER 214-Syntax: RCPT TO:<mailbox> NOTIFY=<one or more of SUCCESS, DELAY, FAILURE> 214-Purpose: add a mail recipient to list of recipients 214 end of help HELP DATA 214-Syntax: DATA 214-Purpose: initiate mail body data transfer 214 end of help HELP HELP 214-Syntax: HELP 214-Syntax: HELP <SMTP command> 214-Purpose: none 214 end of help HELP VRFY 214 end of help ... il comando non presenta alcun help HELP EXPN 214 end of help ... il comando non presenta alcun help HELP ETRN 214 end of help ... il comando non presenta alcun help |
Vediamo ora di analizzare il significato di alcuni comandi SMTP:
Codice |
Comando |
Parametri |
Descrizione |
HELO |
Hello |
Solitamente è il dominio del mittente. |
Rappresenta il comando convenzionale inviato dal client SMTP al server per instaurare la sessione SMTP. |
EHLO |
Extended Hello |
Solitamente è il dominio del mittente. |
E' inviato dal mittente ad un server SMTP che supporta le "Estensioni SMTP". Il server SMTP risponde inviando le estensioni supportate (esempio PIPELING, AUTH ...). Il dominio del mittente è fornito come parametro. |
|
Inizia la transazione MAIL |
Deve includere obbligatoriamente il parametro “FROM:” che specifica la mail del mittente. |
Inizia la transazione relativa alla spedizione vera e propria |
RCPT |
Destinatario |
Deve includere obbligatoriamente il parametro “TO:” che specifica la mail del destinatario. |
Specifica un destinatario del messaggio di posta della corrente transazione SMTP |
DATA |
Contenuto del messaggio |
Nessuno |
Comunica al server SMTP che il mittente è pronto ad inviare il testo del messaggio. Il server SMTP risponde con un messaggio 354 di "start...". Il mittente trasmette, una linea alla volta, indicando la fine del messaggio con un punto su una singola linea. |
RSET |
Reset |
Nessuno |
Annulla i comandi precedentemente
digitati nella sessione di posta corrente. |
VRFY |
Verify |
E-mail da verificare. |
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. |
EXPN |
Expand |
Indirizzo di una mailing list. |
L'utilità di questo messaggio sta nella possibilità 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 possibilità 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. |
HELP |
Help |
Opzionale: comando SMTP |
Richiesta di aiuto. Senza parametri fornisce un help generale. Fornendo come argomento un comando SMTP ne presenta l'help specifico. |
NOOP |
No Operation |
None |
Non svolge alcuna azione se non quella di verificare la connessione con il server SMTP. |
QUIT |
Quit |
None |
Termina la sessione SMTP |