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.
