我用 Java 编写了一个很好的程序,它连接到一个 gmail 帐户并下载发送给它的附件。下载附件后,它会被标记为已读,并且不会再次下载。该程序必须在多个实例中运行,每个程序都下载唯一的附件,这样一个附件就不会被下载两次。问题是,如果附件大小合适,一个程序仍在下载它,而另一个实例连接并在附件被标记为已读之前也开始下载该附件。
我尝试检查和设置各种标志并检查文件夹是否打开,似乎没有任何效果。有什么解决办法吗?
更新:感谢您的快速回答,遗憾的是,由于其他原因,IMAP 不是一个选项。
我用 Java 编写了一个很好的程序,它连接到一个 gmail 帐户并下载发送给它的附件。下载附件后,它会被标记为已读,并且不会再次下载。该程序必须在多个实例中运行,每个程序都下载唯一的附件,这样一个附件就不会被下载两次。问题是,如果附件大小合适,一个程序仍在下载它,而另一个实例连接并在附件被标记为已读之前也开始下载该附件。
我尝试检查和设置各种标志并检查文件夹是否打开,似乎没有任何效果。有什么解决办法吗?
更新:感谢您的快速回答,遗憾的是,由于其他原因,IMAP 不是一个选项。
考虑改用 IMAP - 它是为客户端-服务器交互而设计的。
我不认为 POP3 是为多个同时访问而设计的。
问问自己:我真的需要多个进程访问同一个邮箱吗?
如果这样做,您将必须找到一种方法让这些进程相互通信。使用通用数据库或服务器进程来协调操作。
IMAP确实有更多选项,但我不确定您是否可以“锁定”一封邮件以将其标记为正在处理。
正如其他人所提到的,POP3 并不真正适用于这种情况。
如果您绝对必须使用 POP3,我建议将所有电子邮件下载到中间服务器,该服务器对邮件进行分类并使它们可用于其他每个客户端。
听起来您只是在尝试分发电子邮件的处理。如果是这种情况,您可以让每个客户端连接到您的中间服务器以检索下一条可用消息。
我不确定您的限制是什么,但您甚至可能想考虑通过电子邮件以外的其他方式接收附件。如果人们正在上传文件,您可以设置一个 Web 表单,自动将每个文件发送到应用程序的下一个可用实例进行处理。
如果您需要保持 POP3 连接,您可以保留以前下载的消息 ID 的本地数据库。然后新实例可以在再次下载之前对其进行检查。不过,最好的解决方案是使用 IMAP,因为 IMAP 能够在下载之前设置已读/未读标志。
您可以在开始下载之前将邮件标记为已读,然后开始下载。