Domanda

Sto per aggiungere Integrazione e-mail IMAP a una delle nostre applicazioni Web (ASP.NET / SQL Server). Sto già utilizzando una biblioteca commerciale che espone le funzionalità IMAP più importanti: ottieni l'elenco delle cartelle, ottieni le intestazioni dei messaggi , ricevi il messaggio mime ecc.)

Ricezione di dati e-mail " live " dal server IMAP funziona molto bene. Ma ecco che arriva il difficile compito: devo mantenere le e-mail / cartelle la memorizzazione nella cache del database SQL sincronizzate con il server IMAP (devo mostrare i dati applicando criteri diversi).

Il nostro schema di database contiene essenzialmente un " Cartelle " e un " email " tavolo. Le " email " la tabella contiene principalmente informazioni di intestazione come " FromAddress " ;, " FromName " ;, " IsRead " ;, " IsAnswered " ;, " IsForwarded " ;, " HasAttachments " ecc. ( senza il contenuto e gli allegati dell'email).

Devo considerare due scenari principali:

  1. Ricevi tutti i messaggi la prima volta (o dopo che un utente ha riorganizzato le cartelle)
  2. Ricezione di messaggi nuovi / recenti

Quale sarebbe una buona strategia di sincronizzazione per mantenere aggiornati il ??server di posta e il server di database, considerando che le prestazioni sono un criterio di progettazione importante (non posso semplicemente interrogare / confrontare migliaia di messaggi ogni volta che mi connetto, in per scoprire se l'utente ha spostato o eliminato alcune vecchie e-mail).

Grazie!

È stato utile?

Soluzione

Dall'elenco delle funzionalità della tua libreria:

  

Migliore supporto UniqueId: abbiamo aggiunto   ancora più opzioni per la richiesta a   ID univoco del messaggio. Tu puoi ora   restituisce UniqueId in un messaggio   DataTable per i viaggi di ritorno all'IMAP   server.

E

  
      
  • Recupera solo nuovi messaggi
  •   
  • Cerca messaggi contrassegnati
  •   
  • Seleziona / Deseleziona i messaggi come letti
  •   

Mi sembra che la tua libreria abbia tutto il supporto necessario per mantenere sincronizzato il tuo server SQL. È possibile contrassegnare a livello di codice i messaggi come letti e la libreria supporta il recupero di soli nuovi messaggi. Questo si prende cura del tuo secondo oggetto.

La tua strategia dipenderà in parte da come funziona la tua soluzione. Se leggo correttamente la tua domanda, i tuoi utenti gestiscono la loro e-mail sul server IMAP e il tuo SQL Server è "quotato" " al server IMAP, dal punto di vista della sincronizzazione.

Se questo è corretto, la sincronizzazione è effettivamente un'attività in background. Il mio approccio sarebbe quello di sincronizzare utilizzando un modello di eventi su base utente per utente. Se possibile, " notifica " il programma di sincronizzazione in presenza di attività (e-mail nuove / cancellate) per un utente. Aggiungi un processo di sincronizzazione " " a un processo in background che raggruppa i lavori di sincronizzazione insieme. Un modello di notifica garantirà che il programma di sincronizzazione funzioni solo sugli utenti che necessitano di una sincronizzazione.

Piccoli lavori di sincronizzazione e-mail nuovi / eliminati vanno a un "processore" e lavori più grandi come la risincronizzazione totale e la riorganizzazione delle cartelle passano a un altro. Potrebbe essere necessario suddividere i lavori di risincronizzazione davvero grandi per mantenere un rendimento complessivo elevato. Il "piccolo lavoro" e "grande lavoro" i processori potrebbero essere due servizi diversi, o forse due thread diversi a seconda delle prestazioni e considerazioni di progettazione.

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