Riferimento
Idempotenza
Ritenta in sicurezza gli invii di email con l’header Idempotency-Key. Quali endpoint lo supportano, formato e ambito della chiave, la finestra di ripetizione di 24 ore e i relativi errori.
Con gli errori di rete e i timeout non sai con certezza se un invio è andato a buon fine. Una chiave di idempotenza ti permette di ritentare l’invio in sicurezza: se Emailit ha già accettato una richiesta con la stessa chiave, restituisce la risposta originale invece di inviare di nuovo l’email. Questa pagina è il riferimento per l’header Idempotency-Key. Per una guida passo passo, vedi Richieste idempotenti.
Endpoint supportati
| Endpoint | |
|---|---|
POST /emails |
Invia un’email |
POST /emails/{id}/forward |
Inoltra un’email |
Gli altri endpoint ignorano l’header. La creazione di un dominio, di una chiave API, di una lista o di un contatto si può già ritentare in sicurezza: una seconda richiesta con lo stesso nome o la stessa email restituisce 409 e l’oggetto existing invece di creare un duplicato.
Invia una chiave
Aggiungi un header Idempotency-Key con un valore univoco per l’email che stai inviando, ad esempio un UUID o un ID del tuo sistema:
curl https://api.emailit.com/v2/emails \
-H "Authorization: Bearer $EMAILIT_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1042-confirmation" \
-d '{
"from": "Acme <orders@acme.com>",
"to": "ada@example.com",
"subject": "Your order #1042",
"html": "<p>Thanks for your order.</p>"
}'const response = await fetch('https://api.emailit.com/v2/emails', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.EMAILIT_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': `order-${order.id}-confirmation`,
},
body: JSON.stringify({
from: 'Acme <orders@acme.com>',
to: order.email,
subject: `Your order #${order.id}`,
html: '<p>Thanks for your order.</p>',
}),
});import os
import requests
response = requests.post(
"https://api.emailit.com/v2/emails",
headers={
"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}",
"Idempotency-Key": f"order-{order['id']}-confirmation",
},
json={
"from": "Acme <orders@acme.com>",
"to": order["email"],
"subject": f"Your order #{order['id']}",
"html": "<p>Thanks for your order.</p>",
},
timeout=30,
)Genera la chiave una sola volta per ogni email, prima del primo tentativo, e invia la stessa chiave a ogni nuovo tentativo per quell’email.
Come funzionano le chiavi
| Regola | Dettagli |
|---|---|
| Formato | Da 1 a 256 caratteri. Solo lettere, cifre, trattini (-) e trattini bassi (_). |
| Ambito | Per workspace. Le chiavi di workspace diversi non entrano mai in conflitto, ma i due endpoint condividono un unico spazio dei nomi, quindi non riusare per un inoltro la chiave di un invio. |
| Durata | La risposta a una richiesta riuscita viene conservata per 24 ore dal suo completamento. |
| Ripetizioni | Una richiesta con una chiave memorizzata restituisce la risposta memorizzata con stato 200. Non viene inviata alcuna email, non vengono consumati crediti e la richiesta non viene conteggiata nei limiti di invio. |
| Corrispondenza | Viene confrontata solo la chiave, non il corpo della richiesta. Una richiesta diversa con una chiave già usata restituisce la prima risposta. |
| Errori | Se una richiesta non riesce, con qualsiasi errore, non viene memorizzato nulla e la chiave viene liberata, così puoi correggere la richiesta e ritentare con la stessa chiave. |
| Concorrenza | Finché una richiesta con una chiave è ancora in esecuzione, un’altra richiesta con la stessa chiave restituisce 409. Il blocco viene rilasciato quando la prima richiesta termina e scade al massimo dopo 15 minuti. |
Una richiesta ripetuta passa comunque per l’autenticazione e per il controllo dei limiti di invio al secondo e giornalieri, quindi può restituire 401 o 429. Gli inoltri rientrano inoltre nel limite orario degli inoltri, anche quando la risposta viene ripetuta.
Errori
{
"error": "Invalid Idempotency-Key"
}{
"error": "Idempotency key in progress",
"message": "A request with this Idempotency-Key is already being processed. Retry shortly with the same key."
}{
"error": "Idempotency unavailable",
"message": "Unable to process Idempotency-Key right now. Retry the request with the same key."
}| Stato | error |
Causa | Cosa fare |
|---|---|---|---|
400 |
Invalid Idempotency-Key |
La chiave è vuota, supera i 256 caratteri o contiene caratteri diversi da lettere, cifre, - e _. |
Usa un UUID o un altro valore sicuro. |
409 |
Idempotency key in progress |
Una richiesta con la stessa chiave è ancora in elaborazione. | Attendi un secondo e ritenta con la stessa chiave. Quando la prima richiesta sarà terminata, riceverai la risposta memorizzata. |
503 |
Idempotency unavailable |
Al momento Emailit non riesce a controllare la chiave. La richiesta non è stata elaborata. | Ritenta con la stessa chiave dopo una breve attesa. |
Emailit non invia mai una richiesta senza il controllo di idempotenza: se la chiave non può essere controllata, la richiesta non riesce con 503 invece di rischiare un duplicato.
Scegli chiavi adatte
- Ricava la chiave da ciò che stai notificando, come
order-1042-confirmationopassword-reset-<token-id>, così un nuovo tentativo da un altro worker o dopo un riavvio usa la stessa chiave. - Usa un nuovo UUID solo quando l’email non ha un ID naturale, e salvalo insieme al job prima del primo tentativo.
- Non riusare una chiave per un’email diversa entro 24 ore. Riceveresti la risposta della prima email e la seconda non verrebbe inviata.