guida · api email di resend
Come dovrebbe implementare in sicurezza l'API email di Resend un team di prodotto?
Implementa l'API email di Resend dietro un worker server attendibile, non nel codice del browser o delle app mobile. Verifica il dominio di invio esatto, crea una chiave API solo per l'invio limitata a quel dominio quando possibile, salva un job in uscita approvato e passa una `Idempotency-Key` stabile a `POST /emails`. Memorizza l'ID email restituito, verifica le firme dei webhook prima di analizzarli, elabora gli eventi in modo idempotente e sopprimi i destinatari a rischio. Tieni come stati separati accettazione da parte dell'API, invio da parte del provider, consegna al server ricevente e arrivo in inbox.
Definisci l'operazione di prodotto prima della richiesta al provider
Parti da un'operazione applicativa circoscritta, come la verifica dell'account, una ricevuta, un avviso di sicurezza o una notifica richiesta dal destinatario. L'endpoint pubblico del prodotto dovrebbe autorizzare chiamante, tenant, classe di messaggi, identità del mittente, destinatari e template prima che esista qualsiasi payload per Resend. Non permettere a un browser di inviare `from`, `to`, HTML o opzioni del provider arbitrari mentre detiene una credenziale riutilizzabile. Crea un record interno persistente in uscita che contenga una chiave dell'evento applicativo, tenant, revisione del template, mittente approvato, insieme dei destinatari e stato corrente. Un worker può tradurre quel record nella richiesta al provider. Questo confine tiene chiavi API e contenuti non attendibili lontani dai client, rende testabile la prevenzione dei duplicati e permette al prodotto di cambiare provider senza riscrivere ogni flusso di business. Separa nel modello interno i messaggi transazionali da quelli che dipendono dal consenso, così che preferenze, soppressioni e decisioni sugli incidenti restino esplicite.
Verifica il dominio esatto usato nell'indirizzo From
Aggiungi in Resend un dominio che controlli e pubblica i record DNS indicati per quel dominio. Verifica il dominio o sottodominio dell'organizzazione effettivamente usato nell'indirizzo From visibile, invece di dare per scontato che lo copra un'identità padre non correlata. Esamina le policy SPF e DMARC esistenti prima di modificare il DNS e non creare mai un secondo record SPF per lo stesso hostname. Usa un sottodominio di invio dedicato quando requisiti di isolamento, proprietà o migrazione lo giustificano. Dopo che la dashboard segnala la verifica, esamina un messaggio di test ricevuto per confermare indirizzo From visibile, identità di firma DKIM, return path, risultati dell'autenticazione e comportamento delle risposte. La verifica del provider dimostra che un'identità configurata ha superato il controllo di configurazione del provider. Non dimostra il consenso del destinatario, l'accettazione da parte del server ricevente, l'arrivo in inbox o una buona reputazione. Conserva la proprietà del DNS e la cronologia delle modifiche fuori dalla dashboard del provider, così che rotazione e rollback restino possibili.
Crea una chiave API con privilegi minimi per ogni carico di lavoro
Resend documenta chiavi API con livelli di accesso e restrizione facoltativa al dominio. Un worker di invio dovrebbe usare una chiave limitata all'accesso in invio e, quando l'architettura lo consente, all'unico dominio di cui quel carico è responsabile. Tieni la gestione di domini, webhook e amministrazione dell'account sotto un'autorità separata. Crea chiavi separate per sviluppo, staging e produzione, così che un ambiente inferiore non possa inviare con l'identità di produzione né consumarne i limiti. Conserva ogni segreto direttamente in un archivio di segreti gestito, esponilo solo al processo server che ne ha bisogno e passalo come autorizzazione Bearer su HTTPS. Non copiare la chiave nel controllo del codice sorgente, negli artefatti di build, nei log, nei template, negli analytics, nei ticket o nei prompt. La rotazione va provata: crea una chiave sostitutiva con lo stesso ambito, aggiorna il worker, verifica il traffico controllato e la correlazione degli eventi, poi revoca la vecchia chiave. Imposta avvisi per errori di autenticazione e autorizzazione inattesi, perché possono segnalare scadenza, revoca, deriva dell'ambito o esposizione del segreto.
Un solo job persistente e un solo tentativo di invio idempotente
Riserva il job interno in uscita prima di chiamare Resend. Ricava un valore di idempotenza da un fatto di prodotto stabile, come tenant, tipo di operazione e ID immutabile dell'evento applicativo, non da un tentativo casuale. Invia quel valore nell'intestazione `Idempotency-Key`. Resend documenta attualmente che queste chiavi impediscono richieste email duplicate, scadono dopo 24 ore e possono contenere al massimo 256 caratteri. Quella finestra del provider è utile, ma non è una garanzia completa contro i duplicati a livello di prodotto. Mantieni un vincolo di unicità sulla chiave dell'evento interno per i flussi di business più lunghi, serializza i worker che possono prendere in carico lo stesso job e memorizza l'ID email del provider restituito da una richiesta riuscita. Se un timeout di rete rende ambigua l'accettazione, tieni il job in uno stato sconosciuto e riconcilialo con i log o gli eventi del provider prima di inviare di nuovo. Riutilizzare una sola chiave stabile per la stessa operazione logica è più sicuro che generarne una nuova a ogni nuovo tentativo di trasporto.
Costruisci e convalida la richiesta email con attenzione
L'endpoint di invio email di Resend accetta un indirizzo From, destinatari, oggetto e contenuto del messaggio, con opzioni documentate come testo, HTML, contenuto renderizzato con React, template, Cc, Bcc, reply-to, intestazioni, allegati, tag e consegna pianificata. Esponi solo il sottoinsieme di cui il prodotto ha bisogno. Convalida la sintassi degli indirizzi e la proprietà del tenant, limita il numero di destinatari e allegati al di sotto dei limiti del provider, rifiuta l'iniezione di caratteri di nuova riga nelle intestazioni e costruisci il contenuto MIME con librerie mantenute o campi attendibili del provider. Non inserire credenziali, dati personali sensibili o input dei clienti non filtrati in tag o intestazioni. Memorizza una revisione del template e variabili sanificate invece di registrare il contenuto completo. Un adapter interno dovrebbe restituire un risultato circoscritto, come l'ID del provider accettato o un errore classificato, senza far trapelare i dettagli della risposta del provider nel codice di business. Così puoi aggiornare nomi dei campi specifici del provider, versioni dell'SDK o limiti delle richieste senza cambiare il contratto degli eventi di prodotto.
Classifica risposte API e limiti di utilizzo prima di ritentare
Tratta la risposta HTTP come un'osservazione all'interno del flusso. Una risposta di invio riuscita restituisce un identificatore email da memorizzare con il job interno, ma non stabilisce l'accettazione da parte della destinazione né l'arrivo in inbox. Correggi gli errori di validazione, autenticazione, dominio, permessi e payload invece di ritentarli alla cieca. Resend documenta limiti sulle richieste API e restituisce intestazioni su limite di frequenza (rate limit) e quota, con campi che descrivono capacità residua, tempo di reset e ritardo prima del nuovo tentativo; una risposta 429 dovrebbe attendere l'intervallo documentato con l'aggiunta di jitter. Ritenta gli errori di trasporto e gli errori server idonei con backoff esponenziale, un numero finito di tentativi e la stessa chiave di idempotenza logica finché vale la sua finestra documentata. Gli errori ambigui richiedono una riconciliazione, perché il provider potrebbe aver accettato l'email anche se il client non ha ricevuto la risposta. Imposta avvisi quando errori ripetuti si concentrano su un dominio, un template, una chiave o un tenant, ma tieni credenziali, contenuti completi e dati dei destinatari non necessari fuori dai log operativi.
Autentica le richieste webhook prima di elaborare gli eventi
Configura un endpoint webhook HTTPS dedicato e conserva il body raw esatto della richiesta. Resend documenta la firma dei webhook tramite intestazioni compatibili con Svix e segreti di firma. Verifica ID del webhook, timestamp e firma sul payload non modificato prima del parsing JSON o di una riserializzazione, e usa il flusso di verifica ufficiale o una libreria compatibile mantenuta. Rifiuta le richieste non valide o scadute, limita la dimensione delle richieste e tieni il segreto di firma separato dalla chiave di invio. Dopo l'autenticazione, salva o accoda l'evento in modo persistente prima di confermarlo, così che un crash del processo non scarti silenziosamente le prove di consegna. I sistemi di consegna possono ritentare e duplicare i webhook, quindi usa l'identificatore dell'evento come chiave di deduplicazione e rendi monotone le transizioni di stato. Un evento successivo o duplicato non deve sovrascrivere un risultato finale più informativo solo perché è arrivato per ultimo. Registra gli errori di verifica e il ritardo degli eventi come segnali operativi, senza conservare il contenuto raw dei messaggi oltre il periodo di conservazione necessario.
Modella gli eventi del provider senza sopravvalutare la consegna
Resend pubblica tipi di evento email con nome, tra cui sent, delivered, delivery delayed, bounced, complained, failed, opened e clicked. Mappa questi nomi del provider in un modello di stato interno con il tipo di evento originale, l'ID email del provider, l'ID dell'evento, il timestamp, l'ambito del destinatario e i dati diagnostici disponibili. Un evento sent descrive l'avanzamento presso il provider. Un evento delivered segnala la consegna secondo la semantica degli eventi documentata da Resend, ma un esito SMTP positivo presso un sistema ricevente non rivela comunque la cartella finale del destinatario. Aperture e clic sono osservazioni di engagement, non prove di consegna, e le tecnologie per la privacy possono influenzarle. Bounce, segnalazioni di spam ed errori permanenti dovrebbero aggiornare lo stato di sicurezza del destinatario prima della successiva decisione di invio. Mantieni la cronologia degli eventi del provider in sola aggiunta e ricava lo stato mostrato all'utente con regole esplicite. Così conservi le prove per il supporto ed eviti nuovi tentativi non sicuri dopo che la responsabilità è stata trasferita o che un destinatario ha fornito un segnale negativo.
Testa i percorsi di errore e di recupero con destinatari controllati
Usa una chiave non di produzione, un sottodominio verificato controllato e caselle di proprietà del team. Testa contenuto in testo e HTML, comportamento di reply-to, limiti sugli allegati, chiavi di idempotenza stabili e identificatori del provider memorizzati. Invia due volte lo stesso job logico e conferma che i controlli dell'applicazione e del provider non creino un duplicato involontario. Prova payload non valido, dominio errato, chiave revocata, permessi insufficienti, limite di frequenza, timeout di trasporto, bounce, segnalazione di spam, ritardo di consegna, webhook duplicato, body firmato modificato, timestamp del webhook scaduto e rotazione del segreto di firma. Conferma che l'acquisizione degli eventi sia persistente prima della conferma e che la sicurezza del destinatario blocchi un job successivo. Testa la rotazione DNS e la rimozione del provider senza eliminare record non correlati. Le dashboard dovrebbero coprire errori di invio, latenza, errori di verifica dei webhook, ritardo degli eventi, bounce, segnalazioni di spam e code di riconciliazione. Al lancio consulta la documentazione attuale di Resend e le impostazioni dell'account, perché quote, limiti, campi degli eventi e permessi disponibili possono cambiare indipendentemente dal codice dell'applicazione in produzione.
Confronta le funzionalità API pubblicate prima della migrazione
SendHQ pubblica un contratto OpenAPI 3.1 per la sua API email con ambito limitato al workspace, inclusi invio da domini verificati, email in entrata, template ospitati, eventi di consegna e soppressioni. Prima di migrare un'integrazione, confronta body delle richieste, autenticazione, idempotenza, identificatori restituiti, forme degli errori, webhook, regole di dominio e comportamento delle soppressioni, quindi convalidali con test a livello di campo. Non presumere la compatibilità da nomi di endpoint simili.
Domande frequenti
Quale endpoint invia un'email tramite Resend?
Resend documenta `POST https://api.resend.com/emails` con autorizzazione Bearer. Chiamalo solo da codice server attendibile, dopo aver autorizzato l'operazione di prodotto, il dominio mittente, i destinatari e il contenuto.
Quale ambito dovrebbe avere una chiave API di Resend?
Usa una chiave con accesso in invio e limitala al dominio del carico di lavoro quando i controlli documentati si adattano all'architettura. Tieni l'autorità di produzione, quella non di produzione e quella amministrativa su credenziali separate gestite come segreti.
Una risposta API di Resend riuscita dimostra la consegna?
No. Registra l'accettazione da parte del provider e restituisce un identificatore email. Eventi autenticati successivi possono segnalare l'avanzamento presso il provider e la consegna al sistema ricevente, mentre l'arrivo in inbox resta una classificazione separata lato ricevente.
Come fa l'idempotenza di Resend a evitare email duplicate?
Invia una sola `Idempotency-Key` stabile per la stessa richiesta logica. Resend attualmente conserva le chiavi per 24 ore con un massimo di 256 caratteri, quindi mantieni anche un vincolo di unicità interno di durata maggiore.
Come vanno verificate le firme dei webhook di Resend?
Conserva il body raw esatto della richiesta e verifica le intestazioni documentate compatibili con Svix per ID del webhook, timestamp e firma prima del parsing. Rifiuta gli input non validi o scaduti, poi accoda in modo persistente gli eventi autenticati prima di confermarli.
SendHQ può sostituire Resend?
Confronta i contratti API pubblicati ed esegui test di integrazione a livello di campo prima di considerare SendHQ e Resend compatibili.
Fonti
- API di invio email di Resend — Resend
- Chiavi API di Resend — Resend
- Domini di Resend — Resend
- Chiavi di idempotenza di Resend — Resend
- Limiti di utilizzo di Resend — Resend
- Webhook di Resend — Resend
- Verificare le richieste webhook di Resend — Resend
- Tipi di evento dei webhook di Resend — Resend
- RFC 5321: Simple Mail Transfer Protocol (SMTP) — RFC Editor
- Contratto OpenAPI di SendHQ — SendHQ