2011-01-27 41 views
2

我試圖通過一個名爲SMSBackup的小應用程序(強烈推薦)以編程方式檢索從我的android手機備份的呼叫日誌消息。在Javamail中使用IMail可以使用IMAP查詢條款嗎?

我想要做的是能夠檢索特定日期的通話記錄。我曾嘗試下面的程序,使用JavaMail:

public List<CallLogEntry> getCallLog(String username, String password, Date date, TimeZone tz) { 
    Store store = null; 

    try { 
     store = MailUtils.getGmailImapStore(username, password); 
     Folder folder = store.getDefaultFolder(); 
     if (folder == null) 
      throw new Exception("No default folder"); 
     Folder inboxfolder = folder.getFolder("Call log"); 
     if (inboxfolder == null) 
      throw new Exception("No INBOX"); 
     inboxfolder.open(Folder.READ_ONLY); 

     Date fromMidnight = new Date(TimeUtils.fromMidnight(date.getTime(), tz)); 
     Date toMidnight = new Date(TimeUtils.toMidnight(date.getTime(), 0, tz)); 

     SentDateTerm fromTerm = new SentDateTerm(SentDateTerm.GT, fromMidnight); 
     SentDateTerm toTerm = new SentDateTerm(SentDateTerm.LT, toMidnight); 

     AndTerm searchTerms = new AndTerm(fromTerm, toTerm); 
     Message[] msgs = inboxfolder.search(searchTerms); 

     FetchProfile fp = new FetchProfile(); 
     fp.add("Subject"); 
     fp.add("Content"); 
     fp.add("From"); 
     fp.add("SentDate"); 
     inboxfolder.fetch(msgs, fp); 

     List<CallLogEntry> callLog = new ArrayList<CallLogEntry>(); 
     for (Message message : msgs) { 
      CallLogEntry entry = new CallLogEntry(); 
      entry.subject = message.getSubject(); 
      entry.body = (String) message.getContent(); 
      callLog.add(entry); 
     } 

     inboxfolder.close(false); 
     store.close(); 

     return callLog; 
    } catch (NoSuchProviderException ex) { 
     ex.printStackTrace(); 
    } catch (MessagingException ex) { 
     ex.printStackTrace(); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } finally { 
     try { 
      if (store != null) 
       store.close(); 
     } catch (MessagingException ex) { 
      ex.printStackTrace(); 
     } 
    } 
    return null; 
} 

我的兩個實用的方法(fromMidnight/toMidnight):

public static final long fromMidnight(long time, TimeZone tz) { 
    Calendar c = Calendar.getInstance(tz); 
    c.setTimeInMillis(time); 
    c.set(Calendar.HOUR_OF_DAY, 0); 
    c.set(Calendar.MINUTE, 0); 
    c.set(Calendar.SECOND, 0); 
    c.set(Calendar.MILLISECOND, 1); 
    return c.getTimeInMillis(); 
} 

public static final long toMidnight(long time, int nDays, TimeZone tz) { 
    Calendar c = Calendar.getInstance(tz); 
    c.setTimeInMillis(time + nDays*MILLIS_IN_DAY); 
    c.set(Calendar.HOUR_OF_DAY, 23); 
    c.set(Calendar.MINUTE, 59); 
    c.set(Calendar.SECOND, 59); 
    c.set(Calendar.MILLISECOND, 999); 
    return c.getTimeInMillis(); 
} 

然而,由於某些原因:

  1. 而最終執行時,它大約需要3分鐘才能完成
  2. 我收回了整個通話記錄,即我郵箱中的「通話記錄」文件夾的全部內容

我錯過了什麼?

回答

5

你缺少的主要是the underlying IMAP SEARCH syntax supports only dates, not date-times。所以,你的查詢將導致JavaMail的發出命令:

A001 SEARCH SENTBEFORE 16-JAN-2011 SENTSINCE 16-JAN-2011 ALL 

(把一個斷點在IMAPProtocol.issueSearch()看到這一點。)

版Gmail時出現焦慮不安在此查詢,這在邏輯上無法比擬的任何消息。嘗試使用SentDateTerm.EQ切換你的邏輯,一個學期(映射到SENTON),它應該工作:

SentDateTerm term = new SentDateTerm(SentDateTerm.EQ, date.getTime()); 
    Message[] msgs = inboxfolder.search(term); 
+0

,完美的工作!謝謝 – user592699 2011-01-28 15:33:12

相關問題