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".
Кто-нибудь может увидеть, где я иду не так?
Спасибо Рис
5 ответов
Ни одно из приведенных выше предложений не является действительным. Вам не нужно делать ничего сложного здесь. 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, который у меня работал. Теперь я могу разобрать текст / обычный текст, а также текст /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;
}
Надеюсь, это поможет кому-то.
Я также получил ту же ошибку, пытались почти все, но решение работало для меня
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();
}
Надеюсь, это кому-нибудь поможет.
Не совсем уверен, но это звучит так, как будто вы хотите преобразовать MimeMessage в строку. Строго говоря, не существует "стандартного" перевода для MimeMessage в String, но вот кусок кода, который я написал пару лет назад и который пытается сгенерировать один такой перевод. Тестируется только на английских сообщениях, поэтому i18n должен быть чем-то, что вы думаете о себе.
К сожалению, глупый фильтр SO, кажется, думает, что мой пример кода является изображением, и не позволяет мне публиковать его: взгляните на класс по адресу http://pastebin.com/pi9u5Egq: код выполняет кучу ненужных в других отношениях вещей (он выкладывал его в HTML, который был визуализирован с использованием летающей тарелки), а также требует Jakarta Commons Lang, javamail и библиотек активации, но это работает для меня. Вы бы вызвали это так:
fetchText(message, null, false, false);
Чтобы получить текстовую строку. Попробуйте это для размера.