Pergunta

Estou prestes a adicionar integração de e-mail IMAP para uma das nossas aplicações web (ASP.NET / SQL Server). Eu já estou usando um biblioteca comercial que expõe a funcionalidade IMAP mais importante: obter pasta lista, obter cabeçalhos de mensagens , obter mime mensagem etc.)

Obter dados de e-mail "ao vivo" a partir do servidor IMAP funciona muito bem. Mas aqui vem a tarefa difícil. Eu tenho que manter os e-mail / pastas cache do banco de dados SQL sincronizadas com o servidor IMAP (eu tenho que mostrar dados aplicáveis ??critérios diferentes)

O nosso esquema de banco de dados contém essencialmente um "Pastas" e uma tabela "e-mails". A tabela "e-mails" contém principalmente informações de cabeçalho como "FromAddress", "FromName", "IsRead", "IsAnswered", "IsForwarded", "hasattachments" etc. ( sem o conteúdo de e-mail ou anexos) .

eu tenho que considerar dois cenários principais:

  1. Obter todas as mensagens pela primeira vez (ou depois que um usuário re-organizou as pastas)
  2. Obter novas mensagens / recentes

O que seria uma estratégia de sincronização bom para manter o servidor de correio e servidor de banco de dados up-to-date, considerando que o desempenho é um importante critério de projeto (eu não posso simplesmente consulta / milhares comparar de mensagens cada vez que se conectar, em a fim de descobrir se o usuário movido ou excluído alguns e-mails antigos).

Obrigado!

Foi útil?

Solução

A partir lista de recursos da sua biblioteca:

Melhor UniqueId Apoio: Nós adicionamos ainda mais opções para solicitar um id único da mensagem. Agora você pode devolver o UniqueId em uma mensagem de DataTable para o retorno viagens para o IMAP servidor.

E:

  • recuperar apenas novas mensagens
  • Procurar mensagens marcadas
  • Mensagens Marcar / Desmarcar como Read

Parece-me que a sua biblioteca tem todo o apoio de que necessita para manter o seu servidor SQL sincronizado. Você pode programaticamente marcar mensagens como lidas, e os suportes da biblioteca recuperação de apenas novas mensagens. Que cuida de seu segundo item.

A sua estratégia dependerá, em parte, como sua solução funciona. Se eu ler o seu correclty questão, os seus usuários a gerenciar seus e-mails no servidor IMAP, e seu SQL Server é "subscrito" para o servidor IMAP, a partir de uma perspectiva de sincronização.

Se isto estiver correto, então a sincronização é efetivamente uma tarefa em segundo plano. Minha abordagem seria para sincronizar usando um modelo de eventos em uma base de usuário-a-usuário. Se possível, "notificar" o programa de sincronização quando há atividade (nova / apagou e-mails) para um usuário. Adicionar um "trabalho" de sincronização para um processo de fundo que os lotes sincronizar trabalhos juntos. Um modelo de notificação vai garantir que o programa de sincronização só funciona em usuários que precisam de uma sincronia.

Pequenos / empregos e-mail de sincronização novas excluídos ir a um "processador" e trabalhos maiores, como Resynch total e de pasta reorganização ir para outro. Realmente grandes trabalhos Resynch pode ter que ser dividido, a fim de mantê-geral rendimento elevado. O "pequeno trabalho" e processadores "grande trabalho" poderia ser dois serviços diferentes, ou possivelmente dois segmentos diferentes, dependendo considerações de desempenho e design.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top