Domanda

Ho un sito Web con un modulo di contatto. L'utente invia nome, email e messaggio e il sito mi invia i dettagli tramite e-mail.

Molto raramente il mio server ha un problema con il suo sistema di posta elettronica e quindi l'utente riceve un errore e questi dettagli di contatto vengono persi. (Non dire: ottieni un server migliore, ogni server può avere la posta elettronica andare giù di tanto in tanto e riceviamo un sacco di invii).

Vorrei implementare un sistema in grado di memorizzare i dettagli dell'utente se la funzione di invio della posta ritorna con un codice di errore. Quindi su ogni ulteriore invio, controlla eventuali invii memorizzati e prova a inviarmeli.

Ma come archiviare i dati?

Sto usando Python, quindi ho pensato di usare shelve (semi singolo file -Banca dati). O forse qualcuno potrebbe suggerire un formato di dati migliore? (Penso che una soluzione di database completa sarebbe eccessiva.)

Il problema che vedo con un approccio a file singolo è condizioni di gara : due o più e-mail non riuscite allo stesso tempo causerebbero due modifiche al file di dati con conseguente danneggiamento dei dati.

Quindi cosa fare? Soluzione multi-file, blocco dei file o qualcos'altro?

È stato utile?

Soluzione

Quando implementiamo la funzionalità di invio e-mail nel nostro ambiente, lo facciamo in modo disaccoppiato. Ad esempio, un utente invierebbe i propri dati che verrebbero archiviati in un database. Abbiamo quindi un servizio separato che viene eseguito, esegue una query sul database e invia e-mail. In questo modo, in caso di problemi con il server di posta elettronica, il servizio riproverà più tardi, la sicurezza dei dati e degli utenti non andrà mai persa.

Altri suggerimenti

prova sqlite . Nella libreria standard è presente binding python nella libreria standard e dovrebbe funzionare per un utile livello di carico (o almeno così mi viene detto)

Potresti, come suggerito, usare sqlite per questo. La domanda principale è: in che modo mans è un sacco di invii? Se è al di sotto di pochi secondi, questo funzionerebbe. In caso contrario, il file del database verrà bloccato continuamente e si avrà un altro problema.

Ma potresti anche mantenerlo chiaro, stupido e semplice: scrivere file su disco. Per ogni invio un file viene scritto in una directory temporanea (se il server di posta è inattivo). Quindi aggiungi alcune righe allo script di avvio del mailserver che legge la directory e invia i messaggi. Nessun database, nessun problema di blocco e se usi una directory per la quale è impostata una quota (o un ramdisk con dimensioni fisse) non dovresti incontrare alcun problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top