我正在尝试创建一个文件夹(如果它不存在),然后将邮件从另一个文件夹复制到目标文件夹。我发现了一些我无法理解的奇怪行为。鉴于以下摘录:
// messages is an array of Message instances.
// Source is the source folder
// destination is a string of the destination folder.
Folder dest = null;
try {
dest = store.getFolder(destination);
if (!dest.exists()) {
dest.create(Folder.HOLDS_MESSAGES | Folder.HOLDS_FOLDERS);
// Since folder's are not meant to cache I thought I'd get it again
// though this does not work either.
//dest.close(false);
//dest = store.getFolder(destination);
}
dest.open(Folder.READ_WRITE);
// Fails here
source.copyMessages(messages, dest);
source.setFlags(messages, new Flags(Flags.Flag.DELETED), true);
} catch (MessagingException ex) {
throw new MailProcessorException(ex.getMessage(), ex);
} finally {
if (dest != null) {
try {
dest.close(false);
} catch (MessagingException ex) {
System.err.println("Couldn't close destination folder.");
}
}
}
检查以下行为:
source.copyMessages
会抛出异常。我正在使用JavaMail 1.4.6,也尝试使用1.6.5。
答案 0 :(得分:1)
真的奇怪。查看您的代码并阅读文档,应该不会发生这种情况......
邮件服务器有问题吗?有些数据库使用一致性模型(例如,请参阅http://en.wikipedia.org/wiki/Eventual_consistency),这些模型并不总是以您天真的方式行事。您是否有可能在不同的邮件服务器上尝试代码?或者,尝试在Thread.sleep(...)
电话前放置一段很长的时间(30秒?)copyMessages(...)
,看看是否能解决问题。
如果是这样,发生的事情是您的服务器在一个请求中创建文件夹,但是此创建需要一段时间才能到达处理邮件复制的服务器代码部分。然后,不幸的是,我不确定如果复制失败或人工延迟(这很糟糕),除了重试之外你还能做多少。
旁白:文档似乎说,如果您愿意,可以跳过dest.open(Folder.READ_WRITE);
。