4. Le specifiche SMTP (The SMTP Specifications)
Questa sezione contiene le specifiche dettagliate per comandi SMTP, risposte, sequenziamento, informazioni di traccia e questioni implementative.
4.1. Comandi SMTP
4.1.1. Semantica e sintassi dei comandi
I comandi SMTP sono parole ASCII di 4 lettere, alcune estese a 8, non sensibili a maiuscole/minuscole, facoltativamente seguite da parametri.
Extended HELLO (EHLO) o HELLO (HELO)
Sintassi: EHLO domain o HELO domain
Il comando EHLO avvia una sessione SMTP e richiede le estensioni del servizio. HELO è il fallback per server che non supportano estensioni.
Esempio:
C: EHLO client.example.com
S: 250-server.example.com
S: 250-SIZE 52428800
S: 250-8BITMIME
S: 250 STARTTLS
MAIL (MAIL FROM)
Sintassi: MAIL FROM:<reverse-path> [parameters]
Avvia una transazione di posta specificando il mittente.
Esempio:
C: MAIL FROM:``<[email protected]>``
S: 250 Ok
Parametri: possono includere SIZE, BODY, AUTH, ecc.
RECIPIENT (RCPT TO)
Sintassi: RCPT TO:<forward-path> [parameters]
Identifica un destinatario della posta.
Esempio:
C: RCPT TO:``<[email protected]>``
S: 250 Ok
DATA
Sintassi: DATA
Indica l'inizio del contenuto del messaggio. Il contenuto termina con <CRLF>.<CRLF>.
Esempio:
C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: From: [email protected]
C: To: [email protected]
C: Subject: Test
C:
C: Message body here.
C: .
S: 250 Ok: queued as 12345
RESET (RSET)
Sintassi: RSET
Interrompe la transazione di posta corrente e reimposta i buffer.
C: RSET
S: 250 Ok
VERIFY (VRFY)
Sintassi: VRFY string
Verifica che una mailbox esista.
C: VRFY Jones
S: 250 Fred Jones ``<[email protected]>``
Nota: molti server lo disabilitano per ragioni di sicurezza.
EXPAND (EXPN)
Sintassi: EXPN string
Espande una mailing list.
C: EXPN staff
S: 250-Alice ``<[email protected]>``
S: 250 Bob ``<[email protected]>``
HELP
Sintassi: HELP [command]
Fornisce informazioni di aiuto.
C: HELP
S: 214-This server supports the following commands:
S: 214 EHLO MAIL RCPT DATA RSET VRFY HELP QUIT
NO OPERATION (NOOP)
Sintassi: NOOP
Non esegue alcuna operazione; è usato per mantenere viva la connessione.
C: NOOP
S: 250 Ok
QUIT
Sintassi: QUIT
Termina la sessione SMTP.
C: QUIT
S: 221 server.example.com closing connection
4.1.2. Sintassi degli argomenti dei comandi
I comandi seguono regole sintattiche rigorose definite in ABNF (RFC 5234).
Formato mailbox: local-part@domain
- Local-part: fino a 64 caratteri.
- Domain: nome di dominio pienamente qualificato o letterale di indirizzo.
Letterali di indirizzo:
- IPv4:
[192.0.2.1] - IPv6:
[IPv6:2001:db8::1]
4.1.3. Letterali di indirizzo
I letterali di indirizzo sono domini racchiusi tra parentesi quadre:
[192.0.2.1]- indirizzo IPv4[IPv6:2001:db8::1]- indirizzo IPv6
4.1.4. Ordine dei comandi
Sequenze di comandi valide:
- Connessione: il server invia 220.
- Saluto: il client invia EHLO/HELO.
- Transazione: MAIL -> RCPT, uno o più, -> DATA.
- Terminazione: QUIT.
Sequenze non valide producono errore 503 "Bad sequence of commands".
4.1.5. Comandi a uso privato
I comandi che iniziano con X sono riservati all'uso privato e alla sperimentazione.
4.2. Risposte SMTP
4.2.1. Gravità e teoria dei codici di risposta
I codici di risposta sono numeri di 3 cifre:
- 2yz: completamento positivo.
- 3yz: intermedio positivo.
- 4yz: negativo transitorio, ritentativo possibile.
- 5yz: negativo permanente, non ritentare.
La seconda cifra indica la categoria:
- x0z: sintassi.
- x1z: informazione.
- x2z: connessioni.
- x5z: sistema di posta.
4.2.2. Codici di risposta per gruppi funzionali
Stabilimento della connessione:
- 220: servizio pronto.
- 421: servizio non disponibile.
Inizio lato client:
- 250: OK.
- 500: errore di sintassi.
- 502: comando non implementato.
Transazioni di posta:
- 250: OK.
- 354: inizio input di posta.
- 450/550: mailbox non disponibile.
- 451/551: errore di elaborazione.
- 452/552: spazio insufficiente.
- 553: nome mailbox non valido.
- 554: transazione fallita.
4.2.3. Codici di risposta in ordine numerico
- 211: stato del sistema.
- 214: messaggio di aiuto.
- 220: servizio pronto.
- 221: chiusura connessione.
- 250: OK.
- 251: utente non locale; verrà inoltrato.
- 252: impossibile VRFY l'utente, ma verrà accettato.
- 354: inizio input di posta.
- 421: servizio non disponibile.
- 450: mailbox non disponibile.
- 451: errore locale.
- 452: spazio insufficiente.
- 455: server incapace di accomodare i parametri.
- 500: errore di sintassi.
- 501: errore di sintassi nei parametri.
- 502: comando non implementato.
- 503: sequenza di comandi errata.
- 504: parametro del comando non implementato.
- 550: mailbox non disponibile.
- 551: utente non locale.
- 552: allocazione di spazio superata.
- 553: nome mailbox non consentito.
- 554: transazione fallita.
- 555: parametri non riconosciuti.
4.2.4. Codice di risposta 502
502 indica comando non implementato. I client non dovrebbero ritentare comandi non implementati.
4.2.5. Codici di risposta dopo DATA e il successivo <CRLF>.<CRLF>
Dopo il completamento di DATA:
- 250: messaggio accettato.
- 450/550: mailbox non disponibile.
- 451/551: errore di elaborazione.
- 452/552: spazio insufficiente.
- 554: transazione fallita.
4.3. Sequenziamento di comandi e risposte
4.3.1. Panoramica del sequenziamento
SMTP è lock-step: il client invia un comando, attende la risposta e poi invia il comando successivo. Eccezione: l'estensione PIPELINING consente l'invio in batch.
4.3.2. Sequenze comando-risposta
Implementazione minima:
S: 220
C: EHLO
S: 250
C: MAIL FROM
S: 250
C: RCPT TO
S: 250
C: DATA
S: 354
C: (message data)
C: .
S: 250
C: QUIT
S: 221
4.4. Informazioni di traccia
Ogni server SMTP aggiunge un campo header Received quando accetta un messaggio.
Formato:
Received: from sender.example.com (host.example.com [192.0.2.1])
by receiver.example.com (Postfix) with ESMTP id 12345
for ``<[email protected]>``; Mon, 24 Dec 2024 10:00:00 +0000 (UTC)
Componenti:
from: identificazione dell'host mittente.by: host ricevente.with: protocollo usato, ad esempio SMTP, ESMTP.for: indirizzo del destinatario.- timestamp.
4.5. Questioni implementative aggiuntive
4.5.1. Implementazione minima
SMTP pienamente funzionante deve supportare:
- comandi: EHLO, MAIL, RCPT, DATA, RSET, NOOP, QUIT;
- codici di risposta: tutti i codici standard;
- accodamento e logica di ritentativo;
- corretta gestione degli errori.
4.5.2. Trasparenza
I server devono gestire il dot-stuffing: le righe che iniziano con . devono essere escape-ate come .. durante la trasmissione DATA.
4.5.3. Dimensioni e timeout
4.5.3.1. Limiti e minimi di dimensione
Requisiti minimi:
- Local-part: 64 ottetti.
- Domain: 255 ottetti.
- Path: 256 ottetti.
- Riga di comando: 512 ottetti.
- Riga di risposta: 512 ottetti.
- Riga di testo: 1000 ottetti.
- Buffer destinatari: 100 destinatari.
4.5.3.2. Timeout
Timeout del client:
- messaggio iniziale 220: 5 minuti.
- comando MAIL: 5 minuti.
- comando RCPT: 5 minuti.
- inizio DATA: 2 minuti.
- blocco dati: 3 minuti.
- terminazione DATA: 10 minuti.
Timeout del server:
- attesa di un comando: 5 minuti.
- attesa di DATA: 10 minuti.
4.5.4. Strategie di ritentativo
In caso di errori transitori, cioè codici 4yz:
- ritentare almeno ogni 30 minuti;
- continuare a provare per almeno 4-5 giorni;
- inviare avvisi al mittente a intervalli;
- generare un rimbalzo dopo il fallimento finale.
4.5.5. Messaggi con reverse-path nullo
I messaggi di rimbalzo usano MAIL FROM:<>, cioè reverse-path nullo, per prevenire cicli di posta. I server devono accettare il reverse-path nullo, ma non devono generare rimbalzi per esso.