【发布时间】:2015-07-12 17:10:23
【问题描述】:
我需要按日期在我的帐户中找到一封特定的电子邮件,以便我可以获取其内容,但是我使用的搜索词没有完成它的工作,match 方法一直返回 false,我的 AsyncTask 只是卡在了那个 try 块出于某种原因,即使 folder.search 也应该在数千封电子邮件中快速运行。
代码:
@Override
protected Void doInBackground(Void... params) {
try {
Properties properties = new Properties();
properties.put("mail.store.protocol", "imaps");
Session emailSession = Session.getDefaultInstance(properties);
Store store = emailSession.getStore("imaps");
store.connect("imap.gmail.com", username, password);
// create the folder object and open it
Folder emailFolder = store.getFolder("INBOX");
emailFolder.open(Folder.READ_WRITE);
SearchTerm term = new SearchTerm(){
public boolean match(Message message) {
try {
if(message.getSentDate().toString().equals(emailSentDate)){
return true;
}
} catch (MessagingException ex) {
ex.printStackTrace();
}
return false;
}
};
Message[] messages = emailFolder.search(term);
Object msgContent = messages[0].getContent();
if (msgContent instanceof Multipart) {
Multipart multipart = (Multipart) msgContent;
Log.e("BodyPart", "MultiPartCount: " + multipart.getCount());
for (int k = 0; k < multipart.getCount(); k++) {
BodyPart bodyPart = multipart.getBodyPart(k);
String disposition = bodyPart.getDisposition();
if (disposition != null && (disposition.equalsIgnoreCase("ATTACHMENT"))) {
DataHandler handler = bodyPart.getDataHandler();
content = handler.getName();
} else {
content = bodyPart.getContent().toString();
}
}
} else
content = messages[0].getContent().toString();
emailFolder.close(false);
store.close();
}
catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
其中 emailSentDate 是我通过调用 getSentDate().toString() 方法从上一个活动中收到的字符串。我也试过SendDateTerm,但我不能真正实现它,因为:
不知道那个int比较参数是什么
我不能将 Date 变量放在另一个活动的包中,也不能将字符串转换为 Date,所以我不知道如何将正确的 Date 对象传递给它构造函数。
我能做什么?
编辑:我只想通过发送日期搜索,因为我不知道 UID,如果您只需要查找特定的电子邮件,请查看 this。
【问题讨论】:
标签: android jakarta-mail