Impara il protocollo SMTP

Mandare una email con telnet grazie al protoccollo SMTP scopriamo come è fatto

 

Premessa

Chi non ha mandato mai una email, alzi la mano! Ops, non ne vedo nessuna alzata, come immaginavo. E' una cosa molto semplice mandarne una con un semplice client di posta elettronica ma la cosa può diventare più complicata se la si vuole mandare a linea di comando, personalizzando magari qualche parametro a piacere come la data di invio, il mittente o cose simili oppure solo per il gusto di capire cosa c'è dietro a quel programma che usate. Lo scopo di questo articolo sarà quello di capire proprio questo.

Qual è il protocollo usato e come funziona

Il protocollo applicativo per mandare una email è SMTP (Simple Mail Transfer Protocol http://www.ietf.org/rfc/rfc0821.txt ) e come dice il nome, il protocollo è stato pensato per trasferire semplice posta o meglio testo ( una lettera postale è semplice testo ). Il messaggio, mandato da un client SMTP nascosto sempre dal visualizzatore di posta o agent ( OutLook o Kemail ), è mandato sempre ad una mailbox, normalmente il nome del possessore della casella di posta su un certo provider il quale è il server SMTP che riceverà il messaggio. Il noto POP invece è il protocollo che sta tra la mailbox e l'agent e detta le regole per informare sull'arrivo di una nuova email o per segnalare che la mailbox è piena ecc..

Il protocollo SMTP è composto da una serie di campi, che vengono poi gestiti dall'applicativo ricevente per la visualizzazione come siamo abituati.
I campi sono:

To: mailbox dei destinatari principali, deve essere corretto altrimenti non arriva l'email
From: normalmente l'email dell'autore del messaggio
Date: questo è il campo dati, il corpo del pacchetto SMTP ed è diviso in altri sottocampi
Cc: destinatari secondari
Bcc: destinatari secondari a cui vengono nascosti gli altri destinatari
Sender: indirizzo email di chi spedisce il messaggio
Receiver: riga aggiunta dai sistemi interni attraversati ( appare solo all'arrivo, normalmente ogni server attraversato lascia una traccia qui )
Return-path: può servire per identificare la stada per la risposta
Reply-to: indirizzo a cui inviare la risposta
Message-id: codice univoco del messaggio
In-replay-to: message-id del messaggio peri cui quello attuale è la risposta
References: message-id di messaggi a cui si fa riferimento
Keywords: parole chiave definite dall'utente
Subject: riga che sintetizza l'argomento trattato del messaggio (oggetto)

Quando è stato pensato nel 1971 ( vedi articolo sul numero 24 di hj ) il protocollo era nato per mandare solo testo ( e di questo ci occuperemo noi ) e poi è stato ampliato col protocollo MIME ( Multipurpose Internet Mail Extension http://www.cknow.com/ckinfo/acro_m/mime_1.shtml ). Per estendere SMTP a MIME bisogna implementare le regole di quest'ultimo, nel campo data di SMTP.
Per poter mandare una mail bisogna appoggiarsi su un server SMTP nel quale è implementato anche un client SMTP (che useremo) che inoltra il messaggio al destinatario (mailbox). Per fare ciò ci si può appoggiare al noto Telnet che ci consente di creare una connessione TCP/IP con un qualsiasi server su una porta specifica che gestisce un certo servizio. Nel nostro caso bisognerà cercare un server SMTP libero come per esempio smtp.libero.it oppure smtp.tiscalinet.it ( o ancora mail.tin.it, mail.inwind.it, smtp.katamail.com , mail.gmx.it, mail.galactica.it, mail.ciaoweb.net, smtp.vizzavi.it, smtp.email.it,smtp.mail.omnitel.it,mail.supereva.it,smtp.mail.yahoo.it, mail.interfree.it ) , ma è consigliato usare sempre il server SMTP del provider usato dal destinatario della nostra email.


Dalla teoria alla pratica

Seguirò un esempio pratico per spiegare le cose e i vari campi settati normalmente da un client di posta elettronica che invece possiamo settare noi a mano.
Per gli utenti Linux dalla console avviare telnet nel modo seguente

telnet nome-server 25

dove il nome-server è il nome del server smtp che vogliamo usare e normalmente il servizio è offerto sulla porta 25.
Per gli amanti di windows c'è da fare un piccolo discorso. Aperto il programma facendo

avvio -> esegui -> telnet -> ok

se noi ci connettessimo subito, normalmente di default non è attivato l'eco locale e ciò vuol dire che se digitiamo qualcosa nel nostro terminale non si vedrebbe niente perché i caratteri sarebbero inviati al server a cui siamo connessi e non ci sarebbe l'eco sul nostro pc. Detto questo è consigliato vivamente di attivarlo prima di connettersi. Per farlo

terminale -> preferenze -> spuntare eco locale -> ok

ora per connettersi

connetti -> sistema remoto -> hostname: nome-server -> porta: 25 -> ok

se invece nella vostra versione di windows vi si è aperto il terminale da dos, per attivare l'eco locale fare

set LOCAL_ECHO

ma conviene sempre fare un bel help '? ' .

Per connettersi invece

open nome-server 25

Da qui in avanti non farò più distinzioni tra windows e Linux i comandi sono uguali. Ogni comando che mandiamo è sempre seguito da un messaggio positivo o negativo che sia. I messaggi sono formati da un numero iniziale univoco in base al tipo di messaggio e seguito da una spiegazione del messaggio. Dal numero si capisce subito se la richiesta è andata a buon fine oppure no. In caso di errore o dopo una ripetizione di errori veniamo disconnessi dal server. I messaggi si dividono in 5 classi rispettivamente ogni classe dipende dal numero iniziale. Quelli che ci interessano sono la classe

2xx classe di successo, non e' stato errore il messaggio è andato a buon fine il tipico messaggio di questa classe è il 250
4xx messaggio di errore ( mai visto 404 pagina web non esistente … )
5xx in questo caso il server a cui siamo connessi ci avvisa che non ci può servire a causa di un suo problema. In questo caso ci scolleghiamo e riproviamo un altro giorno. Un altro caso è che non ha riconosciuto il comando dato.

Il primo comando da mandare al server è quello di riconoscimento, se non ci facciamo riconoscere non ci darà l'accesso al servizio. Per autenticarci

HELO dominio-server

poi bisogna specificare il l'email del mittente

MAIL FROM:<mail-mittente>

ma soprattutto quella del destinatario, sbagliata questa .. non arriva l'email

RCPT TO:<mail-destinatario>

spesso i comandi possono variare a seconda della versione del server SMTP usata dal server. In aiuto col comando

HELP

oppure

HELP comando

possiamo avere la sintassi esatta del comando. Ora la seconda parte più importante è il campo data del messaggio dove vengono impostati i campi già spiegati.

DATA

Normalmente i comandi vengono interpretati dopo il carattere INVIO, tranne questo campo essendoci più di un parametro da settare oltre che tutto il testo del messaggio. Quindi dopo aver scritto DATA ci verranno date le istruzioni su come terminare il campo in questione. Normalmente la terminazione è "INVIO.INVIO" , per non sbagliare basta leggere attentamente il messaggio. E' a questo punto che si specificano la data di invio della email, il soggetto della email, il nome del mittente ( non l'email ma il nome che si vede alla ricezione della email ) e il testo del messaggio, ecco come

date: "numero giorno" "tipo giorno" "mese" "anno" "ora:minuti:secondi"
es: date: 11 Mon Jun 03 22:23:24

chi avrà l'occhio più fine vedrà che i campi sono specificati in notazione inglese poi..

from: "Nome mittente" <mail-mittente>
subject: " oggetto della email"
"corpo del testo, il messaggio vero e proprio"
INVIO . INVIO


a questo punto se la ricezione è avvenuta correttamente riceveremo il message-ID della email mandata ( il codice che identifica la email in modo univoco ) e sarà inoltrata. Per chiudere la connessione

QUIT

Esempio

Ecco la copia di un esempio che ho provato personalmente mandandomi una email a me stesso:

telnet smtp.lbero.it 25
220 smtp2.libero.it ESMTP Service (7.0.012) ready

helo libero.it
250 smtp2.libero.it

MAIL FR0M:<Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.>
250 MAIL FR0M:<Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.> OK

HELP
214-Valid SMTP commands:
214- HELO, EHLO, NOOP, RSET, QUIT, STARTTLS
214- MAIL, RCPT, DATA, URFY, EXPN, HELP, ETRN
214-For more info, use HELP <valid SMTP command>
214 end of help

RCPT T0:<Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.>
250 RCPT T0:<Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.> OK
DATA
354 Start mail input; end with <CRLF>.<CRLF>

date: 11 mon Jun 03 22:22:00
from: "io stesso" <Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.>
subject: ecco 1'email mandata da me

opz la mia mail mandata da telnet! questo è il testo .

.

250 <3E9BEBC30144468C> Mail accepted

QUIT
221 smtp2.libero.it QUIT

Connessione all'host perduta.
Premere un testo per continuare...

Conclusioni

Un coltello si può usare per uccidere ma esso è stato creato per tagliare e anche questo articolo è stato creato per capire il protocollo SMTP ma si potrebbe usare per mandare email con campi camuffati, per mandare una email con destinatario diverso da chi è realmente o cose simili. Il punto è che comunque quando ci colleghiamo ad un server egli registra il nostro IP quindi se vi arriva una email "anonima" o "sospetta" l'unico modo per difendersi è contattare il provider della vostra mailbox o meglio ancora denunciare la cosa alle autorità e saranno loro poi a contattere il server SMTP che ha inviato l'email.