Получить бесплатные письма от Gmail - API JavaMail + IMAP
Теперь я создал код для извлечения непрочитанного сообщения и чтения его тела, а затем мы можем хранить или делать то, что хотим.
Он полностью работает, но проблема в том, что он дает мне только тело для первой почты, а для второго он дает телу теги html.
Я использую API JavaMail...
Как я могу сделать?
Спасибо заранее.
С уважением,
Али
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()
в не-multipart сообщение, вы получите 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
Чтобы все было правильно, вам нужно пройти структуру сообщений и определить часть тела, о которой вы заботитесь.