Simple Mail Transfer Protocol (SMTP) è il protocollo utilizzato per trasmettere messaggi di posta elettronica tra due host.

SMTP utilizza il protocollo di trasporto TCP, ed in particolare un SMTP server rimane costantemente in ascolto sulla porta 25. Il server SMTP si occupa poi di trasferire i messaggi nelle caselle di posta (mailbox) dei destinatari, oppure qualora non fosse il diretto responsabile di queste, inoltrarli (operazione di relay) al server che provvederà a farlo. La sintassi dei comandi è case-insensitive, ed è composta da istruzioni seguite da uno o più parametri terminate da un CRLF (Invio).

Il protocollo è descritto nella RFC 821, ma lavora in stretta collaborazione con altri standard come la RFC 822 che descrive la sintassi degli headers della mail, la RFC 1049 che definisce le strutture dati per interpretare correttamente il contenuto delle mail e la RFC 974 che si occupa del routing delle mail tramite DNS.

Lo standard definito dalla RFC 821, aveva diversi limiti riguardanti per esempio la dimensioni dei messaggi oppure la trasmissione di mail non in inglese o diverse dal semplice plain text. Per ovviare a questa restrizione è stato necessario estendere il protocollo tramite la RFC 1425 riguardante le SMTP Service Extensions.

I principali comandi SMTP:
HELO: Identifica il client SMTP al server SMTP;
EHLO: E' possibile usare anche questo comando per identificarsi, se il server supporta le SMTP Service Extensions riponderà in modo positivo altrimenti con un errore di tipo 500 (Syntax Error);
MAIL FROM: <indirizzo mittente>: Indicata la mailbox del mittente del messaggio;
RCPT TO: <indirizzo destinatario> : Indica la mailbox del desinatario (Recipient). E' possibile specificare attraverso molteplici RCPT TO diversi destinatari;
DATA: Indica al server che quanto digitato successivamente saranno i dati del messaggio di posta;
RSET: Annulla i comandi (Reset) precedentemente inviati nella sessione SMTP corrente;
VRFY <stringa>: Chiede al server se la stringa di testo immessa rappresenta un
nome utente presente ed in tal caso visualizza l'intero indirizzo;
HELP: Visualizza i comandi disponibili sul server;
NOOP: Non esegue nessuna operazione restituisce solo un messaggio 250 (Ok) se il server risponde;
QUIT: Termina la sessione SMTP corrente;

Una sessione SMTP attraversa almeno sei fasi:
1. Il client SMTP contatta il server sulla porta TCP 25. Se questo è in ascolto e la connessione è accettata risponde con un messaggio 220 (Ready);
2. Il client chiede di stabilire la sessione SMTP inviando il comando HELO seguito dal FQDN (Fully Qualified Domani Name). Se il server accetta rispondo con un messaggio 250 (Ok);
3. Il client indica il proprio indirizzo tramite il comando MAIL FROM: <indirizzo mittente>. Il server risponde con 250 (Ok) per ogni destinatario accettato;
4. Successivamente il client indica al server i destinatari del messaggio tramite RCPT TO: <indirizzo destinatario> ed il server risponde per ogni destinatario accettato un codice 250 (Ok);
5. Il client comunica al server l'intenzione di scrivere il corpo del messaggio con DATA. Il server risponde con un codice 354 e indica come marcare il termine del messaggio. I campi come Date, Subject, To, Cc, From vanno inseriti tra i dati della mail;
6. Completato il messaggio da scrivere tramite . il server memorizza la mail. A questo punto è possibile, scrivere un nuovo messaggio oppure inviare il comando QUIT, dopo il quale il server invia i messaggi e risponde con un codice 221 (Closing) e la connessione TCP viene terminata;

Esempio di una sessione SMTP da linea di comando:
homer@Joker:~$ telnet smtp.springmail.it 25
Trying 195.130.225.171...
Connected to smtp.springmail.it.
Escape character is '^]'.
220 mail.springmail.it ESMTP Service (6.5.032) ready
Tramite il programma telnet viene contattato il server SMTP sulla pora TCP 25
E' possibile notare dal messaggio ESMTP Service che il server supporta le SMTP Service Extensions
HELO
250 mail.springmail.it Missing required domain name in HELO, defaulted to your IP address [62.10.125.229]
Il client si identifica tramite il comando helo (non iniviando un nome di dominio, viene utilizzato l'indirizzo IP)
L'autenticazione avviene con HELO anziché EHLO e quindi il client non usufruisce delle SMTP Service Extensions qui supportate
HELP
214-Valid SMTP commands:
214-  HELO, EHLO, NOOP, RSET, QUIT, STARTTLS
214-  MAIL, RCPT, DATA, VRFY, EXPN, HELP, ETRN
214-For more info, use HELP <valid SMTP command>
214 end of help
HELP QUIT
214-Syntax: QUIT
214-Purpose: request closing of the connection
214 end of help
Il client richiede una lista dei comandi disponibili tramite help e successivamente un aiuto per il comando QUIT
MAIL FROM:<homer@springmail.it>
250 MAIL FROM:<homer@springmail.it> OK
RCPT TO:<arnaldo.z@email.it>
250 RCPT TO:<arnaldo.z@email.it> OK
DATA
Inizia l'inserimento del corpo della mail
354 Start mail input; end with <CRLF>.<CRLF>
From:Homer
To:Arnaldo
Subject:Il protocollo SMTP

Ciao,
questa mail serve per illustrare
il protocollo SMTP
---
Arnaldo aka [Homer]
.
250  Mail accepted
Il comando "." punto termina l'inserimento del messaggio; Il server SMTP lo accetta
QUIT
221 mail.springmail.it QUIT
Connection closed by foreign host.
La connessione TCP termina e si ritorna al prompt
homer@Joker:~$

Il client di posta elettronica (Kmail, Outlook o Eudora) si occupa solitamente di comunicare con il server al posto nostro in base alla propria configurazione.