2011-01-27 3 views
2

Я пытаюсь программно получить сообщения журнала вызовов, которые находятся в резервном копировании с моего телефона Android с помощью небольшого приложения, называемого SMSBackup (настоятельно рекомендуется).Можно ли использовать условия запроса IMAP в Javamail с GMail?

Что я хочу сделать, так это получить журналы вызовов за определенный день. Я попробовал следующую программу, с помощью 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

Смежные вопросы