简体   繁体   中英

JavaMail - Parsing email content, can't seem to get it to work! (Message.getContent())

For a few weeks I have been developing a email client for android, I have been ignoring parsing email content for a while as I have never been able to get it to work. Thus, the time has come to ask for help!

I have been looking around and I have come across a few methods I have tried but never had much success with! Currently my closest attempt would have to be:

private String parseContent(Message m) throws Exception
{       
    //Multipart mp = (Multipart)c;
    //int j = mp.getCount();

    /*for (int i = 0; i < mp.getCount(); i++)
    {
        Part part = mp.getBodyPart(i);
        System.out.println(((MimeMessage)m).getContent());
        content = content + part.toString();
        //System.out.println((String)part.getContent());
    }*/

    Object content = m.getContent();
    String contentReturn = null;

    if (content instanceof String) 
    {
        contentReturn = (String) content;
    } 
    else if (content instanceof Multipart) 
    {
        Multipart multipart = (Multipart) content;
        BodyPart part = multipart.getBodyPart(0);
        part.toString();
        contentReturn = part.getContent().toString();
    }   
    return contentReturn;
}

But it does not work and I get gibberish such as "javax.mail.internet.MimeMultipart@44f12450".

Can anyone see where I am going wrong?

Thanks, Rhys

None of the above suggestions is valid. You don't need to do anything complex here. Mimemessage has got message.writeTo(outputStream);

All you need to print the message is:

message.writeTo(System.out);

The above code will print the actual mime message to the console (or you can use any logger).

Save the content to .eml and you can open it in outlook. Simple as that!

    Multipart multipart = (Multipart) content;
    BodyPart part = multipart.getBodyPart(0);
    part.toString();
    contentReturn = part.getContent().toString();

When you have BodyPart part, you should keep testing

if(part.getContent() instanceof String){ ... }

I also got the same error any tried almost every thing, but the solution worked for me is

private String getFinalContent(Part p) throws MessagingException,
            IOException {

        String finalContents = "";
        if (p.getContent() instanceof String) {
            finalContents = (String) p.getContent();
        } else {
            Multipart mp = (Multipart) p.getContent();
            if (mp.getCount() > 0) {
                Part bp = mp.getBodyPart(0);
                try {
                    finalContents = dumpPart(bp);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return finalContents.trim();
    }

private String dumpPart(Part p) throws Exception {

        InputStream is = p.getInputStream();
        // If "is" is not already buffered, wrap a BufferedInputStream
        // around it.
        if (!(is instanceof BufferedInputStream)) {
            is = new BufferedInputStream(is);
        }
        return getStringFromInputStream(is);
    }

private String getStringFromInputStream(InputStream is) {

        BufferedReader br = null;
        StringBuilder sb = new StringBuilder();
        String line;
        try {
            br = new BufferedReader(new InputStreamReader(is));
            while ((line = br.readLine()) != null) {
                sb.append(line);
                sb.append("\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return sb.toString();
    }

Hope this will help someone.

I had the same issues while parsing Message of javax mail. In my workaround i found a weird thing. Listing mail from POP3 was not giving me Mail body content. So used IMAP which worked for me. Now i'm able to parse Text/plain as well as Text/Html and read the body. To parse the same i used following method.

public String printMessage(Message message) {

    String myMail = "";

    try {
        // Get the header information
        String from = ((InternetAddress) message.getFrom()[0])
                .getPersonal();



        if (from == null)
            from = ((InternetAddress) message.getFrom()[0]).getAddress();
        System.out.println("FROM: " + from);
        String subject = message.getSubject();
        System.out.println("SUBJECT: " + subject);
        // -- Get the message part (i.e. the message itself) --
        Part messagePart = message;
        Object content = messagePart.getContent();
        // -- or its first body part if it is a multipart message --
        if (content instanceof Multipart) {
            messagePart = ((Multipart) content).getBodyPart(0);
            System.out.println("[ Multipart Message ]");
        }
        // -- Get the content type --
        String contentType = messagePart.getContentType();
        // -- If the content is plain text, we can print it --
        System.out.println("CONTENT:" + contentType);
        if (contentType.startsWith("TEXT/PLAIN")
                || contentType.startsWith("TEXT/HTML")) {
            InputStream is = messagePart.getInputStream();
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(is));
            String thisLine = reader.readLine();
            while (thisLine != null) {
                System.out.println(thisLine);
                myMail = myMail + thisLine;
                thisLine = reader.readLine();
            }


        }
        System.out.println("-----------------------------");
    } catch (Exception ex) {
        ex.printStackTrace();
    }

    return myMail;

}

Hope it helps someone.

Not entirely sure, but what it sounds like is you want to convert a MimeMessage into a String. Strictly speaking, there is no "standard" translation for MimeMessage to String, but here is a chunk of code that I wrote a couple of years back that attempts to generate one such translation. Only tested on English messages, so i18n will have to be something you think about yourself.

Unfortunately SO's stupid filter seems to think that my code sample is an image and won't let me post it: take a look at the class at http://pastebin.com/pi9u5Egq : the code is doing a bunch of otherwise unnecessary things (it was spitting it out into HTML that was rendered using flying saucer), and also requires Jakarta Commons Lang, javamail and activation libraries, but it works for me. You would invoke it like this:

fetchText(message, null, false, false);

To get a text string. Try that out for size.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM