Чтение полной электронной почты от GMail с использованием JavaMail - PullRequest
4 голосов
/ 08 мая 2011

Я использую javamail, и у меня возникают проблемы с получением HTML из моих писем в gmail. У меня есть следующее:

Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imaps");
store.connect("imap.gmail.com", "myemail@gmail.com", "password");
System.out.println(store);

Folder inbox = store.getFolder("Inbox");
inbox.open(Folder.READ_ONLY);
Message messages[] = inbox.getMessages();
for(Message message:messages) {
System.out.println(message); // com.sun.mail.imap.IMAPInputStream@cec0c5

Все вышеперечисленное работает нормально, но я не могу распечатать или получить фактическое HTML или текстовое электронное письмо. Я просто получаю какой-то InputStream, как мне с этим легко справиться, чтобы получить необработанный HTML-код письма?

Я также попытался пройтись по сообщению, но это не сильно меня задело:

Message message[] = inbox.getMessages();

    for (int i=0, n=message.length; i<n; i++) {
       System.out.println(i + ": " + message[i].getFrom()[0] 
         + "\t" + message[i].getSubject());
       String content = message[i].getContent().toString();
       if (content.length() > 200) 
    content = content.substring(0, 600);
       System.out.print(content);

}

Спасибо всем за помощь.

Ответы [ 5 ]

6 голосов
/ 08 мая 2011

Проблема в том, что данные, которые вы получаете, обычно являются необработанными данными для потока mime / multipart.Вам нужно сделать что-то вроде этого:

for(Message message:messages) {
  if(javax.mail.Multipart.class.isInstance(message)){
    Multipart parts = (Multipart)msg.getContent(), innerPart;
    int i;
    for(i=0;i<parts.getCount();i++){
      javax.mail.BodyPart p = parts.getBodyPart(i);
      if("text/html".equals(p.getContentType())){
        // now you can read out the contents from p.getContent()
        // (which is typically an InputStream, but depending on your javamail
        // libraries may be something else
      }
    }
  }
}

Удачи.

4 голосов
/ 08 мая 2011

Объект InputStream содержит тело письма.Вам необходимо прочитать весь поток, чтобы прочитать все тело сообщения.Например, этот пост SO описывает, как записать весь InputStream в OutputStream, например System.out, используя библиотеку Apache.Это было бы неплохо для начала, так как вы можете вывести все тело сообщения на консоль.В противном случае вам нужно будет использовать некоторые буферы и т. Д., Чтобы извлечь данные из потока и поместить их во все, что вы хотите вставить. Существует также этот пост SO , в котором подробно,та же библиотека, как конвертировать InputStream в String.

3 голосов
/ 08 мая 2011

Вы можете использовать IOUtils от Apache Commons или, возможно, даже попробовать что-то вроде:

BufferedReader br = new BufferedReader(new InputStreamReader(daInputStream));
String oneLine = "";
while ( (oneLine = br.readLine()) !=  null )
    System.out.println(oneLine);
0 голосов
/ 04 января 2014

Вы можете попробовать с классом MimeMessage:

Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imaps");
store.connect("imap.gmail.com", "myemail@gmail.com", "password");

Folder inbox = store.getFolder("Inbox");
inbox.open(Folder.READ_ONLY);
Message messages[] = inbox.getMessages();
for(Message message:messages) {
    MimeMessage im = new MimeMessage(session, message.getContent());
    im.getFrom();
    im.getMessageID();
    ...
}
0 голосов
/ 05 декабря 2013

если вы используете java mail, вы можете использовать объекты «multipart» и «bodypart», чтобы пройти по сообщению электронной почты, чтобы извлечь контент «text / plain» и «text / html», который вам нужен.

...