5

我即将将IMAP 电子邮件集成添加到我们的一个 Web 应用程序(ASP.NET / SQL Server)中。我已经在使用一个商业库,它公开了最重要的 IMAP 功能:获取文件夹列表、获取消息标题、获取 mime 消息等)

从 IMAP 服务器“实时”获取电子邮件数据效果很好。但是困难的任务来了:我必须保持缓存 SQL 数据库的电子邮件/文件夹与 IMAP 服务器同步(我必须显示应用不同标准的数据)。

我们的数据库模式本质上包含一个“文件夹”和一个“电子邮件”表。“电子邮件”表主要包含标题信息,如“FromAddress”、“FromName”、“IsRead”、“IsAnswered”、“IsForwarded”、“HasAttachments”等(包括电子邮件内容或附件)。

我必须考虑两种主要情况:

  1. 第一次(或在用户重新组织文件夹后)获取所有消息
  2. 获取新的/最近的消息

考虑到性能是一个主要的设计标准(我不能每次连接时都查询/比较数千条消息,以便找到如果用户移动或删除了一些旧电子邮件,则退出)。

谢谢!

4

1 回答 1

2

从您图书馆的功能列表中:

更好的 UniqueId 支持:我们为请求消息的唯一 ID 添加了更多选项。您现在可以在消息的 DataTable 中返回 UniqueId,以便返回到 IMAP 服务器。

和:

  • 仅检索新消息
  • 搜索标记的消息
  • 将消息标记/取消标记为已读

在我看来,您的库似乎拥有保持 SQL 服务器同步所需的所有支持。您可以以编程方式将消息标记为已读,并且该库支持仅检索新消息。这会照顾你的第二个项目。

您的策略将部分取决于您的解决方案如何运作。如果我正确地阅读了您的问题,则从同步的角度来看,您的用户在 IMAP 服务器上管理他们的电子邮件,并且您的 SQL Server 已“订阅”到 IMAP 服务器。

如果这是正确的,那么同步实际上是一项后台任务。我的方法是在逐个用户的基础上使用事件模型进行同步。如果可能,当用户有活动(新的/删除的电子邮件)时“通知”同步程序。将同步“作业”添加到将同步作业批处理在一起的后台进程。通知模型将确保同步程序仅适用于需要同步的用户。

小型新/已删除电子邮件同步作业转到一个“处理器”,而较大的作业(例如完全重新同步和文件夹重组)转到另一个。为了保持较高的整体吞吐量,可能必须拆分非常大的重新同步作业。“小型作业”和“大型作业”处理器可能是两个不同的服务,或者可能是两个不同的线程,具体取决于性能和设计考虑。

于 2009-03-02T17:31:20.493 回答