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:<
250 MAIL FR0M:<
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:<
250 RCPT T0:<
DATA
354 Start mail input; end with <CRLF>.<CRLF>
date: 11 mon Jun 03 22:22:00
from: "io stesso" <
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.