Как анализировать содержимое электронной почты с помощью javax.mail?

Я пытаюсь анализировать электронные письма с помощью javax.mail. Я хочу получить как текстовое содержимое, так и все вложения (предпочтительно ВСТРОЕННЫЕ изображения/вложения).

У меня есть следующий код, но он, похоже, не работает с более сложными письмами с несколькими вложенными составными частями.

Я прочитал FAQ и целый день гуглил, но не нашел решения.

Пожалуйста помоги.

public static String fetchEmailcontent(Part message, String messageid) throws IOException, MessagingException {

        StringWriter sw = new StringWriter(1024);

        if (message != null && message.getContent() != null) {
            if (message.getContent() instanceof Multipart) {
                Multipart parts = (Multipart) message.getContent();
                BodyPart p;
                boolean alternative = parts.getContentType().trim().toLowerCase().startsWith("multipart/alternative") ? true : false;

                InputStreamReader isr;
                int retrieved;
                char[] buffer = new char[512];
                for (int i = 0; i < parts.getCount(); i++) {
                    p = parts.getBodyPart(i);

                    if (p.getContentType().toLowerCase().startsWith("multipart")) {
                        sw.write(fetchEmailcontent(p, messageid));
                        break;
                    } else if ((Part.INLINE.equalsIgnoreCase(p.getDisposition()) || p.getDisposition() == null) && p.getContentType().toLowerCase().startsWith("text") && p.getFileName() == null) {

                        if (InputStream.class.isInstance(p.getContent())) {
                            InputStream ip = p.getInputStream();

                            StringWriter subwriter = new StringWriter(ip.available());
                            isr = new InputStreamReader(ip);
                            while (isr.ready()) {
                                retrieved = isr.read(buffer, 0, 512);
                                subwriter.write(buffer, 0, retrieved);
                            }
                            sw.write(subwriter.toString());
                        } else {
                            Object content = p.getContent();
                            if (java.io.ByteArrayInputStream.class.isInstance(content)) {
                                int bcount = ((java.io.ByteArrayInputStream) content).available();
                                byte[] c = new byte[bcount];
                                ((java.io.ByteArrayInputStream) content).read(c, 0, bcount);
                                sw.write(new String(c));
                            } else {
                                sw.write(content.toString());
                            }
                        }
                        if (alternative && !"".equals(sw.toString().trim())) {
                            break;
                        }
                        sw.write("\r\n");
                    } else if (p.getDisposition() != null && (p.getDisposition().equalsIgnoreCase(Part.ATTACHMENT) || p.getDisposition().equalsIgnoreCase(Part.INLINE))) {
                        saveFile(MimeUtility.decodeText(p.getFileName()), p.getInputStream(), messageid);
                    }
                }
            } else if (message.getContentType().toLowerCase().startsWith("text")) {
                sw.write(message.getContent().toString());
            }
        }
        return sw.toString();
    }

Вот пример письма, из которого не удалось получить вложения: (я удалил заголовки и код BASE64 для вложений, чтобы сэкономить место. В остальном они в порядке)

Content-Type: multipart/mixed; boundary=f46d04016b4779522904c58fb5b4

--f46d04016b4779522904c58fb5b4
Content-Type: multipart/alternative; boundary=f46d04016b4779522104c58fb5b2

--f46d04016b4779522104c58fb5b2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

test


sdljpjdpjsd


=E5=E4=F6

--f46d04016b4779522104c58fb5b2
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<div>test </div><div>=A0</div><div>=A0</div><div>sdljpjdpjsd</div><div>=A0<=
/div><div>=A0</div><div>=E5=E4=F6</div>

--f46d04016b4779522104c58fb5b2--
--f46d04016b4779522904c58fb5b4
Content-Type: image/jpeg; name="blah.jpg"
Content-Disposition: attachment; filename="blah.jpg"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_h50rhk180

BUNCH OF BASE64
--f46d04016b4779522904c58fb5b4
Content-Type: application/pdf; name="blah2.pdf"
Content-Disposition: attachment; filename="blah2.pdf"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_h50ria042

BUNCH OF BASE64
--f46d04016b4779522904c58fb5b4--

The expected output is the text in the message body AND all the attachments saved to disk. The function saveFile() does that but its so elementary I decided not to include it. I know for sure it is not the culprit.

Заранее спасибо.


person Firas Dib    schedule 24.07.2012    source источник
comment
Не могли бы вы предоставить нам, на каком электронном письме должна отображаться информация? Кроме того, объясните, что не так с найденными вложениями.   -  person Alex Coleman    schedule 24.07.2012
comment
Я прикрепил источник электронной почты в своем исходном сообщении. Проблема в том, что он НЕ нашел вложения.   -  person Firas Dib    schedule 24.07.2012


Ответы (1)


В вашем коде...

if (InputStream.class.isInstance(p.getContent())) может быть ложным, однако InputStream ip = p.getInputStream(); может быть успешным!

Надеюсь это поможет.

person Andy B    schedule 26.09.2012
comment
Я думаю, что ваш ответ останавливается наполовину. Для чего это должно помочь? Чтобы выделить отсутствующую проверку возвращаемого значения? Если да, то просто назовите его ;) - person hakre; 26.09.2012