Home

"I'm brave but I'm chicken shit"

TCP/IP in pillole: SMTP

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 [email protected] da [email protected].
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 [email protected]
250 mx.gmail.com at your service
mail from:<[email protected]>
250 2.1.0 OK
rcpt to:<[email protected]>
250 2.1.5 OK
data
354 Go ahead
from: Andrea Beggi <[email protected]>
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.


Pubblicato

in

da

Commenti

31 risposte a “TCP/IP in pillole: SMTP”

  1. Avatar Tambu

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

    siamo tropo geek :-PPP

  2. Avatar Andrea

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

  3. SMTP for dummies

    Andrea Beggi ha pubblicato sul suo blog una bellissima guida introduttiva all’SMTP. Nella guida vengono trattate le basi del protocollo ed un esempio su come inviare una email da terminale.
    ciauz

  4. Avatar Giuseppe
    Giuseppe

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

  5. Avatar andrea
    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!

  6. Avatar Marian
    Marian

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

  7. Inviare email via telnet

    Spesso per provare il corretto funzionamento di un mailserver � necessario inviare un’email via telnet. Andrea tempo fa sul suo blog in un interessante articolo sul protocollo SMTP ne ha spiegato la procedura di base.
    Ma cosa succede se vogli…

  8. Avatar carlo
    carlo

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

  9. Avatar Andrea
    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

  10. Avatar valerio
    valerio

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

  11. Avatar rocco
    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 [email protected]. 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.

  12. Avatar 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

  13. Avatar Gerardo
    Gerardo

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

  14. Avatar .:°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!

  15. Avatar 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

  16. Avatar francesco
    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

  17. Avatar Patrizia
    Patrizia

    Grazie del chiaro articolo

  18. Avatar Fabio La Venuta
    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?

  19. Avatar Alessandro

    Bello… e per i server SMTP che necessitano di autenticazione?
    Mi puoi rispndere su [email protected]
    GRAZIE
    ALESSANDRO

    http://www.crazyboxrally.tk

  20. Avatar Marco
    Marco

    Ho provato come fai tu a spedire verso [email protected], ma mi risponde che io costituisco SPAM e mi rifiuta.
    Ho provato allora verso [email protected] (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?

  21. Avatar fabio
    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 ?

  22. Avatar maurizio
    maurizio

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

  23. Avatar Giuseppe

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

  24. Avatar Lucia
    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!!

  25. Avatar VINCY
    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

  26. Avatar roberta
    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

  27. […] In questo esempio il dominio ha due mail server. Il primo, più importante, è quello con il campo priorità più basso (10) ed è il primo che verrà contattato. Se esso non risponde si passa all’altro (se c’è) che fa da backup e si incaricherà di inoltrare i messaggi al server principale non appena esso tornerà online; impostando due priorità uguali si può ottenere una specie di bilanciamento di carico. Maggiori informazioni sul recapito della posta, il protocollo SMTP e una breve prova pratica li trovate in un mio vecchio post. […]

  28. Avatar Giacomo
    Giacomo

    Grazie .. funziona anche senza tls

  29. Avatar Luigi
    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 [email protected]) 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

  30. Avatar Marco
    Marco

    Luigi io sto leggendo la tua stessa guida però ho un problema se per caso puoi contattarmi qui: [email protected] per darmi una mano, te ne sarei grato…