Poniamo che il tuo team rilasci una nuova email per il reset della password. Il QA dà l'ok in staging: il messaggio compare, il link funziona, il modello è a posto. Due giorni dopo il rilascio, l'assistenza ha una coda di ticket. Chi ha un indirizzo Gmail dice che l'email non è mai arrivata. Chi lavora in alcune grandi aziende dice che è arrivata, ma al primo clic il link risultava "già usato". Nessuno ha toccato il codice tra staging e produzione, e tutti i test passano ancora.
Quale indirizzo email di test per sviluppatori avrebbe scoperto il problema? Nessuno da solo. Un catcher SMTP locale va bene per lo sviluppo quotidiano, la sandbox del tuo provider o un dominio di test che controlli va bene per i test automatici, e una vera casella esterna va bene per il controllo manuale che la posta esca dal tuo ambiente simile alla produzione e arrivi sul dominio di un estraneo. Una casella temporanea come VookMail copre quest'ultimo caso senza alcuna configurazione, perché l'indirizzo è pronto quando la pagina si carica. Gli account di prova presso i grandi provider di posta coprono poi la parte che nessuno degli altri può vedere. Il resto della guida riguarda come scegliere tra queste opzioni, come leggere i guasti quando accadono e quali controlli devono far parte di un rilascio.
Perché quel reset è passato in staging
Staging e produzione raramente sono simili quanto suggerisce il diagramma di rilascio, e l'email espone le differenze più di molte altre funzioni. Un messaggio attraversa la tua applicazione, una coda, un provider, il DNS, il server del destinatario e il client del destinatario. In staging quasi tutti questi elementi possono essere in una versione diversa.
Prendi il primo ticket, gli utenti Gmail che non hanno ricevuto niente. Supponi che lo staging invii tramite un sottodominio del provider autenticato mesi fa, mentre la produzione invia da un nuovo dominio From introdotto con il rebranding. Le linee guida di Google per i mittenti richiedono a tutti di autenticarsi con SPF o DKIM, e la tabella degli errori di Gmail elenca 5.7.26 per la posta non autenticata. Una casella QA interna sul tuo dominio potrebbe lasciar passare lo stesso messaggio, perché il tuo server può fidarsi del tuo relay. Il test non poteva fallire.
Il secondo ticket, il link "già usato", ha una causa diversa. I gateway di sicurezza aziendali di solito aprono i link nella posta in arrivo per analizzarli prima che la persona li veda. Se il tuo link riscatta il token con una semplice richiesta GET, lo scanner lo consuma, e il dipendente clicca su un link morto. Nessuna delle tue caselle di staging esegue quello scanner, a meno che la tua stessa azienda non ne usi uno.
Questi due bug non si vedono dallo stesso posto. Uno richiede una vera consegna a un sistema ricevente che non gestisci. L'altro richiede un cambiamento nel comportamento del link, che una revisione scoprirebbe più facilmente di un test. È la ragione dei test a strati: ogni tipo di indirizzo risponde a una domanda e tace sulle altre.
| Cosa differisce spesso tra staging e produzione | Cosa può nascondere |
|---|---|
Dominio di invio e indirizzo From | SPF e DKIM mancanti o non allineati |
| Account o sotto-account del provider | Modalità sandbox, limiti di invio, una reputazione IP diversa |
| Destinatari | Domini interni che si fidano di te e allowlist che nascondono indirizzi sbagliati |
| Tracciamento dei clic | Link riscritti che si rompono, o un dominio di tracciamento senza certificato valido |
| Volume | Code e limiti di frequenza che mordono solo sotto carico |
| Liste di soppressione | Indirizzi di produzione che hanno respinto una volta e ora vengono saltati in silenzio |
| Impostazioni dell'URL di base | Link che puntano all'host sbagliato |
Quale indirizzo risponde a quale domanda
Ecco le opzioni, ciascuna con la domanda a cui può davvero rispondere.
Un catcher locale: "cosa ha prodotto la mia app?"
Un catcher SMTP accetta tutto ciò che la tua app invia e lo mostra in una pagina web senza consegnare nulla. Mailpit è una scelta open source diffusa. Per impostazione predefinita ascolta SMTP sulla porta 1025 e serve la sua interfaccia web sulla porta 8025, quindi punti le impostazioni di sviluppo a localhost:1025 e apri http://localhost:8025. Ethereal di Nodemailer è un'idea simile con un servizio SMTP finto ospitato online. Un catcher è veloce e privato, e ti permette di inviare a qualsiasi indirizzo senza rischio di raggiungere una persona vera. Non dice però nulla su DNS, autenticazione o filtri, perché niente attraversa internet.
L'helper di test di un framework: "il mio codice ha chiesto la posta giusta?"
La maggior parte dei framework può registrare in memoria la posta in uscita durante un'esecuzione di test. Laravel ha Mail::fake(), Django raccoglie i messaggi in django.core.mail.outbox e Rails ha ActionMailer::Base.deliveries. Usali per verificare che un job parta una sola volta con il destinatario e il token giusti. Sono il riscontro più rapido che puoi ottenere, e testano ancora meno del mondo esterno rispetto a un catcher.
La modalità di test di un provider: "la mia integrazione funziona?"
I provider offrono tipi di aiuto diversi, e le differenze contano. Amazon SES ha un simulatore di casella con indirizzi come success@simulator.amazonses.com, bounce@simulator.amazonses.com e complaint@simulator.amazonses.com, che producono quegli esiti senza danneggiare la tua reputazione. Un nuovo account SES parte anche in una sandbox in cui può inviare solo a indirizzi verificati. La modalità sandbox di SendGrid, impostata tramite mail_settings.sandbox_mode.enable, convalida la richiesta senza consegnare. Postmark accetta il token POSTMARK_API_TEST con lo stesso scopo. Sono utili per gli errori delle API e per i webhook di rimbalzo e reclamo, e non dimostrano che la posta sia arrivata a qualcuno. Controlla la documentazione aggiornata del tuo provider, perché queste funzioni cambiano.
Un dominio di test tuo: "l'intero flusso funziona, ripetutamente?"
Per i test end-to-end automatici, configura un dominio o sottodominio che controlli, con una casella catch-all o un webhook in ingresso, così il tuo codice di test può leggere la posta tramite un'API. Richiede un po' di impegno per essere impostato, ma è privato e stabile e non dipende dal sito di nessun altro. Non inventare indirizzi su domini che non possiedi. Qualcuno potrebbe possedere testuser@gmail.com, e riceverà ciò che invii. La RFC 2606 riserva example.com e i nomi di primo livello .test e .example perché la documentazione e i dati di prova abbiano un posto sicuro a cui puntare. Quei nomi non possono ricevere posta, il che li rende adatti ai dati di prova e inutili per i test di consegna.
Una vera casella temporanea esterna: "il dominio di un estraneo riceverebbe questo?"
Qui una casella temporanea si guadagna il suo posto. È una vera casella su un dominio che non controlli e per cui non hai alcuna allowlist. Il tuo messaggio deve trovare il record MX, stabilire una connessione SMTP ed essere accettato. Su VookMail, i record MX dei domini puntano a un provider di consegna della posta che riceve il messaggio e lo inoltra via HTTPS. Un indirizzo nuovo significa anche nessuna storia: nessun vecchio messaggio, nessun precedente rimbalzo nella tua lista di soppressione, nessun filtro. È quindi un modo rapido per riprodurre "mi sono registrato con un indirizzo nuovo e non ho ricevuto niente". È utile anche a chi non è sviluppatore. Un designer o un product manager può leggere ciò che riceve un nuovo utente senza alcun accesso ai tuoi strumenti.
Account di prova presso i grandi provider di posta: "dove finisce?"
Un messaggio consegnato a un dominio non ti dice nulla sulla cartella spam di un altro. Tieni un piccolo gruppo di account veri presso i provider che i tuoi utenti usano davvero, e controlla dove arriva la posta prima di cambiamenti significativi a modelli o domini. Poi osserva i numeri di rimbalzi e reclami dopo un rilascio. Se la tua posta sembra un problema di spam, questi account sono dove lo vedrai per primo.
| Approccio | Attraversa internet | Configurazione | Automazione | Riservatezza del contenuto | Fase migliore |
|---|---|---|---|---|---|
| Helper di test del framework | No | Nessuna | Eccellente | Resta nel processo | Test unitari e di funzionalità |
| Catcher SMTP locale | No | Bassa | Buona | Resta in locale | Sviluppo |
| Modalità di test del provider | Di solito no | Bassa | Buona | Resta presso il provider | Test di integrazione |
| Il tuo dominio di test | Sì | Media o alta | Buona | La controlli tu | End-to-end in CI, staging |
| Casella temporanea | Sì | Nessuna | Sconsigliata | Da trattare come pubblica | QA manuale e controlli pre-rilascio |
| Account di prova | Sì | Media | Limitata | Moderata | Controlli di recapito |
Un'esecuzione manuale con una casella temporanea
Ecco un percorso ripetibile attraverso un flusso di registrazione in staging o in un ambiente di pre-produzione. Una volta imparato dovrebbe richiedere circa dieci minuti.
- Conferma che l'ambiente usi la stessa configurazione del provider della produzione, tranne le credenziali, e contenga solo dati inventati. Se non è così, scrivilo, perché limita le conclusioni che puoi trarre.
- Apri VookMail e premi Nuovo. Digita un nome utente che codifichi il test, come
email-signup-03-x7, scegli uno degli oltre 30 domini e premi la freccia. Usa il pulsante giallo Casuale se nella posta può esserci qualcosa di sensibile, perché chiunque conosca o indovini un indirizzo può aprire quella casella. - Premi Copia e registrati come nuovo utente con dati di profilo inventati.
- Annota l'ora in cui hai inviato e l'ora in cui il messaggio compare. La casella controlla ogni pochi secondi, quindi un intervallo di minuti indica la tua coda o il tuo provider. Premi Aggiorna se vuoi esserne sicuro.
- Leggi il messaggio come lo leggerebbe un nuovo utente: nome del mittente, oggetto, testo di anteprima, corpo, pulsante, link semplice, piè di pagina. VookMail mostra i codici e i link di conferma rilevati sopra il messaggio, il che è un controllo approssimativo che il tuo codice e il tuo link siano facili da individuare.
- Guardalo con le immagini disattivate. VookMail tiene le immagini disattivate finché non le consenti e rimuove i pixel di tracciamento nascosti. Se il messaggio non ha senso in quello stato, alcuni dei tuoi utenti vedono la stessa cosa. Non usare però questa casella per giudicare il tuo tracciamento delle aperture, perché i pixel non scatteranno.
- Premi il pulsante QR, scansiona l'indirizzo con un telefono di prova e apri lì la stessa casella per toccare il link vero su un dispositivo vero, in particolare se usi universal link o app link.
- Completa la verifica e conferma che lo stato dell'account cambi come dovrebbe.
- Esegui i casi negativi dalla lista di controllo qui sotto: riusa il link, aspetta la scadenza, richiedi un nuovo invio.
- Salva le prove: schermate, orari e indirizzo usato. I messaggi vengono rimossi dopo circa un giorno, quindi una segnalazione di bug scritta la settimana prossima non avrà nulla a cui riferirsi.
- Premi Elimina e rimuovi l'account di prova se il tuo processo lo richiede.
Nello stesso browser si possono tenere più indirizzi, quindi chi invita e chi è invitato, oppure il vecchio e il nuovo indirizzo di un cambio email, possono essere aperti insieme. Se nel tuo test allegati dei file, ricorda che VookMail rifiuta i comuni file di programma come .exe e mostra un avviso sugli archivi, quindi un allegato respinto lì può non essere un bug dalla tua parte.
Leggere un guasto
"L'email non è mai arrivata" descrive un sintomo che può nascere in circa sei punti, e i team perdono ore partendo da quello sbagliato. Procedi lungo il percorso dal tuo codice verso l'esterno, e fermati al primo punto in cui non vedi più il messaggio.
- L'app ha provato? Cerca nel log dell'applicazione il tentativo di invio ed eventuali eccezioni. Cerca un job che non è mai stato creato, spesso perché una condizione o un feature flag era falso.
- Il worker è partito? Controlla i job bloccati, falliti o ritentati. Un worker di coda non riavviato dopo un rilascio può eseguire codice vecchio, e una politica di ritentativi può inviare duplicati.
- Il provider l'ha accettato? Cerca il destinatario o il
Message-IDnel registro attività del tuo provider. Accettato, differito, respinto e scartato sono quattro storie diverse. - È stato soppresso? Se quell'indirizzo ha già respinto o presentato un reclamo, molti provider saltano in silenzio gli invii futuri. Questo spesso frega i tester che riusano un vecchio indirizzo.
- Cosa ha detto il server ricevente? I log del provider in genere mostrano la risposta SMTP, e quel testo è la riga più utile di tutta l'indagine.
- Il DNS è corretto? Controlla SPF, DKIM e DMARC del dominio di invio effettivo.
- C'è ma è nascosto? Cartelle spam, schede e filtri del client vengono per ultimi, quando un account di prova può mostrartelo.
Cosa ti dice la risposta SMTP
Secondo la RFC 5321, una risposta che inizia con 4 è un guasto temporaneo, e il mittente dovrebbe riprovare più tardi. Una risposta che inizia con 5 è permanente. I codici di stato avanzati della RFC 3463 aggiungono dettagli dopo. Una riga di log inventata potrebbe essere così, solo come esempio del formato:
Solo un esempio: to=user@gmail.example status=bounced reply="550 5.7.26 unauthenticated sender"
Leggila da sinistra a destra. Il 5 significa che i ritentativi non aiuteranno. La famiglia 5.7 riguarda sicurezza o policy, il che ti manda verso DNS e firma, e lontano dall'indirizzo del destinatario. La tabella qui sotto ti dà un punto di partenza per gli schemi più comuni.
| Cosa vedi | Strato più probabile | Primo posto dove guardare |
|---|---|---|
| Niente nel log del provider | App o coda | Log dell'applicazione e job falliti |
| Il provider dice "dropped" o "suppressed" | Lista di soppressione del provider | Rimuovi l'indirizzo di test, o usane uno nuovo |
| L'API restituisce successo, ma non risulta mai niente come inviato | Modalità sandbox ancora attiva | Impostazioni del provider per quell'ambiente |
5.1.1 o simile | Indirizzo del destinatario | Errori di battitura e validazione del modulo che ha modificato l'indirizzo |
5.7.26 su Gmail | Autenticazione | SPF, DKIM e allineamento con il dominio From |
Differimenti 4xx che passano dopo un po' | Il ricevente ti rallenta | Volume, reputazione o un nuovo IP di invio |
| Consegnato in una casella esterna, mancante su Gmail | Policy o filtri del ricevente | Account di prova e linee guida di Google per i mittenti |
| Arriva, ma il link dice "già usato" | Uno scanner che precarica il link | Riscatta i token con POST, non GET |
| Il link porta a un avviso di sicurezza | Dominio di tracciamento dei clic | Certificato del sottodominio di tracciamento |
| Arriva due volte | Logica dei ritentativi | Idempotenza dei job e timeout che innescano i ritentativi |
| Arriva molto in ritardo | Coda | Capacità dei worker, e se la posta di reset condivide la coda con la posta di massa |
Quell'ultima riga è un punto di progettazione che merita una frase in più. Se i reset delle password condividono una coda con l'invio di una newsletter, aspettano dietro di essa. Dai alla posta transazionale una coda tutta sua, e idealmente un proprio sottodominio e flusso di invio, così un problema di marketing non ritarda un accesso.
Comandi che accorciano la ricerca
Puoi controllare quasi tutto questo senza lasciare il terminale. In questi esempi, sostituisci i nomi di esempio con i tuoi.
dig +short MX example.commostra dove un dominio riceve la posta. Una risposta vuota richiede più attenzione, perché la RFC 5321 permette ai mittenti di ripiegare su un record di indirizzo, mentre una risposta0 .è un MX nullo secondo la RFC 7505, cioè il dominio non accetta alcuna posta.dig +short TXT example.commostra il record SPF tra gli altri record di testo.dig +short TXT selector._domainkey.example.commostra una chiave DKIM. Prendi il selettore vero dal valores=nell'intestazioneDKIM-Signaturedel messaggio.dig +short TXT _dmarc.example.commostra la policy DMARC.openssl s_client -starttls smtp -connect smtp.example.com:587verifica che tu riesca a raggiungere il tuo relay e mostra il suo certificato. Un errore qui significa un problema di firewall o TLS, ben prima di qualsiasi questione di contenuto.swaks --to qa@example.test --from app@example.test --server localhost:1025invia un semplice messaggio a mano. Aggira la tua app, così puoi capire se un problema appartiene al tuo codice o al percorso.
Per le prove a livello di intestazioni, la vista più affidabile è una casella che controlli presso un grande provider. In Gmail, apri il messaggio, usa il menu con i tre puntini e scegli Mostra originale, che elenca in alto i risultati di SPF, DKIM e DMARC. Tieni presente che il "pass" di un ricevente non garantisce quello di un altro.
Cosa controllare in ogni flusso
"È arrivata?" è la prima domanda, e di solito la meno interessante. Ogni flusso ha poi i suoi modi di andare storto.
Reset della password
La OWASP Forgot Password Cheat Sheet è il riferimento su cui costruire. Chiede un messaggio coerente che l'account esista o no, risposte con tempi uniformi, token casuali, lunghi, conservati in modo sicuro e monouso, e Referrer-Policy: no-referrer sulla pagina di reset.
- La pagina di richiesta mostra lo stesso messaggio per indirizzi registrati e non registrati, e impiega più o meno lo stesso tempo. Una risposta immediata per gli indirizzi sconosciuti rivela quanto lo farebbe la formulazione.
- Il link funziona una volta. Aprilo una seconda volta e ottieni una spiegazione chiara con un modo per richiederne un altro.
- Richiedere un nuovo reset invalida i link più vecchi, oppure il tuo progetto dice altrimenti di proposito.
- La scadenza è applicata dal server ed è stata testata aspettando, o cambiando l'ora in un ambiente di test.
- Un reset riuscito invia un'email di conferma, e le altre sessioni vengono gestite secondo la tua policy.
- Aprire il link non cambia nulla da solo. Il token viene riscattato quando il modulo viene inviato.
- La pagina di reset non manda il proprio URL ad analytics o a sistemi di tracciamento degli errori di terze parti.
- I limiti di frequenza valgono per account oltre che per IP, così nessuno può inondare la casella di un estraneo.
- Gli indirizzi con maiuscole e minuscole miste o con il segno più funzionano come quelli semplici.
Verifica della registrazione
- Una registrazione invia un solo messaggio, anche quando il job viene ritentato.
- Il link o il codice funziona una volta, e la pagina del link scaduto offre un modo per andare avanti.
- Un nuovo invio invalida il token precedente oppure coesiste con esso come progettato, ed è limitato in frequenza.
- Gli account non verificati hanno esattamente le restrizioni che volevi.
- Registrarsi di nuovo con un indirizzo già registrato non dice a un visitatore anonimo che l'account esiste, se il tuo prodotto lo considera delicato. Uno schema comune è scrivere invece al titolare esistente.
- Il link punta all'ambiente corretto. Un messaggio di staging con un link alla produzione prima o poi modificherà dati di produzione.
Codici di accesso e magic link
- I codici sono abbastanza lunghi, scadono presto e hanno un limite di tentativi.
- I magic link mostrano una pagina di destinazione con un pulsante, e si riscattano su quel POST, così il GET di uno scanner non fa danni.
- Aprire il link su un altro dispositivo fa ciò che dice il tuo progetto, e l'utente capisce cosa è successo.
- L'oggetto contiene un codice solo se hai deciso che è accettabile, dato che le notifiche lo mostrano sulla schermata di blocco.
Cambio dell'indirizzo email
- La conferma va al nuovo indirizzo, e nulla cambia finché non è confermato.
- Un avviso va al vecchio indirizzo, così il vero titolare può reagire a una modifica non autorizzata.
- I token di reset in sospeso smettono di funzionare dopo il cambio.
- Due caselle temporanee rendono questo test rapido da eseguire a mano.
Inviti, ricevute e notifiche
- Un invito a una persona senza account porta alla registrazione con l'indirizzo precompilato o bloccato, come progettato. Un invito scaduto o revocato lo dice.
- Un invito non può essere accettato da un account diverso a meno che il tuo progetto lo consenta.
- Le ricevute mostrano importi, valute, date e fusi orari corretti per le impostazioni locali dell'utente, e gli allegati hanno nomi sensati e si aprono correttamente.
- Le modifiche alle preferenze hanno effetto dal successivo invio.
- La posta non essenziale ha un annullamento dell'iscrizione funzionante, e la posta dell'account e di sicurezza è chiaramente separata. Il nostro articolo sul sovraccarico di newsletter mostra come appare dal lato del lettore.
- Esistono modelli tradotti per ogni lingua supportata, con il corretto layout da destra a sinistra dove serve, e nessun frammento non tradotto nell'oggetto.
Rivedere il codice dei token
Testare tramite una casella mostra il comportamento. Una breve revisione del codice scopre difetti di progettazione che nessuna casella ti mostrerà. Quando leggi il codice dietro reset, verifica e magic link, cerca queste cose.
- La fonte casuale. Dovrebbe essere un generatore crittograficamente sicuro, come
secrets.token_urlsafe(32)in Python,crypto.randomBytes(32)in Node orandom_bytes(32)in PHP. Un timestamp, un ID incrementale o un hash dell'email non sono accettabili. - La lunghezza. I token dei link di solito portano almeno 128 bit di casualità. Un codice di sei cifre va bene solo con una scadenza stretta e un limite di tentativi.
- La conservazione. Conserva un hash del token, così la fuga di un database non regala link di reset funzionanti.
- Il confronto. Usa una funzione a tempo costante come
hmac.compare_digest,hash_equalsocrypto.timingSafeEqualdove confronti direttamente valori segreti. - Lo scopo. Un token di verifica non deve funzionare come token di reset, e un token per un account non deve funzionare per un altro.
- La scadenza. Il server conserva l'ora di scadenza, così non si può cambiare modificando il link.
- L'invalidazione. L'uso del token, un cambio di password per altra via o un cambio di email dovrebbero tutti annullare i token in sospeso.
- Il logging. Gli URL completi con i token non devono arrivare ai log dell'applicazione, agli eventi di analytics o ai sistemi di tracciamento degli errori. Controlla anche i log di accesso HTTP.
Intestazioni e autenticazione
Apri il sorgente grezzo in un catcher per vedere cosa ha prodotto la tua app, e in una casella che controlli presso un grande provider per vedere cosa hanno aggiunto il provider e la rete.
| Intestazione o elemento | Cosa verificare |
|---|---|
From | Il nome del marchio corretto, su un dominio che possiedi e autentichi |
Reply-To | Una casella monitorata, o omessa di proposito |
Return-Path | Il dominio dei rimbalzi, allineato al tuo dominio se ti affidi a SPF per DMARC |
DKIM-Signature | Presente, con un dominio d= allineato al dominio From |
Message-ID | Presente e unico, perché è la tua chiave per tracciare nei log del provider |
Content-Type | multipart/alternative con parti sia HTML sia testo semplice |
List-Unsubscribe, List-Unsubscribe-Post | Presenti sulla posta di massa e di marketing, con supporto all'annullamento con un clic secondo la RFC 8058 |
Auto-Submitted | auto-generated sulla posta automatica, come definito nella RFC 3834, per aiutare a prevenire cicli di risposta |
Alcune regole da controllare prima di rilasciare un nuovo dominio di invio. Una valutazione SPF non può superare dieci ricerche DNS (RFC 7208), e superare il limite è un modo facile di fallire dopo aver aggiunto un altro fornitore al tuo record. DKIM richiede che il record del selettore del provider sia pubblicato e verificabile. DMARC richiede un record sul tuo dominio From, di solito a partire da p=none con i report attivati e da irrigidire una volta confermato l'allineamento.
Anche il volume cambia le regole. Le linee guida di Google considerano un mittente di massa intorno a 5.000 messaggi al giorno verso account Gmail personali, e i mittenti di massa devono avere SPF, DKIM e DMARC, l'annullamento dell'iscrizione con un clic sulla posta promozionale e un tasso di spam segnalato dagli utenti tenuto sotto lo 0,3%, con lo 0,1% come obiettivo consigliato. Altri provider hanno regole proprie. Amazon SES, per esempio, mette un account in revisione con un tasso di rimbalzo del 5% o un tasso di reclami dello 0,1%. Leggi i valori aggiornati dalla documentazione del tuo provider prima di pianificare su di essi, perché cambiano.
Gestione e validazione degli indirizzi
I moduli rifiutano indirizzi validi più spesso di quanto la gente creda, e un bug di validazione a monte può somigliare esattamente a un guasto di consegna. Metti alla prova il tuo con questi.
| Input | Gestione prevista | Bug comune |
|---|---|---|
user+tag@example.com | Accettare | Un'espressione regolare rifiuta il segno più |
User@Example.COM | Accettare, e trattare il dominio come insensibile alle maiuscole | Account duplicati che differiscono solo per le maiuscole |
o'brien@example.com | Accettare | Rifiutato, o rompe una query o un modello se non è sottoposto a escape |
first.last@sub.example.co.uk | Accettare | La validazione presuppone un solo punto nel dominio |
| Spazi iniziali o finali | Eliminarli prima | "Email non valida" su un incolla corretto |
| Un indirizzo molto lungo | Imporre 64 caratteri per la parte locale e 254 in totale | Una colonna del database troppo corta lo tronca in silenzio |
| Domini e indirizzi internazionalizzati | Accettare o rifiutare in modo coerente, con un messaggio chiaro | Un crash nella codifica o nel logging |
| Un dominio senza percorso di posta | Avvisare o rifiutare | Un account che non potrà mai verificarsi |
Valida in modo permissivo nel modulo, poi lascia che sia l'email di conferma a dimostrare che l'indirizzo funziona. Un'espressione regolare rigida ti fa perdere utenti veri e ti dice pochissimo sull'esistenza di una casella.
Se il tuo prodotto rifiuta i domini usa e getta in produzione, il tuo processo di QA ha comunque bisogno di una via di passaggio in staging. Le opzioni comprendono una allowlist di domini di test fuori dalla produzione, un flag che disattiva il controllo negli ambienti di test, o un tuo dominio di test. Non indebolire la regola di produzione per facilitare i test. E se stai decidendo se avere quella regola, il nostro pezzo sul perché i siti bloccano le email usa e getta espone costi e benefici dal punto di vista di un titolare.
Come viene mostrata
La resa è dove la revisione di un designer aiuta di più, e richiede messaggi veri in client veri.
- La parte in testo semplice si legge bene e include il link completo. "Clicca il pulsante qui sotto" lì non serve a nulla.
- La modalità scura lascia visibili i loghi e mantiene il contrasto. VookMail ha una modalità scura, che è un inizio, e i client preferiti dai tuoi utenti sono la vera prova.
- Con le immagini bloccate, l'invito all'azione resta un vero link di testo o un pulsante HTML.
- I pulsanti sono abbastanza grandi da toccare, e gli URL lunghi non rompono il layout su telefono.
- Il testo di anteprima è scritto di proposito, senza residui del modello.
- Le intestazioni sono semantiche, il contrasto è sufficiente, il testo dei link è descrittivo e l'HTML ha un attributo di lingua.
- I dati mancanti non producono "Ciao {first_name}" o "Ciao ,".
- La dimensione del messaggio resta ben sotto circa 102 KB, il punto oltre il quale secondo molte segnalazioni Gmail tronca i messaggi lunghi. Il troncamento può nascondere il piè di pagina e qualsiasi link di annullamento nel corpo.
Protezioni contro gli incidenti
Gli incidenti imbarazzanti con le email sono per lo più errori di configurazione: posta di staging che raggiunge clienti veri, produzione con una chiave di test, link a localhost. Poche impostazioni ne prevengono la maggior parte.
Tieni credenziali separate per ogni ambiente, in variabili d'ambiente o in un gestore di segreti. Fuori dalla produzione, usa una allowlist di destinatari in modo che il mailer consegni solo ai domini di test approvati e reindirizzi o scarti tutto il resto. Costruisci ogni link da un'unica impostazione, come APP_URL, così i modelli non contengono host scritti a mano. Anteponi agli oggetti non di produzione qualcosa come [STAGING], così un messaggio finito per errore a qualcuno risulta ovvio a chi lo riceve.
Se copi dati di produzione in staging, sostituisci ogni indirizzo vero con uno sintetico prima che parta qualsiasi worker di posta. L'ordine conta, perché un worker che parte per primo può iniziare subito a smaltire la posta programmata. E tieni traccia in modo deliberato della modalità sandbox per ogni ambiente. Lanciare con la produzione ancora in sandbox è un classico: l'API restituisce successo, i log sembrano puliti e nessuna posta esce.
Le suite automatiche devono restare su infrastrutture che controlli
Una casella temporanea pubblica è la dipendenza sbagliata per la CI. Fare scraping della pagina web di qualcun altro è fragile, e le tue build fallirebbero per motivi che non c'entrano con il tuo codice. Inoltre mette il traffico dei tuoi test su un servizio che non gestisci. I messaggi lì possono essere letti da chiunque abbia l'indirizzo, quindi niente di automatico dovrebbe dipenderne.
Una soluzione sensata è fatta così. Gli helper del framework verificano che la posta giusta venga richiesta. Un container Mailpit nel tuo stack di test riceve il messaggio vero, e il tuo test lo legge tramite l'API HTTP di Mailpit (GET /api/v1/messages), estrae il link e lo segue. La modalità di test del provider mette alla prova webhook e gestione degli errori. Un job notturno sul tuo dominio di test invia tramite il provider vero e legge il risultato tramite un webhook in ingresso, così hai un segnale giornaliero che la consegna reale funziona ancora.
La posta temporanea appartiene alle parti umane del testing: sessioni esplorative in cui ti serve rapidamente una nuova identità, uno smoke test prima del rilascio, la riproduzione della segnalazione di un utente, le revisioni di testi e design e i test su telefono. Per quest'ultimo, il pulsante QR o l'app da Google Play o da Huawei AppGallery porta la casella su un dispositivo di prova. Controlla che i link aprano la tua app quando è installata e ripieghino su una pagina web funzionante quando non lo è, e che l'app si accorga dello stato verificato senza richiedere un nuovo accesso.
Un caso di test che sopravvive a un passaggio di consegne
Casi di test coerenti sono più facili da ripetere a ogni rilascio e da passare tra tester. Questo esempio ha i campi che tendono a contare.
| Campo | Esempio |
|---|---|
| ID del test | EMAIL-RESET-03 |
| Flusso | Reset della password, riuso del token |
| Precondizioni | Account di test verificato in staging, con un nuovo indirizzo temporaneo |
| Passaggi | Richiedi un reset, apri il link, imposta una nuova password, apri di nuovo lo stesso link |
| Risultato atteso | Il secondo uso spiega che il link non è più valido e offre una nuova richiesta |
| Prove | Schermate, Message-ID se disponibile, orari, indirizzo usato |
| Ambiente | Numero di build di staging e configurazione della posta |
Mettere l'ID del test nel nome utente, come in email-reset-03-x7, lega ogni casella al suo caso e impedisce a due tester di scontrarsi su uno stesso indirizzo. Il breve suffisso casuale c'è perché chiunque può aprire una casella se ne indovina il nome.
Cosa non inviare a una casella pubblica
Tratta qualsiasi casella temporanea come leggibile da chiunque conosca l'indirizzo, e testa di conseguenza.
- Invia solo dati sintetici: nomi finti, ordini finti, indirizzi finti. I dati veri dei clienti non vanno lì, e a seconda di dove operi, inviarli potrebbe anche crearti un problema legale.
- Non inviare mai chiavi API, credenziali di database o inviti di amministratore per sistemi veri.
- Elimina regolarmente gli account di test, soprattutto quelli con privilegi. Un utente di test amministratore legato a una casella pubblica è una porta d'ingresso se qualcun altro apre quella casella e chiede un reset. Dato che l'indirizzo non è riservato a te dopo che è stato svuotato, questo rischio resta anche dopo il test.
- Non usare mai un indirizzo temporaneo come titolare di un vero account di produzione o di un servizio di terze parti su cui la tua azienda fa affidamento.
- Conosci il periodo di conservazione. Messaggi e allegati spariscono dopo circa un giorno, e l'informativa sulla privacy ha i dettagli.
Testare il proprio prodotto è uno degli usi legittimi più chiari delle email usa e getta. Mantienilo tale: testa sistemi tuoi o che sei autorizzato a testare. Non usare caselle temporanee per creare account sui servizi di altre aziende contro i loro termini, per raccogliere periodi di prova o per fare test di carico sul modulo di registrazione di qualcun altro. I termini e condizioni trattano l'uso accettabile, e la pagina sulla metodologia spiega come funziona il servizio. VookMail fa parte della rete di strumenti gratuiti PAYATE.
Prima del rilascio
- SPF, DKIM e DMARC verificati per il dominio di invio di produzione effettivo, con il dominio
Fromallineato. - Mailer di produzione con le credenziali di produzione, con la modalità sandbox disattivata, confermato da un messaggio vero.
- Verifica della registrazione ricevuta su un nuovo indirizzo esterno, link usato una volta, scadenza testata.
- Reset della password testato end-to-end, comprese risposte identiche per indirizzi sconosciuti e il messaggio di conferma.
- Token di reset e magic link riscattati con l'invio di un modulo, così il GET di uno scanner non li consuma.
- Il cambio di email invia sia al nuovo sia al vecchio indirizzo.
- Tutti i link puntano all'host di produzione via HTTPS, compresi quelli riscritti dal tracciamento dei clic.
- Posta transazionale separata dalla posta di massa, almeno nella sua coda.
- HTML e testo semplice entrambi presenti e leggibili, con modalità scura e immagini bloccate controllate.
- Un controllo di recapito sugli account di prova se il dominio o il modello sono cambiati in modo significativo.
- Annullamento dell'iscrizione funzionante sulla posta non essenziale e modelli tradotti rivisti.
- Prove allegate al ticket di rilascio, e numeri di rimbalzi e reclami su una dashboard che qualcuno guarderà dopo il lancio.
Domande che gli sviluppatori si fanno su questo
Una vera casella ha accettato la mia posta. Sono al sicuro su Gmail?
No. La consegna a un dominio mostra che il tuo messaggio è partito, ha trovato un percorso ed è stato accettato lì. Gmail applica le proprie regole di autenticazione e filtraggio, e lo fa anche ogni altro grande provider. Per quella domanda usa gli account di prova e gli strumenti Postmaster di Google.
Posso riusare lo stesso indirizzo di test?
Puoi farlo nel corso di una sessione, ma un indirizzo nuovo ti dà un test più pulito. I vecchi indirizzi accumulano voci di soppressione e vecchi messaggi, e su un servizio temporaneo la casella viene comunque svuotata dopo circa un giorno.
La posta arriva al mio catcher ma non all'esterno. Da dove comincio?
Un catcher mostra che la tua app ha prodotto un messaggio e nient'altro, quindi parti dal registro attività del provider. Il più delle volte la risposta è un'impostazione sandbox, una voce di soppressione, credenziali sbagliate o un rifiuto SMTP che cita l'autenticazione.
Quanto dovrebbe restare valido un link di reset?
Abbastanza poco da limitare i danni e abbastanza a lungo da far arrivare la posta lenta. Molti team si fermano tra i 15 minuti e un'ora, ma dipende dal tuo rischio e da quanto velocemente viene consegnata la tua posta, e quella dei tuoi utenti potrebbe essere ritardata oltre il tuo controllo. Qualunque cosa tu scelga, testa lo stato scaduto e di' alle persone cosa fare dopo.
