简体   繁体   English

JavaMail - 解析电子邮件内容,似乎无法让它工作! (Message.getContent())

[英]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. 几个星期以来,我一直在为android开发一个电子邮件客户端,我一直忽略解析电子邮件内容一段时间,因为我从来没有能够让它工作。 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". 但它不起作用,我得到像“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); Mimemessage有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). 上面的代码会将实际的mime消息打印到控制台(或者你可以使用任何记录器)。

Save the content to .eml and you can open it in outlook. 将内容保存到.eml ,您可以在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 当你有BodyPart部分时,你应该继续测试

if(part.getContent() instanceof String){ ... } 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. 解析javax邮件时遇到了同样的问题。 In my workaround i found a weird thing. 在我的解决方法中,我发现了一个奇怪的事情。 Listing mail from POP3 was not giving me Mail body content. 从POP3列出邮件并没有给我邮件正文内容。 So used IMAP which worked for me. 所以使用IMAP对我有用。 Now i'm able to parse Text/plain as well as Text/Html and read the body. 现在我能够解析Text / plain以及Text / Html并阅读正文。 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. 不完全确定,但听起来你想将MimeMessage转换为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. 严格来说,MimeMessage to String没有“标准”翻译,但是这是我几年前写的一段代码,试图生成一个这样的翻译。 Only tested on English messages, so i18n will have to be something you think about yourself. 只测试了英文消息,所以i18n必须是你自己想到的东西。

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. 不幸的是,SO的愚蠢过滤器似乎认为我的代码示例是一个图像,不会让我发布它:看看http://pastebin.com/pi9u5Egq上的类:代码正在做一堆其他不必要的事情(它将它吐出到使用飞碟渲染的HTML中),还需要Jakarta Commons Lang,javamail和激活库,但它适用于我。 You would invoke it like this: 你会像这样调用它:

fetchText(message, null, false, false);

To get a text string. 获取文本字符串。 Try that out for size. 尝试大小。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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