【发布时间】:2010-10-26 14:00:37
【问题描述】:
我正在编写/学习使用 javax.mail 包从 IMAP 文件夹中使用 java 获取电子邮件。我成功地检索了文件夹中的最后 n 条消息,但是我希望构建一个示例来检索自指定日期以来的消息。有什么例子吗?
【问题讨论】:
我正在编写/学习使用 javax.mail 包从 IMAP 文件夹中使用 java 获取电子邮件。我成功地检索了文件夹中的最后 n 条消息,但是我希望构建一个示例来检索自指定日期以来的消息。有什么例子吗?
【问题讨论】:
这是我想出的。这对我有用,但可能不是最好的方法。有什么改进的建议吗?
Date from; //assume initialized
Store store; //assume initialized
Folder inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_ONLY);
int end = inbox.getMessageCount();
long lFrom = from.getTime();
Date rDate;
long lrDate;
int start = end;
do {
start = start - 10;
Message testMsg = inbox.getMessage(start);
rDate = testMsg.getReceivedDate();
lrDate = rDate.getTime();
} while (lrDate > lFrom);
Message msg[] = inbox.getMessages(start, end);
for (int i=0, n=msg.length; i<n; i++) {
lrDate = msg[i].getReceivedDate().getTime();
if (lrDate > lFrom) {
System.out.println(i + ": "
+ msg[i].getFrom()[0]
+ "\t" + msg[i].getSubject());
}
}
【讨论】:
您应该尝试利用服务器端搜索,而不是获取所有消息。 这通过使用 javax.mail.Folder 的 search 方法来工作。您可能必须根据 Message.getReceivedDate() 上的条件编写自己的 SearchTerm。
如果服务器端搜索不起作用,您可以尝试使用提取配置文件,即使用 inbox.fetch(Message[] msgs, FetchProfile fp) 代替 inbox.getMessages()。 fetch 的 javadoc 说:客户端使用此方法来指示指定的项目需要为给定的消息范围整体。期望实现以有效的方式检索给定消息范围的这些项目。请注意,此方法只是实现预取所需项目的提示。
【讨论】:
您还可以使用 java 邮件包中的 SearchTerm 类。
SearchTerm olderThan = new ReceivedDateTerm(ComparisonTerm.LT, someFutureDate);
SearchTerm newerThan = new ReceivedDateTerm(ComparisonTerm.GT, somePastDate);
SearchTerm andTerm = new AndTerm(olderThan, newerThan);
inbox.search(andTerm);
以上的一些组合应该被证明是获取特定范围内日期的更好方法。
【讨论】:
SearchTerm st = new AndTerm(new SubjectTerm(subjectSearchPhrase), new BodyTerm(bodySearchPhrases)); st = new AndTerm(st, new ReceivedDateTerm(ComparisonTerm.GE, searchMailReceivedDateGE)); 我也尝试过使用YoungerTerm(80),但这也不起作用。有人知道这个问题吗?谢谢!
public class CheckDate {
public void myCheckDate(Date givenDate) {
SearchTerm st = new ReceivedDateTerm(ComparisonTerm.EQ,givenDate);
Message[] messages = inbox.search(st);
}
// in main method
public static void main(String[] args) throws ParseException{
SimpleDateFormat df1 = new SimpleDateFormat( "MM/dd/yy" );
String dt="06/23/10";
java.util.Date dDate = df1.parse(dt);
cd.myCheckDate(dDate);
}
}
【讨论】:
上个月的所有邮件:
Calendar cal = Calendar.getInstance();
cal.roll(Calendar.MONTH, false);
Message[] search = folder.search(new ReceivedDateTerm(ComparisonTerm.GT, cal.getTime()));
【讨论】: