我正在尝试编写一个可以监听传入消息的类。 我在收件箱中添加了一个监听器。
我解析收件箱中的邮件以查找特定的电子邮件,当找到该电子邮件时,我希望我的听众停止收听收件箱。
如何做到这一点?
这是我的代码:
public Map<String, Object> read(String id, Risk risk) {
setID(id);
try {
Properties props = new Properties();
props.setProperty("mail.store.protocol", "imaps");
Session session = Session.getInstance(props, null);
Store store = session.getStore();
store.connect("imap.gmail.com", email, password);
Folder inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_ONLY);
inbox.addMessageCountListener(new MessageCountAdapter() {
public void messagesAdded(MessageCountEvent ev) {
setListenerExists(true);
boolean emailFound = false;
Message[] msgs = ev.getMessages();
System.out.println("Got " + msgs.length + " new messages");
if (msgs.length >= 1){
for (Message msg: msgs){
try {
Object o = msg.getContent();
if (o instanceof String){
hm = parser.parseMessage(adr, msg.getSubject(), msg.getContent(), getID());
System.out.println("FROM : " + adr);
System.out.println("SUBJECT : " + msg.getSubject());
System.out.println("HTML : " + msg.getContent());
}
else if (o instanceof Multipart){
Multipart mp = (Multipart) o;
BodyPart bp = mp.getBodyPart(0);
hm = parser.parseMessage(adr, msg.getSubject(), bp.getContent(), getID());
/*
System.out.println("FROM : " + adr);
System.out.println("SUBJECT : " + msg.getSubject());
System.out.println("HTML : " + bp.getContent());
*/
}
Iterator<Integer> it = hm.keySet().iterator();
while (it.hasNext()){
if (it.next() == 1){
map = extractValues(hm.get(1));
setMap(map);
//emailReceived = true;
//setEmailReceived(true);
//extractValues(hm.get(1));
}else{
/*
* TODO : remove listener
* setLisetn
*/
System.out.println("HM is Null!");
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/*
while (emailFound == false){
for (Message msg : msgs){
try {
Object o = msg.getContent();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
*/
}
});
// Check mail once in "freq" MILLIseconds
boolean supportsIdle = false;
try {
if (inbox instanceof IMAPFolder) {
IMAPFolder f = (IMAPFolder)inbox;
f.idle();
supportsIdle = true;
}
} catch (FolderClosedException fex) {
throw fex;
} catch (MessagingException mex) {
supportsIdle = false;
}
for (;;) {
if (supportsIdle && inbox instanceof IMAPFolder) {
IMAPFolder f = (IMAPFolder)inbox;
f.idle();
System.out.println("IDLE done");
} else {
Thread.sleep(20000); // sleep for freq milliseconds
// This is to force the IMAP server to send us
// EXISTS notifications.
inbox.getMessageCount();
}
}
}catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return getMap();
}
public void setID(String id){
this.riskId = id;
}
public String getID(){
return riskId;
}
public void setMap(Map<String, Object> m){
this.map = m;
}
public Map<String, Object> getMap(){
return map;
}
public void setListenerExists(boolean exists){
this.listener = exists;
}
public boolean getListenerExists(){
return listener;
}
/** extracts values from hashmap received from the parser **/
public Map<String, Object> extractValues(HashMap<String, EmailData> h){
System.out.println("I'M Called");
Risk risk = new Risk();
String id = "";
String sender = "";
String answer = "";
HashMap<String, String> data;
Iterator<String> it = h.keySet().iterator();
while (it.hasNext()){
id = it.next();
EmailData ed = h.get(id);
sender = ed.getEmail();
answer = ed.getAnswer();
}
Map<String, Object> map = createVariablesToInsert(id, sender, answer);
return map;
}
public Map<String, Object> createVariablesToInsert(String id, String sender, String answer){
Map<String, Object> map = new HashMap<String, Object>();
System.out.println("I'M Called");
System.out.println("UUID : " + id);
System.out.println("USER : " + sender);
System.out.println("ANSWE : " + answer);
map.put("uuid", id);
map.put("user", sender);
map.put("ans", answer);
System.out.println("ID : " + map.get("uuid"));
System.out.println("USER : " + map.get("user"));
System.out.println("ANS : " + map.get("ans"));
System.out.println("ID in insert");
return map;
}
}
答案 0 :(得分:0)
注意必须将两个变量声明为final。它允许访问MessageCountAdapter
实现中的那些变量final Folder inbox = store.getFolder("INBOX");
final MessageCountAdapter listener = new MessageCountAdapter() {
boolean emailFound = false;
// do something
if (emailFound) {
inbox.removeMessageCountListener(listener);
}
}
inbox.addMessageCountListener(listener);