Andrea Beggi

The only absolute knowledge attainable by man is that life is meaningless.

TCP/IP in pillole: SMTP

A T T E N Z I O N E ! Questo post ha piu' di sei mesi. Le informazioni contenute potrebbero non essere aggiornate.

Il Simple Mail Transfer Protocol, SMTP è il protocollo che permette di scambiare messaggi tra host, e si occupa di gestire quasi tutto il traffico email su Internet; quindi la sua funzione è molto importante. E’ stato formalizzato nella RFC 821.
Un server SMTP ascolta sulla porta TCP/25, ed accetta connessioni sia da altri server che da client: quando inviate un messaggio, il vostro programma si incarica di contattare il server SMTP del vostro provider, che a sua volta cercherà l’SMTP del destinatario e recapiterà la vostra email.
Quello che normalmente viene identificato con l’etichetta “server della post in uscita” non è altro che il vostro server SMTP.
SMTP definisce il formato dei messaggi da trasferire e il metodo relativo: l’host mittente usa comandi SMTP per mandare messaggi all’host ricevente.

Una connessione SMTP consta di (almeno) 6 fasi:

  1. Il client si connette alla TCP/25 del server, che risponde con un messaggio 220 <ready>
  2. Il client richiede l’inizio sessione con un comando HELO, seguito opzionalmente dal proprio nome completo di dominio (FQDN). Il server risponde con 250 <OK>
  3. Il client specifica il mittente con mail from: <indirizzo>, il server: 250 <OK>.
  4. Adesso il client identifica i destinatari con rcpt to:<indirizzo>, la risposta è ancora 250 <OK>.
  5. Il client dichiara di essere pronto a trasmettere il vero messaggio con: data, risposta del server: 250 <OK>. Il messaggio viene trasmesso tramite caratteri ASCII a 7 bit. Eventuali allegati sono codificati a 7 bit tramite BinHex, uuencode, o MIME.
  6. Una volta conclusa la trasmissione, il client invia la stringa di fine messaggio, di solito si tratta di un punto seguito da una riga vuota, e la sessione viene chiusa tramite quit.

(*)
Si noti che, per limitare lo spam, un server SMTP accetta posta solo per gli utenti del proprio dominio, rifiutando il “relay”.
Una volta che il server SMTP del provider ha ricevuto il messaggio, contatta il server SMTP incaricato della ricezione e gli trasmette la email.
Perché questo avvenga, ci deve essere un modo per risolvere la parte dominio di un indirizzo email (in pratica tutto ciò che segue “@”), e normalmente il compito viene assolto dal DNS.
Interrogando un DNS per ottenere informazioni su un dominio, si può ricavare l’indirizzo del server SMTP incaricato dello scambio di posta, leggendo il valore del record MX (Mail eXchanger).

Vediamo tutto il processo in pratica usando un prompt dei comandi: proveremo a mandare una mail usando solo l’interfaccia a caratteri e il programma telnet. Manderemo un messaggio a abeggi@gmail.com da abeggi@libero.it.
Per prima cosa scopriamo qual’è il server SMTP destinato a ricevere la posta per gmail.com: apriamo una finestra comandi e 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: gmail.com
Nslookup
Dei 6 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 al server SMTP preposto usando telnet, specificando la porta 25: telnet gmail-smtp-in.l.google.com 25.
Ecco la sequenza dei comandi, quello che dovete inserire è in neretto.

telnet gmail-smtp-in.l.google.com 25
220 mx.gmail.com ESMTP 6si3449404wrl
helo abeggi@libero.it
250 mx.gmail.com at your service
mail from:<abeggi@libero.it>
250 2.1.0 OK
rcpt to:<abeggi@gmail.com>
250 2.1.5 OK
data
354 Go ahead
from: Andrea Beggi <abeggi@libero.it>
to:Andrea Beggi
subject: prova

questa riga è vuota
Messaggio test
.

questa riga è vuota

250 2.0.0 OK 1122292690 6si3449404wrl
quit
221 2.0.0 mx.gmail.com closing connection 6si3449404wrl

Potete sostituire tranquillamente la riga Messaggio test con una o più righe costituenti il corpo del messaggio. l’importante è che il messaggio sia chiuso da una riga con un solo punto, seguita da una riga vuota.

Nell’immagine potete vedere la sequenza corretta dei comandi SMTP per l’invio di posta.
SMTP session
Provate con il vostro indirizzo per testare il funzionamento del processo.

(*) Nota: questa è la versione standard dei messaggi SMTP, ma i server possono parlare “dialetti” diversi ma ugualmente supportati, basta guardare l’esempio: non tutti i codici di risposta del server sono conformi allo schema canonico.

31 Commenti

Tambu | #

