Nel post del blog SMTP vs. IMAP vs. POP3, abbiamo spiegato che una sessione SMTP è una sorta di conversazione tra un client SMTP e un server SMTP. Il client parla usando comandi che consistono in caratteri alfabetici. Il server risponde con codici numerici. Oggi esamineremo questo aspetto in dettaglio. Scoprirai i comandi SMTP validi e quelli obsoleti. Inoltre, chiariremo quali codici di risposta corrispondono a ciascun comando.
Comandi SMTP essenziali nell’ordine in cui possono essere utilizzati
Ogni comando SMTP definisce una funzione particolare all’interno della sessione SMTP, che consiste in tre fasi:
- handshake – stabilire una connessione TCP
- trasferimento delle email – manipolazioni con l’email
- finalizzazione – terminare una connessione TCP
Pertanto, abbiamo deciso di elencare i comandi SMTP secondo questo flusso.
HELO/EHLO
Il comando HELO
inizia la conversazione della sessione SMTP. Il client saluta il server e si presenta. Di solito, HELO
è attribuito con un argomento che specifica il nome di dominio o l’indirizzo IP del client SMTP.
Esempio: HELO client.net
EHLO
è un’alternativa a HELO
per i server che supportano le estensioni del servizio SMTP (ESMTP). Se il server non supporta ESMTP, risponderà con un errore.
Esempio: EHLO client.net
In ogni caso, HELO
o EHLO
è un comando OBBLIGATORIO per il client SMTP per iniziare un trasferimento di email.
MAIL FROM
Il comando MAIL FROM
avvia un trasferimento di email. Come argomento, MAIL FROM
include una casella postale del mittente (reverse-path). Per alcuni tipi di messaggi di segnalazione come le notifiche di mancata consegna, il reverse-path può essere vuoto. Possono essere specificati anche parametri opzionali.
Esempio: MAIL FROM "prova@client.net"
RCPT TO
Il comando RCPT TO
specifica il destinatario. Come argomento, RCPT TO
include una casella postale di destinazione (forward-path). In caso di più destinatari, RCPT TO
verrà utilizzato per specificare ciascun destinatario separatamente.
Esempio: RCPT TO "utente@destinatario.net"
DATA
Con il comando DATA
, il client chiede al server il permesso di trasferire i dati dell’email. Il codice di risposta 354
concede il permesso, e il client avvia la consegna del contenuto dell’email riga per riga. Questo include la data, l’intestazione da, la riga dell’oggetto, l’intestazione a, gli allegati e il corpo dell’email.
Una riga finale contenente un punto (“.
”) termina il trasferimento dei dati dell’email. Il server risponde alla riga finale.
Esempio:DATA
354 (server response code)
Date: Wed, 30 July 2019 06:04:34
From: prova@client.net
Subject: Come funziona l'SMTP
To: utente@destinatario.net
Corpo dell'email
.
NOOP
Il comando NOOP
viene utilizzato solo per verificare se il server può rispondere. Risposta “250 OK
”
Esempio: NOOP
HELP
Con il comando HELP
, il client richiede un elenco di comandi che il server supporta. HELP
può essere utilizzato con un argomento (un comando specifico). Se il server supporta questo, fornirà le informazioni corrispondenti a questa richiesta.
Esempio: HELP
VRFY e EXPN
VRFY
viene utilizzato per verificare se una casella postale nell’argomento esiste sull’host locale. La risposta del server include la casella postale dell’utente e può includere il nome completo dell’utente.
Esempio:VRFY user2
250 Anna Bianchi utente2@client.net (risposta del server)
EXPN
viene utilizzato per verificare se una mailing list nell’argomento esiste sull’host locale. La risposta positiva specificherà l’appartenenza dei destinatari.
Esempio:EXPN mail-list
250-utente1@client.net (risposta del server)
250-utente2@client.net (risposta del server)
250-utente3@client.net (risposta del server)
Il trattino (-) tra il codice numerico e la casella postale dell’utente indica che la risposta continua nella riga successiva.
VRFY
e EXPN
implementano l’autenticazione SMTP. Inoltre, sono utili per eseguire un audit interno del server. D’altra parte, questi comandi sono considerati un rischio per la sicurezza. Gli spammer possono usarli per raccogliere indirizzi email validi dal server. Pertanto, i sistemi di messaggistica installano protezioni corrispondenti o disabilitano i comandi.
RSET
Il comando RSET
reimposta la connessione SMTP allo stato iniziale. Cancella tutti i buffer e le tabelle di stato (sia mittente che destinatario). RSET
riceve solo la risposta positiva del server – 250
. Allo stesso tempo, la connessione SMTP rimane aperta ed è pronta per una nuova transazione di posta.
Esempio: RSET
QUIT
Il comando QUIT
invia la richiesta di terminare la sessione SMTP. Una volta che il server risponde con 221
, il client termina la connessione SMTP. Questo comando specifica che il ricevente DEVE inviare una risposta “221 OK
” e poi chiudere il canale di trasmissione.
Esempio: QUIT
Comandi SMTP estesi che alcuni server SMTP possono supportare
STARTTLS
Il comando STARTTLS
viene utilizzato per avviare un handshaking TLS per una sessione SMTP sicura. STARTTLS
reimposta il protocollo SMTP allo stato iniziale. Una volta ricevuta la risposta 220
dal server, il client SMTP dovrebbe inviare HELO
o EHLO
per avviare la sessione. In caso di risposta negativa (454
), il client deve decidere se continuare la sessione SMTP o meno.
Esempio: STARTTLS
AUTH
Il comando AUTH
viene utilizzato per autenticare il client al server. Per questo, utilizza un argomento che specifica diversi livelli di sicurezza e metodi di accesso: PLAIN
, LOGIN
e CRAM-MD5
. La sessione è considerata autenticata una volta che il server ha fornito una risposta positiva. Per ulteriori informazioni, leggi il post del blog sull’autenticazione SMTP.
Esempio: AUTH CRAM-MD5
ATRN
Il comando ATRN
ha sostituito il comando obsoleto TURN
. Veniva utilizzato per invertire la connessione tra i server SMTP locali ed esterni (mittente e destinatario). TURN
mancava di autenticazione e quindi è stato superato. ATRN
è privo di questo difetto. Inoltre, è disponibile per indirizzi IP assegnati dinamicamente.
Esempio: ATRN client.net,client.com
250 OK now reversing the connection
(risposta del server)
BDAT
Il comando BDAT
viene utilizzato per inviare contenuti di posta. Può essere un’alternativa al comando DATA
. BDAT
ha due argomenti. Il primo definisce la lunghezza del blocco di dati in ottetti. Il secondo indica che il blocco di dati è terminato. Non è necessario un punto per terminare il trasferimento di email come nel comando DATA
. BDAT
è ampiamente utilizzato in Microsoft Exchange Server. Allo stesso tempo, DATA
è un comando obbligatorio da supportare per tutti i server.
Esempio:BDAT 67 LAST
To: utente@destinatario.net
From: prova@client.net
Subject: Come funziona l'SMTP
250 Message OK, 67 octets received (risposta del server)
ETRN
Il comando ETRN
è la richiesta di avviare l’elaborazione della coda SMTP di un host server specificato.
Esempio:ETRN client.com
250 OK, queuing for client.com started (risposta del server)
Comandi SMTP ad uso privato
Il client e il server possono utilizzare comandi SMTP ad uso privato tramite un accordo bilaterale. Questi sono estensioni del servizio proprietari e dovrebbero iniziare con “X”. Non devono essere registrati o standardizzati. Eccone alcuni:
XADR
– rilascia lo stato del canale a cui corrisponde un indirizzo (come viene instradato un indirizzo internamente)XCIR
– rilascia lo stato della funzione di controllo del circuitoXSTA
– rilascia lo stato del numero di messaggi nelle code dei canaliXGEN
– rilascia lo stato di utilizzo di una configurazione compilata e di un set di caratteri
Comandi SMTP obsoleti
Sul web ci sono molte fonti obsolete dove puoi incontrare comandi SMTP obsoleti. Per non perdere tempo con opzioni non valide, ecco un elenco dei comandi che non puoi più usare:
SEND
SOML
SAML
RELAY
TLS
TURN
Codici di risposta SMTP
Il server SMTP risponde al client utilizzando un codice a tre cifre. Ogni cifra ha un significato speciale:
- Prima (2 a 5) – denota se la richiesta è accettata, incompleta o rifiutata
- Seconda (0 a 5) – denota il tipo di errore verificatosi (sintassi, informazioni, connessioni, sistema di posta o non specificato (due opzioni)).
- Terza (0 a 5) – fornisce una descrizione più precisa (insieme a una spiegazione testuale)
Il codice numerico è seguito da un testo destinato a un utente umano per comprendere il punto. Diversi server possono utilizzare una descrizione testuale modificata della risposta, mentre il codice numerico è permanente. Quindi, ecco con cosa può rispondere il tuo server SMTP:
Codice | Cosa significa |
101 | Errore di connessione al server (nome server errato o porta di connessione errata) |
211 | Stato del sistema (risposta a HELP ) |
214 | Messaggio di aiuto (risposta a HELP ) |
220 | Il server è pronto (risposta al tentativo del client di stabilire una connessione TCP) |
221 | Il server chiude il canale di trasmissione |
235 | Autenticazione riuscita (risposta a AUTH ) |
250 | Il comando richiesto è completato. Di norma, il codice è seguito da OK |
251 | L’utente non è locale, ma il server inoltrerà il messaggio a <forward-path> |
252 | Il server non può verificare l’utente (risposta a VRFY ). Il messaggio sarà accettato e verrà tentata la consegna |
334 | Risposta al comando AUTH quando il meccanismo di sicurezza richiesto è accettato |
354 | Il server conferma il trasferimento del contenuto della posta (risposta a DATA ). Dopo di ciò, il client inizia a inviare la posta. Terminato con un punto (“. ”) |
421 | Il server non è disponibile perché chiude il canale di trasmissione |
422 | La casella di posta del destinatario ha superato il limite di archiviazione |
431 | Sovraccarico di file (troppi messaggi inviati a un dominio particolare) |
441 | Nessuna risposta dal server del destinatario |
442 | Connessione interrotta |
446 | Si è verificato un ciclo interno |
450 | Casella di posta non disponibile (occupata o temporaneamente bloccata). Azione richiesta interrotta |
451 | Il server ha interrotto il comando a causa di un errore locale |
452 | Il server ha interrotto il comando a causa di spazio di archiviazione insufficiente |
454 | TLS non disponibile per un motivo temporaneo (risposta a STARTTLS ) |
455 | Parametri non possono essere soddisfatti |
471 | Errore del server di posta a causa del filtro antispam locale |
500 | Errore di sintassi (anche una riga di comando potrebbe essere troppo lunga). Il server non può riconoscere il comando |
501 | Errore di sintassi nei parametri o negli argomenti |
502 | Il server non ha implementato il comando |
503 | Sequenza di comandi non corretta |
504 | Il server non ha implementato un parametro del comando |
510 | Indirizzo email non valido |
512 | Un errore DNS (ricontrolla l’indirizzo dei tuoi destinatari) |
523 | La dimensione totale della tua mailing supera i limiti del server destinatario |
530 | Problema di autenticazione che richiede principalmente l’esecuzione del comando STARTTLS |
535 | Autenticazione fallita |
538 | Crittografia richiesta per un meccanismo di autenticazione richiesto |
541 | Messaggio rifiutato dal filtro antispam |
550 | Casella di posta non disponibile. Il server ha interrotto il comando perché la casella postale non è stata trovata o per motivi di policy. In alternativa: Autenticazione richiesta per il relay |
551 | Utente non locale. Verrà specificato il <forward-path> |
552 | Il server ha interrotto il comando perché la casella postale è piena |
553 | Indirizzo email sintatticamente scorretto |
554 | La transazione è fallita a causa di un errore sconosciuto o Nessun servizio SMTP qui come risposta ai tentativi del client di stabilire una connessione |
555 | Parametri non riconosciuti/non implementati (risposta a MAIL FROM o RCPT TO ) |
Per saperne di più su questi codici di risposta, date un’occhiata al nostro video dedicato:
Comando-risposta
Come avrai notato sopra, alcuni codici sono specifici del comando. In realtà, solo tre di essi, 500
, 501
e 421
, possono essere una risposta a qualsiasi comando SMTP. Altri possono essere categorizzati come positivi e negativi (il codice 354
può essere considerato come una risposta intermedia). Vediamo a quali comandi possono riferirsi.
Comando | Risposta positiva | Risposta negativa |
Handshake SMTP (stabilire una connessione) | 220 | 554 |
STARTTLS | 220 | 454 |
EHLO o HELO | 250 | 502 (risposta a EHLO per server vecchi) 504 550 |
AUTH | 235 334 | 530 535 538 |
MAIL FROM | 250 | 451 452 455 503 550 552 553 555 |
RCPT TO | 250 251 | 450 451 452 455 503 550 551 552 553 555 |
DATA | 250 354 (risposta intermedia) | 450 451 452 503 550 (rifiuto per motivi di policy) 552 554 |
RSET | 250 | – |
VRFY | 250 251 252 | 502 504 550 551 553 |
EXPN | 250 252 | 502 504 550 |
HELP | 211 214 | 502 504 |
NOOP | 250 | – |
QUIT | 221 | – |
Questo è l’elenco dei codici di risposta standard. Va anche detto che alcuni server SMTP possono generare altri codici a tre cifre. In questo caso, il client SMTP dovrà interpretare la prima cifra che deve essere compresa tra 2 e 5 inclusi. Denota l’essenza della risposta (positiva o meno).
Esempio di una sessione SMTP
Ora, diamo un’occhiata a un esempio del flusso tipico di una sessione SMTP. Vedremo due scenari: una transazione riuscita e una transazione interrotta.
Transazione riuscita con verifica
Server: 220 server.net Simple Mail Transfer Service Ready
Client: EHLO client.org
S: 250-server.net greets client.org
S: 250-DSN
S: 250-VRFY
S: 250 HELP
C: VRFY Rossi
S: 250 Marco Rossi <m.rossi@server.net>
C: MAIL FROM:"utente1@client.org"
S: 250 OK
C: RCPT TO:"m.rossi@server.net"
S: 250 OK
C: RCPT TO:"a.bianchi@server.net"
S: 550 No such user here
C: DATA
S: 354 Start mail input; end with <CRLF>.<CRLF>
C: Date: Wed, 30 July 2019 06:04:34
C: From: utente1@client.org
C: Subject: Email di prova
C: To: m.rossi@server.net, a.bianchi@server.net
C: Ciao Marco e Anna
C: .
S: 250 OK
C: QUIT
S: 221 server.net Service closing transmission channel
In questo esempio, il client ha ricevuto il codice 550
che indicava che uno dei destinatari non è disponibile. Tuttavia, la transazione non è stata interrotta come nell’esempio seguente.
Transazione interrotta
Server: 220 server.net Simple Mail Transfer Service Ready
Client: EHLO client.org
S: 250-server.net greets client.org
S: 250-DSN
S: 250 HELP
C: MAIL FROM:"utente1@client.org"
S: 250 OK
C: RCPT TO:"a.bianchi@server.net"
S: 550 No such user here
C: RSET
S: 250 OK
C: QUIT
S: 221 server.net Service closing transmission channel
Vantaggi di utilizzare un ambiente di test SMTP sicuro
Una volta che un’email è atterrata sul server SMTP del mittente, è ancora all’inizio del suo viaggio. Prima di raggiungere la casella di posta del destinatario, l’email deve arrivare al server SMTP del destinatario, che la inoltra al server IMAP/POP3. E ogni server implementa l’autenticazione prima di lasciare entrare l’email. Per garantire che le tue email soddisfino i requisiti tecnici per un rapido processo di autenticazione, è sempre una buona idea testarle e debuggarle in un ambiente sicuro come Email Sandbox di Mailtrap.
Utilizzando Email Sandbox, puoi analizzare i dati grezzi, le intestazioni e altre informazioni tecniche sulle tue email. Inoltre, ti aiuta a ispezionare e convalidare HTML/CSS e ottenere rapidamente report su spam che ti aiutano a capire cosa deve essere migliorato.
Per saperne di più su Email Sandbox, consulta la nostra Guida introduttiva.