JavaMail – анализ содержимого электронной почты, похоже, не может заставить его работать! (Message.getContent ())

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

Может ли кто-нибудь увидеть, где я ошибаюсь?

Спасибо, Рис

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

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

 message.writeTo(System.out); 

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

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

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

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

If (part.getContent () instanceof String) {…}

У меня были те же проблемы при анализе сообщения 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 (ie 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; } 

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

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

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

 fetchText(message, null, false, false); 

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

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

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

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