MA!!! anche tu hai il prompt dei comandi con carattere verde su nero?

siamo tropo geek :-PPP

Andrea | #

Tambu:LOL! E’ una vecchia abitudine che mi porto dietro da aaaaaaanni….

Giuseppe | #

Nonostante in passato i miei occhi abbiano visto troppo spesso fosfori verdi e usurati, preferisco white on blue.
Questione di gusti. 🙂

andrea | #

articolo davvero molto interessante,mi ha fatto ritornare ai bei ricordi dell’adolescenza di quando usavo telnet alle superiori per spedire email,una cosa per non ho mai capito,cosa fare per visualizzare gli allegati in modo “normale” e se tramite telnet possibile anche aggiungere allegati alle email in uscita che non risiedano in un server ftp ma localmente nel pc!

Marian | #

[OT] Ciao, come fai per cambiare il prompt dei comandi con carattere verde su nero?
Mi piacerebbe…

carlo | #

mi potreste dire qual’e’ l’ip del server smtp dei gestori di posta elettronica?
es. libero?
Grazie.

Andrea | #

Ciao Andrea,

ho apprezzato l’articolo, semplice e comprensibile.
Ho provato a seguere le indicazioni ma se uso destinatari con indirizzi tipo @hotmail o @supereva, ricevo un messaggio di deny. Perch? forse sicurezze implementate dagli amministratori di hotmail e supereva?

Ti ringrazio anticipatamente della risposta.
Andrea

valerio | #

a me invece restituisce un errore di bad rcpt non capisco come mai… grazie ciao!
valerio

rocco | #

ciao ho letto il tuo articolo. vorrei farti alcune domande ad esempio nelle fasi di saluto tra server e host dopo aver inserito il comando helo quale “host name” devo inserire? tu hai inserito abeggi@libero.it. Qualsiasi mio indirizzo di posta elettronica inserisca mi fa sempre errore 250 (host name sconosciuto) allora invece di mettere l’indirizzo di posta ho inserito il mio indirizzo IP, mi riconosce e va avanti. poi quando metto il comando mail from mi da un erroe 50.. (se non sbaglio 505). dove sbaglio? come posso fare a sapere con quale host name devo presentarmi? ciao mi farebbe piacere avere una tua risp.

ovd | #

a me invece restituisce un errore di bad rcpt non capisco come mai… grazie ciao!
valerio
– Non esiste un account su quel server. accertati della sua esistenza.
———————————————————————
mi potreste dire qual’e’ l’ip del server smtp dei gestori di posta elettronica?
es. libero?

– C’e’ scritto nell’articolo.
Invece di inserire gmail.com usa libero.it

——————————————————————-

Qualsiasi mio indirizzo di posta elettronica inserisca mi fa sempre errore 250 (host name sconosciuto) allora invece di mettere l’indirizzo di posta ho inserito il mio indirizzo IP, mi riconosce e va avanti. poi quando metto il comando mail from mi da un erroe 50.. (se non sbaglio 505). dove sbaglio? come posso fare a sapere con quale host name devo presentarmi?

– Il server in questione controlla la relazione tra l’indirizzo IP
ed il dominio. Se l’IP non fa parte dell’indirizzo, non ti fa
proseguire nell’invio del messaggio, perche’ crede che si tratti
di una contraffazione (header spoofing), e lo riggetta.
Se inserisci il tuo IP, il server ti fa proseguire, fino a quando
tu inserisci l’indirizzo. E’ palese che l’indirizzo che hai
inserito non e’ lo stesso con il quale ti sei autenticato. prova
ad usare lo stesso, vedrai che riuscirai a mandare il messaggio.

——————————————————————-
Ho provato a seguere le indicazioni ma se uso destinatari con indirizzi tipo @hotmail o @supereva, ricevo un messaggio di deny.

Incolla l’errore esatto. Quando te lo da, ed i comandi che dai.

——————————————————————-

saluti ovd

Gerardo | #

Si può ottenere l’e-mail di una persona partendo dall’indirizzo IP?

.:°FP°:. | #

Ciao,volevo dirti che il tuo articolo è perfetto e che sn riuscito a mandare un’email cn il telnet immediatamente,sia a gmail sia ad altri provider…

volevo sapere solamente una cosa,quando cerco il server smtp di hotmail.it a cui connettermi mi appare quest’indirizzo :

pamx1.hotmail.com

fino a qui tutto ok,ma appena tento di connettermi cn il telnet mi scade il time out e nn si connette….

Vorrei avere dei consigli per questo provider…

a presto,ciao!

mazzucchi gianpiero | #

mi puoi aiutare forse… con incredimail sulle propieta’
del server in uscita trovo la porta 25 (che lampeggia in azzurro) e in arrivo la porta 100..
Morale ricevo le Mail ma non riesco a spedirle (con questo errore- 501 5.5.4 Invalid Address -)

