使用javamail searchterm通过发送日期获取一封电子邮件
Using javamail searchterm to get one email via send date
我需要按日期在我的帐户中找到一封特定的电子邮件,这样我才能获得它的内容,但是我使用的搜索词没有完成它的工作,匹配方法一直返回 false 而我的 AsyncTask 只是停留在那个出于某种原因尝试阻止,即使 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() 方法从上一个 activity 接收到的字符串。我也试过SendDateTerm,但我不能真正实现它,因为:
我不知道那个int比较参数是什么
我无法将 Date 变量放入另一个 activity 的包中,也无法将字符串转换为 Date,所以我不知道该怎么做将正确的 Date 对象传递给它的构造函数。
我能做什么?
编辑: 我只想通过发送日期搜索,因为我不知道 UID,如果您只需要查找特定的电子邮件,请检查 this。
比较参数在javadocs中有描述,它表示你正在进行的比较类型,例如==、!=、>等
有多种方法可以为特定日期创建日期对象。例如,您可以使用 SimpleDateFormat 对象来解析字符串,并使用 return 日期。
编写自己的 SearchTerm 会导致在客户端进行比较;内置 SearchTerms 使用 IMAP SEARCH 功能在服务器上进行搜索。
确保您使用的是 current version of JavaMail。最近修复了日期搜索中的错误。
另请注意,IMAP 日期搜索只比较日期,而不比较时间。
我需要按日期在我的帐户中找到一封特定的电子邮件,这样我才能获得它的内容,但是我使用的搜索词没有完成它的工作,匹配方法一直返回 false 而我的 AsyncTask 只是停留在那个出于某种原因尝试阻止,即使 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() 方法从上一个 activity 接收到的字符串。我也试过SendDateTerm,但我不能真正实现它,因为:
我不知道那个int比较参数是什么
我无法将 Date 变量放入另一个 activity 的包中,也无法将字符串转换为 Date,所以我不知道该怎么做将正确的 Date 对象传递给它的构造函数。
我能做什么?
编辑: 我只想通过发送日期搜索,因为我不知道 UID,如果您只需要查找特定的电子邮件,请检查 this。
比较参数在javadocs中有描述,它表示你正在进行的比较类型,例如==、!=、>等
有多种方法可以为特定日期创建日期对象。例如,您可以使用 SimpleDateFormat 对象来解析字符串,并使用 return 日期。
编写自己的 SearchTerm 会导致在客户端进行比较;内置 SearchTerms 使用 IMAP SEARCH 功能在服务器上进行搜索。
确保您使用的是 current version of JavaMail。最近修复了日期搜索中的错误。
另请注意,IMAP 日期搜索只比较日期,而不比较时间。