Как анализира съдържанието на имейл с javax.mail?

Опитвам се да анализирам имейли с помощта на javax.mail. Искам да извлека както текстово съдържание, така и всички прикачени файлове (за предпочитане също INLINE снимки/прикачени файлове).

Имам следния код, но изглежда, че се счупи с по-сложни имейли с няколко вложени множествени части.

Прочетох често задаваните въпроси и търсих в Google цял ден, без да намеря решение.

Моля помогнете.

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