我正在使用javax.mail包编写/学习使用java从IMAP文件夹中获取电子邮件。我成功地能够检索文件夹中的最后n条消息,但是我希望构建一个示例来检索自指定日期以来的消息。任何例子?
答案 0 :(得分:22)
您也可以在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);
上述某些组合应该证明是将日期保持在一定范围内的更好方法。
答案 1 :(得分:5)
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);
}
}
答案 2 :(得分:2)
您应该尝试利用服务器端搜索,而不是获取所有邮件。 这可以通过使用 javax.mail.Folder 的搜索方法来实现。您可能必须根据Message.getReceivedDate()上的条件编写自己的SearchTerm。
如果服务器端搜索不起作用,您可以尝试使用获取配置文件,即使用inbox.fetch(Message [] msgs,FetchProfile fp)而不是inbox.getMessages()。 fetch的javadoc说:客户端使用此方法指示对于给定的消息范围,需要集中指定项目。期望实现以有效的方式检索给定消息范围的这些项。请注意,此方法只是提示预取所需项目的实现。
答案 3 :(得分:0)
这是我想出的。这对我有用,但可能不是最好的方法。有什么建议可以改善这个吗?
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());
}
}
答案 4 :(得分:0)
上个月的所有邮件:
Calendar cal = Calendar.getInstance();
cal.roll(Calendar.MONTH, false);
Message[] search = folder.search(new ReceivedDateTerm(ComparisonTerm.GT, cal.getTime()));