Passa al contenuto principale

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:

  1. Connessione: il server invia 220.
  2. Saluto: il client invia EHLO/HELO.
  3. Transazione: MAIL -> RCPT, uno o più, -> DATA.
  4. 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.