Папка IMAP / стратегия синхронизации сообщений? - PullRequest
4 голосов
/ 02 марта 2009

Я собираюсь добавить Интеграция электронной почты IMAP в одно из наших веб-приложений (ASP.NET / SQL Server). Я уже использую коммерческую библиотеку , которая предоставляет наиболее важные функции IMAP: получение списка папок, получение заголовков сообщений, получение сообщений MIME и т. Д.)

Получение данных электронной почты в реальном времени с сервера IMAP работает очень хорошо. Но тут возникает трудная задача: мне нужно синхронизировать электронную почту / папки кэшируемой базы данных SQL с сервером IMAP (я должен показывать данные, применяя различные критерии).

Наша схема базы данных по существу содержит таблицы «Папки» и «Электронные письма». Таблица «Электронные письма» содержит в основном информацию заголовка, такую ​​как «FromAddress», «FromName», «IsRead», «IsAnspted», «IsForwarded», «HasAttachments» и т. Д. ( без содержимого или вложений электронной почты).

Я должен рассмотреть два основных сценария:

  1. Получение всех сообщений в первый раз (или после того, как пользователь реорганизовал папки)
  2. Получение новых / последних сообщений

Какой была бы хорошая стратегия синхронизации для поддержания почтового сервера и сервера базы данных в актуальном состоянии, учитывая, что производительность является основным критерием проектирования (я не могу просто запрашивать / сравнивать тысячи сообщений при каждом подключении, в чтобы узнать, переместил ли пользователь или удалил несколько старых писем).

Спасибо!

1 Ответ

2 голосов
/ 02 марта 2009

Из списка функций вашей библиотеки:

Лучшая поддержка UniqueId: мы добавили еще больше вариантов для запроса уникальный идентификатор сообщения. Ты можешь сейчас вернуть уникальный идентификатор в сообщении DataTable для обратных поездок в IMAP сервер.

И

  • Получать только новые сообщения
  • Поиск помеченных сообщений
  • Пометить / снять пометку как прочитанное

Мне кажется, что ваша библиотека имеет всю необходимую поддержку для синхронизации вашего сервера SQL. Вы можете программно помечать сообщения как прочитанные, а библиотека поддерживает поиск только новых сообщений. Это позаботится о вашем втором предмете.

Ваша стратегия будет частично зависеть от того, как работает ваше решение. Если я прочитаю правильность вашего вопроса, ваши пользователи будут управлять своей электронной почтой на сервере IMAP, а ваш SQL-сервер будет «подписан» на сервер IMAP с точки зрения синхронизации.

Если это правильно, то синхронизация фактически является фоновой задачей. Мой подход заключается в синхронизации с использованием модели событий для каждого пользователя. Если возможно, «уведомите» программу синхронизации о наличии активности (новых / удаленных электронных писем) для пользователя. Добавьте «задание» синхронизации в фоновый процесс, который объединяет задания синхронизации. Модель уведомлений гарантирует, что программа синхронизации работает только с пользователями, которым требуется синхронизация.

Небольшие новые / удаленные задания синхронизации электронной почты переходят на один «процессор», а более крупные задания, такие как полная повторная синхронизация и реорганизация папок, переходят к другому. Для поддержания высокой пропускной способности может потребоваться разделение действительно больших заданий на повторную синхронизацию. Процессоры «небольшая работа» и «большая работа» могут представлять собой две разные службы или, возможно, два разных потока в зависимости от производительности и особенностей проектирования.

...