Passa al contenuto principale

5. Risoluzione degli indirizzi e gestione della posta (Address Resolution and Mail Handling)

Questa sezione descrive come i client SMTP determinano dove consegnare i messaggi di posta e come dovrebbero gestire il processo di consegna.

5.1. Individuazione dell'host di destinazione

Quando un client SMTP deve consegnare posta a un determinato dominio, deve determinare l'host o gli host di destinazione appropriati. Questo processo usa il Domain Name System (DNS) e segue questi passaggi.

Passaggio 1: cercare i record MX

Interrogare DNS per i record Mail eXchanger (MX) del dominio di destinazione:

$ dig example.com MX

;; ANSWER SECTION:
example.com. 3600 IN MX 10 mail1.example.com.
example.com. 3600 IN MX 20 mail2.example.com.
example.com. 3600 IN MX 30 mail3.example.com.

Passaggio 2: ordinare per priorità

Ordinare i record MX per priorità; numero più basso significa priorità più alta:

  1. mail1.example.com (priorità 10)
  2. mail2.example.com (priorità 20)
  3. mail3.example.com (priorità 30)

Passaggio 3: tentare la consegna

Provare a connettersi a ciascun host in ordine di priorità:

  1. Tentare la connessione all'MX con priorità più alta, cioè numero più basso.
  2. Se la connessione fallisce, provare il livello di priorità successivo.
  3. Continuare finché la consegna riesce o tutti gli host MX sono esauriti.

Passaggio 4: fallback ai record A/AAAA

Se non esistono record MX, trattare il dominio stesso come server di posta:

  • cercare il record A (IPv4) o AAAA (IPv6);
  • tentare una connessione diretta a quell'indirizzo IP.

Importante: se esistono record MX ma tutti falliscono, non si deve ripiegare sui record A/AAAA.

Algoritmo dettagliato

1. Interrogare i record MX per il dominio di destinazione.
2. Se vengono trovati record MX:
a. Rimuovere eventuali MX che puntano a "." (null MX).
b. Ordinare gli MX rimanenti per priorità.
c. Per ciascun livello di priorità, iniziando dal numero più basso:
i. Risolvere tutti gli host MX di questa priorità in indirizzi IP.
ii. Ordinare casualmente gli host con la stessa priorità.
iii. Provare a connettersi a ciascun host.
iv. Se la connessione riesce, consegnare la posta.
v. Se tutti gli host di questa priorità falliscono, provare la priorità successiva.
d. Se tutti gli host MX falliscono, differire la consegna (errore temporaneo).
3. Se non vengono trovati record MX:
a. Interrogare i record A/AAAA del dominio.
b. Provare a connettersi direttamente all'IP del dominio.
c. Se la connessione fallisce, differire la consegna.
4. Se il dominio non si risolve:
- Restituire un errore permanente (codice 5xx).

Scenari di esempio

Scenario 1: risoluzione MX standard

Dominio: example.com

Record MX:
10 mail1.example.com
20 mail2.example.com

Processo:
1. Provare mail1.example.com -> successo, consegnare la posta

Scenario 2: MX primario non disponibile

Record MX:
10 mail1.example.com (down)
20 mail2.example.com

Processo:
1. Provare mail1.example.com -> connessione fallita
2. Provare mail2.example.com -> successo, consegnare la posta

Scenario 3: nessun record MX

Dominio: smallcompany.example

Nessun record MX trovato

Processo:
1. Cercare il record A per smallcompany.example
2. Connettersi direttamente all'indirizzo IP
3. Consegnare la posta

Scenario 4: record Null MX

Dominio: nomail.example

Record MX:
0 .

Significato: questo dominio non accetta posta
Processo: restituire un errore permanente (556 o 550)

Buone pratiche

  1. Rispettare il TTL: memorizzare nella cache i risultati DNS secondo i valori TTL.
  2. Timeout di connessione: usare timeout ragionevoli, ad esempio 5 minuti per la connessione iniziale.
  3. Logica di ritentativo: per errori transitori (4xx), riprovare periodicamente.
  4. Bilanciamento del carico: per record MX con la stessa priorità, randomizzare la selezione.
  5. Supporto IPv6: provare sia record A sia record AAAA.
  6. Gestione degli errori: distinguere tra errori temporanei e permanenti.

Errori comuni

Errore 1: ripiegare sul record A quando esiste un MX ma fallisce

Errato:
I record MX esistono ma falliscono tutti -> provare il record A

Corretto:
I record MX esistono ma falliscono tutti -> differire la consegna (errore temporaneo)

Errore 2: non gestire correttamente il null MX

Errato:
MX: 0 . -> ignorare e provare il record A

Corretto:
MX: 0 . -> il dominio rifiuta esplicitamente la posta, restituire un errore permanente

5.2. IPv6 e record MX

Quando risolvono nomi host MX, i client dovrebbero:

  1. interrogare sia record A (IPv4) sia record AAAA (IPv6);
  2. preferire IPv6 se entrambi sono disponibili, secondo le scelte dell'implementazione;
  3. ripiegare su IPv4 se la connessione IPv6 fallisce.

Esempio:

mail.example.com ha:
A 192.0.2.1
AAAA 2001:db8::1

Processo:
1. Provare IPv6: 2001:db8::1
2. Se fallisce, provare IPv4: 192.0.2.1

Letterali di indirizzo IPv6

SMTP supporta letterali di indirizzo IPv6 in MAIL FROM e RCPT TO:

Formato: user@[IPv6:2001:db8::1]

Esempio:

C: MAIL FROM:`<sender@[IPv6:2001:db8::1]>`
S: 250 Ok

Considerazioni dual-stack

  1. Happy Eyeballs: provare IPv6 e IPv4 in parallelo con un piccolo ritardo.
  2. Gestione dei timeout: non lasciare che i tentativi IPv6 ritardino troppo IPv4.
  3. Preferenza: permettere la configurazione della preferenza IPv4/IPv6.
  4. Fallback: mantenere sempre il fallback IPv4 per compatibilità.