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

9

我已经开发了一款Android邮件客户端几周了,由于我从未能够使其正常工作,因此我一直忽略解析电子邮件内容。现在,是时候寻求帮助了!

我一直在寻找方法,并尝试了几种方法,但都没有取得太大的成功!目前,我最接近成功的尝试应该是:

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;
}

但是它没有起作用,我得到的是类似于“javax.mail.internet.MimeMultipart@44f12450”的无意义字符。

有人能看出我做错了什么吗?

谢谢, Rhys

5个回答

11

以上建议均无效。您在此不需要进行任何复杂操作。MimeMessage已经拥有 message.writeTo(outputStream); 方法。

您只需执行以下操作即可打印消息:

message.writeTo(System.out);

以上代码将在控制台中打印出实际的 MIME 消息(或者您可以使用任何记录器)。

将内容保存为.eml文件,就可以在Outlook中打开它。就这么简单!


谢谢您。这绝对是正确的解决方案! - carbontax

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

当您拥有BodyPart部件时,应该保持测试。

如果(part.getContent() instanceof String) { ... }


3

我在解析javax邮件的消息时遇到了相同的问题。在我的解决方法中,我发现了一个奇怪的事情。从POP3列出邮件时没有给我Mail正文内容。所以我使用了IMAP,这对我有用。现在我能够解析Text/plainText/Html并阅读正文了。要解析相同的内容,我使用以下方法。

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;

}

希望这能帮到一些人。

3

我也遇到了同样的错误,尝试了几乎所有方法,但对我有效的解决方案是:

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();
    }

希望这篇文章能够帮助到一些人。

0

不是完全确定,但听起来你想将MimeMessage转换成字符串。严格来说,MimeMessage到字符串没有“标准”翻译,但这里有一段代码,我几年前写的,试图生成这样的一个翻译。只测试过英文消息,因此国际化需要您自己考虑。

不幸的是,SO的愚蠢过滤器似乎认为我的代码示例是一张图片,不允许我发布它:请查看http://pastebin.com/pi9u5Egq中的类:代码正在执行一堆不必要的操作(它将其输出为使用Flying Saucer渲染的HTML),还需要Jakarta Commons Lang、 javamail和activation库,但对我有效。您可以像这样调用它:

fetchText(message, null, false, false);

获取文本字符串。试试看。


随着应用程序的编译,大部分电子邮件都被解析了……然后当我重新启动应用程序时,返回的信息显示我的电子邮件收件箱显然是空的。:(所以如果我能解决这个问题,我会尝试那段代码:D(新问题…如果你感兴趣:http://stackoverflow.com/questions/4652946/when-attempting-to-pull-pop3-inbox-folder-using-javamail-i-am-getting-no-emails) - Rhys12341111

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接