JavaMail - Парсинг содержимого электронной почты, похоже, не может заставить его работать! (Message.getContent ()) - PullRequest
8 голосов
/ 12 апреля 2011

В течение нескольких недель я разрабатывал почтовый клиент для 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".

Может кто-нибудь увидетькуда я иду не так?

Спасибо, Рис

Ответы [ 5 ]

9 голосов
/ 21 января 2013

Ни одно из приведенных выше предложений не является действительным. Вам не нужно делать ничего сложного здесь. Mimemessage получил message.writeTo(outputStream);

Все, что вам нужно, чтобы напечатать сообщение:

message.writeTo(System.out);

Приведенный выше код выведет на консоль фактическое сообщение MIME (или вы можете использовать любой регистратор).

Сохраните содержимое в .eml , и вы можете открыть его в Outlook. Все просто!

4 голосов
/ 13 декабря 2011
    Multipart multipart = (Multipart) content;
    BodyPart part = multipart.getBodyPart(0);
    part.toString();
    contentReturn = part.getContent().toString();

Если у вас есть деталь BodyPart, вы должны продолжать тестирование

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

2 голосов
/ 04 мая 2016

У меня были те же проблемы при разборе сообщения javax mail. В моем обходном пути я нашел странную вещь. Письмо от POP3 не давало мне содержимое тела письма. Так использовал IMAP, который у меня работал. Теперь я могу разобрать Text / plain , а также Text / 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;

}

Надеюсь, это кому-нибудь поможет.

2 голосов
/ 01 октября 2014

Я также получил ту же ошибку, что пытался почти все, но решение работало для меня:

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 голосов
/ 12 апреля 2011

Не совсем уверен, но звучит так, как будто вы хотите преобразовать MimeMessage в строку.Строго говоря, не существует «стандартного» перевода для MimeMessage в String, но вот кусок кода, который я написал пару лет назад и который пытается сгенерировать один такой перевод.Проверено только на сообщениях на английском языке, поэтому i18n должен быть тем, о чем вы думаете.

К сожалению, глупый фильтр SO, похоже, считает, что мой пример кода - это изображение, и он не позволит мне опубликовать его: посмотритев классе в http://pastebin.com/pi9u5Egq: код выполняет кучу ненужных в других отношениях вещей (он выплевывал его в HTML, который был визуализирован с использованием летающей тарелки), а также требует Jakarta Commons Lang, javamail и библиотек активации, номеня устраивает.Вы бы вызвали это так:

fetchText(message, null, false, false);

Чтобы получить текстовую строку.Попробуйте это для размера.

...