MALEDICO IL GIORNO CHE NON HO SCELTO QUESTO INDIRIZZO DI STUDIO. CIAO GRAZIE

francesco | #

Ciao ragazzi, premetto che non sono esperto in materia, vorrei sapere come faccio a conoscere l’smtp? io uso un pc dell’ufficio e non conosco il provider, sareste così gentili da darmi delle dritte, magari indagando tramite il pannello di controllo, per individuare d’apprima il provider e quindi l’smtp. Grazie a tutti

Patrizia | #

Grazie del chiaro articolo

Fabio La Venuta | #

ho un router che periodicamente si disconnette e cambia IP. E’ possibile con questo sistema inviare un email con un allegato che mi dica quale è l’ ip del mio router in quel momento, così che io possa collegarmi in remoto?

Marco | #

Ho provato come fai tu a spedire verso mionome@gmail.com, ma mi risponde che io costituisco SPAM e mi rifiuta.
Ho provato allora verso mionome@alice.it (che e’ anche il mio provider). Trovo che il server e’ “smtp.aliceposta.it” e vado avanti. Tutto bene, sembrerebbe!
La email SEMBRA partire (messaggio: queued mail for delivery), ma se vado a controllare nel destinatario NON la ricevo.
Questo e’ il solito comportamento che rilevavo un’ora fa quando non andavo ancora a cercare l’exchanger con nslookup e usavo come smtp “out.alice.it”.
Dove sbaglio?

fabio | #

in vb.net 05 ho creato un client tcp per connettersi alla porta 25 smtp del server, ma non riesco a fare quello che fa nslookup con un client tcp. chi mi da una mano ?

maurizio | #

ho lo stesso problema di marco.Chi mi aiuta? grazie

Giuseppe | #

Bravo, ma insieme alle trenette metti anche la polenta e brasato (qui in Cina vengono le allucinazioni alimentari)

Lucia | #

Ciao Andrea… visto che tu ci capisci molto più di me ti chiedo una cortesia enorme… sto impazzendo per cercare di far funzionare incredimail con Hotmail… il problema è che non trova le impostazioni necessarie (pop3 e SMTP, il mio ragazzo invece c’è riuscito semplicemente! è possibile che il mio indirizzo sia vecchio e non va bene? siccome devo cambiarlo…potresti aiutarmi a trvare POP3 e SMTP da inserire!!! grazie mille!!

VINCY | #

minchia aiuto sto impazzando con sta c…o di server smtp di tiscali se qualcuno ha scoperto sta porta parli ora o taccia per sempre……….. scherzi a parte..chi mi aiuta devo mandare dei lavori mi serve troppo inviare la posta———–a proposito ho tiscali

roberta | #

UN indirizzo di posta elettronica al quale ho scritto e dal quale ho ricevuto mail fino a ieri ora mi dice “failed bad destinatin”
Che significa che non esiste piu???
Roberta

Giacomo | #

Grazie .. funziona anche senza tls

Luigi | #

ciao…
ho provato sulla mia mail d google(gmail) e funziona tutto perfettamente…
giusto per cambiare provider ho testato la procedura con la mail di mia sorella (hotmail) e quella di due miei amici(libero e live) e la cosa funziona.
solo una domanda…. in tutti e tre i casi la mail ricevuta da un indirizzo fasullo (ho utilizzato prova@test.it) viene ricevuta ma rimane nella categoria “spa,/mail indesiderata”, come mai?

ah, leggendo una guida c’era scritto che automaticamente il server invia il mio indirizzo ip nel corpo della mail, tra le righe in cui c’à specificato from/to/subject e, la stessa guida, dice di scrivere subito dopo il comando “data” il comando “Received: by nomeprovider.it id AA112122 with SMTP; Sun, Oct 97 13:40:58”
tra cui: nomeprovider.it—>lo stesso utilizzato con “helo”
Sun, Oct 97 13:40:58—>data in formato standard
id AA112122—>numero di serie del server, va cambiato
e non è nulla di importante
e poi la stessa guida dice che si deve digitare il comando “Message-ID: che serve a far credere che il messaggio sia partito effettivamente dal server “libero.it” con l’id 123.AA12342 (che può essere cambiato purchè non uguale a quello utitilizzato in precedenza nell’intestazione “Received”

Ora proverò a utilizzare i comandi per cui ho chiesto, anche se il mio ip non è comunque visibile in nessuna delle mail che ho provato

Marco | #

Luigi io sto leggendo la tua stessa guida però ho un problema se per caso puoi contattarmi qui: arlind777@gmail.com per darmi una mano, te ne sarei grato…