spl*_*tne 5 email synchronization imap
我准备将IMAP 电子邮件集成添加到我们的一个 Web 应用程序 (ASP.NET / SQL Server) 中。我已经在使用一个商业库,它公开了最重要的 IMAP 功能:获取文件夹列表、获取消息标题、获取 mime 消息等。)
从 IMAP 服务器“实时”获取电子邮件数据非常有效。但这是一项艰巨的任务:我必须将缓存 SQL 数据库的电子邮件/文件夹与 IMAP 服务器保持同步(我必须显示应用不同标准的数据)。
我们的数据库模式本质上包含一个“文件夹”和一个“电子邮件”表。“Emails”表主要包含标题信息,如“FromAddress”、“FromName”、“IsRead”、“IsAnswered”、“IsForwarded”、“HasAttachments”等(不含电子邮件内容或附件)。
我必须考虑两个主要场景:
考虑到性能是一个主要的设计标准(我不能在每次连接时查询/比较数千条消息,以便找到如果用户移动或删除了一些旧电子邮件,则退出)。
谢谢!
从您的图书馆的功能列表中:
更好的 UniqueId 支持:我们添加了更多选项来请求消息的唯一 ID。现在,您可以在邮件的数据表中返回 UniqueId,以返回 IMAP 服务器。
和:
- 仅检索新消息
- 搜索标记的消息
- 将消息标记/取消标记为已读
在我看来,您的库似乎拥有保持 SQL 服务器同步所需的所有支持。您可以通过编程方式将消息标记为已读,并且该库仅支持检索新消息。这就解决了你的第二个项目。
您的策略将部分取决于您的解决方案的工作原理。如果我正确地阅读了您的问题,那么从同步的角度来看,您的用户在 IMAP 服务器上管理他们的电子邮件,并且您的 SQL Server 已“订阅”到 IMAP 服务器。
如果这是正确的,那么同步实际上是一项后台任务。我的方法是在逐个用户的基础上使用事件模型进行同步。如果可能,当用户有活动(新的/删除的电子邮件)时“通知”同步程序。将同步“作业”添加到将同步作业批处理在一起的后台进程。通知模型将确保同步程序仅适用于需要同步的用户。
小型新/删除的电子邮件同步作业将转到一个“处理器”,而较大的作业(例如完全重新同步和文件夹重组)将转到另一个“处理器”。为了保持整体吞吐量较高,可能必须拆分真正大型的重新同步作业。“小作业”和“大作业”处理器可以是两个不同的服务,或者可能是两个不同的线程,具体取决于性能和设计考虑。