Получать непрочитанные письма из Gmail - JavaMail API + IMAP
Теперь я создал код для извлечения непрочитанной электронной почты и чтения ее тела, а затем мы можем хранить или делать все, что захотим.
Он полностью работает, но проблема в том, что он дает мне только тело для первого письма, а для второго - тело с тегами html.
Я использую JavaMail API...
Как я могу сделать??
Заранее спасибо.
С наилучшими пожеланиями, Али
package pack1;
//import the necessary classes
import java.io.IOException;
import java.util.Properties;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.search.FlagTerm;
public class InboxReader {
public static void main(String args[]) {
Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imaps");
try {
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imaps");
store.connect("imap.gmail.com", "mail", "pass");
System.out.println(store);
Folder inbox = store.getFolder("Inbox");
inbox.open(Folder.READ_ONLY);
//Message messages[] = inbox.getMessages();
FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), false);
Message messages[] = inbox.search(ft);
int i =0;
for(Message message:messages)
{
Multipart mp = (Multipart)messages[i].getContent();
Object p = mp.getBodyPart(i).getContent();
String q = p.toString();//object has the body content
System.out.println(q);//prints the body
System.out.println( messages[i].getSubject()+ " \n"+i);i++;
}
} catch (NoSuchProviderException e) {
e.printStackTrace();
System.exit(1);
} catch (MessagingException e) {
e.printStackTrace();
System.exit(2);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Выход:
a
a
0
<div dir="ltr">b<br>
</div>
b
1
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 >= 2
at java.util.Vector.elementAt(Unknown Source)
at javax.mail.Multipart.getBodyPart(Multipart.java:156)
at javax.mail.internet.MimeMultipart.getBodyPart(MimeMultipart.java:258)
at pack1.InboxReader.main(InboxReader.java:39)
1 ответ
Вы используете тот же индекс, чтобы получить сообщение из своего списка, чтобы получить часть из этого сообщения. Итак, вы извлекаете часть 1 из сообщения 1, часть 2 из сообщения 2 и т. Д. В какой-то момент вы попадете в сообщение N, содержащее меньше N частей, и получите ArrayIndexOutOfBoundsException
,
Multipart mp = (Multipart)messages[i].getContent();
Object p = mp.getBodyPart(i).getContent();
Кроме того, вы предполагаете, что все ваши сообщения состоят из нескольких частей. Первый раз звонишь Message.getContent()
на сообщение, не состоящее из нескольких частей, вы получите ClassCastException
как это, скорее всего, будет возвращать вам String
вместо.
Multipart mp = (Multipart)messages[i].getContent();
Точно так же вы предполагаете не вложенные мультипликаторы. В первый раз вы получите сообщение с верхнего уровня multipart/mixed
содержащий multipart/alternative
как его первая часть, призыв к MimeBodyPart.getContent()
вернет другой Multipart
и поэтому p.toString()
просто вернет идентификатор объекта Java, а не содержимое сообщения, которое вы хотите.
Object p = mp.getBodyPart(i).getContent();
String q = p.toString();//object has the body content
Чтобы сделать это правильно, вам нужно пройтись по структуре сообщения и определить ту часть тела, которая вам нужна.