Google Groups unterstützt keine neuen Usenet-Beiträge oder ‑Abos mehr. Bisherige Inhalte sind weiterhin sichtbar.

JavaMail HTML nach Text konvertieren

2 Aufrufe
Direkt zur ersten ungelesenen Nachricht

Jochen Böhringer

ungelesen,
19.08.2002, 16:02:0519.08.02
an
Hallo NG,

mit

[...]
Message[] messages = folder.getMessages();
[...]
InputStream is = messages[i].getDataHandler().getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String nextLine;
while ((nextLine = br.readLine()) != null)
eMailText.append(nextLine);
[...]

hole ich mir über die JavaMail API den Text einer eMailNachricht. (Anhänge
usw. sollen nicht berücksichtigt werden)

Zuerst: Ist das überhaupt der richtige Weg, das muss doch auch geschickter
gehen?

Danach möchte ich aus dem erhaltenen Text (HTML oder Plaintext) nur den Text
"extrahieren".

Das habe ich bereits folgendermassen versucht:

HTMLEditorKit editKit = new HTMLEditorKit();
HTMLDocument doc = new HTMLDocument();
Reader re = new StringReader(html); // html enthält
den eMailText von oben als String
editKit.read(re, doc, 0); //
hier tritt die Exception auf ( Zeile 24 aus UPESUtils)
return doc.getText(0, doc.getLength());

dabei tritt eine IOException auf:

javax.swing.text.ChangedCharSetException
at
javax.swing.text.html.parser.DocumentParser.handleEmptyTag(DocumentParser.ja
va:169)
at javax.swing.text.html.parser.Parser.startTag(Parser.java:372)
at javax.swing.text.html.parser.Parser.parseTag(Parser.java:1846)
at javax.swing.text.html.parser.Parser.parseContent(Parser.java:1881)
at javax.swing.text.html.parser.Parser.parse(Parser.java:2047)
at
javax.swing.text.html.parser.DocumentParser.parse(DocumentParser.java:106)
at
javax.swing.text.html.parser.ParserDelegator.parse(ParserDelegator.java:78)
at javax.swing.text.html.HTMLEditorKit.read(HTMLEditorKit.java:229)
at de.tcc_products.upes.UPESUtils.returnCleanText(UPESUtils.java:24)
// editKit.read(re, doc, 0);
at
de.tcc_products.upes.WaitEmailAuthenticationListener.ProcessMessage(WaitEmai
lAuthenticationListener.java:351)
at com.ibm.workflow.upes.UPES.ProcessIncommingXMLMessage(UPES.java:228)
at com.ibm.workflow.upes.UPES.run(UPES.java:320)
at java.lang.Thread.run(Thread.java:536)

Ich nehme an, dass die HTML email, die ich mit Outlook erzeuge, nicht
verarbeitet werden kann.

Wenn ich mit Outlook eine reine Textmail erzeuge funktioniert alles
einwandfrei. Bei HTML Body kommt es zur beschriebenen Exception.

der html String enthält beispielsweise den unten angehängten Inhalt. Das
einzige was ich extrahieren möchte ist ganz am Schluss: "Dies ist eine HTML
email."

Falls jemand weiss, wie ich direkt über die JavaMail API an den reinen Text
meiner Nachricht komme, oder ohne Verwendung der javax.swing.text.html.*
und javax.swing.text.* Klassen das HTML parsen kann, wäre ich wirklich
dankbar, da ich über deja.com nicht fündig geworden bin:-(

Danke

Jochen

P.S.: java version "1.4.0_01"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0_01-b03)
Java HotSpot(TM) Client VM (build 1.4.0_01-b03, mixed mode) unter Windows
2000 Server

<html><head><meta http-equiv=Content-Type content="text/html;
charset=iso-8859-1"><meta name=Generator content="Microsoft Word 10
(filtered)"><style><!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal,
div.MsoNormal {margin:0cm; margin-bottom:.0001pt; font-size:12.0pt;
font-family:"Times New Roman";}a:link, span.MsoHyperlink {color:blue;
text-decoration:underline;}a:visited, span.MsoHyperlinkFollowed
{color:purple; text-decoration:underline;}span.EmailStyle17
{font-family:Arial; color:windowtext;}@page Section1 {size:595.3pt 841.9pt;
margin:70.85pt 70.85pt 2.0cm 70.85pt;}div.Section1
{page:Section1;}--></style></head><body lang=DE link=blue vlink=purple><div
class=Section1><p class=MsoNormal><font size=2 face=Arial><span
style='font-size:10.0pt;font-family:Arial'>Dies ist eine HTML
email</span></font></p></div></body></html>

Michael Schierl

ungelesen,
21.08.2002, 15:36:2721.08.02
an
"Jochen Böhringer" <jochen.b...@tcc-products.de> wrote:

>Zuerst: Ist das überhaupt der richtige Weg, das muss doch auch geschickter
>gehen?

Lass die Leute dir Multipart-HTML-Mails schicken, die haben vorne
alles als Klartext dran.

Warum musst du überhaupt HTML-Mails parsen? Die meisten Listserver
etc., die Befehle aus Mails ausführen, schicken AFAIK im Falle einer
HTML-Mail einfach eine Meldung zurück, man solle das ganze bitte in
Plaintext schicken...

>Danach möchte ich aus dem erhaltenen Text (HTML oder Plaintext) nur den Text
>"extrahieren".
>
>Das habe ich bereits folgendermassen versucht:
>
>HTMLEditorKit editKit = new HTMLEditorKit();
>HTMLDocument doc = new HTMLDocument();
>Reader re = new StringReader(html); // html enthält
>den eMailText von oben als String
>editKit.read(re, doc, 0); //
>hier tritt die Exception auf ( Zeile 24 aus UPESUtils)
>return doc.getText(0, doc.getLength());
>
>dabei tritt eine IOException auf:
>
>javax.swing.text.ChangedCharSetException
> at
>javax.swing.text.html.parser.DocumentParser.handleEmptyTag(DocumentParser.ja
>va:169)

das sieht im Source so aus (ein bisschen umformatiert wegen den langen
Zeilen):

====8<====
if ("content-type".equalsIgnoreCase((String)atts.getAttribute
(HTML.Attribute.HTTPEQUIV))) {
throw new ChangedCharSetException(content, false);
} else if ("charset" .equalsIgnoreCase((String)atts.getAttribute
(HTML.Attribute.HTTPEQUIV))) {
throw new ChangedCharSetException(content, true);
}
====8<====

>Ich nehme an, dass die HTML email, die ich mit Outlook erzeuge, nicht
>verarbeitet werden kann.

Es liegt auf jeden Fall daran, dass in der HTML-Mail ja noch der
verwendete Zeichensatz (ISO-8859-1) drinnen steht. Da der Reader aber
vom Stream nur characters und keine Bytes hat, kann er den String
nicht mehr umcodieren, da er ja nicht weiß, wie du aus den Bytes den
String gebaut hast. Ich würde also - als "dirty hack", wenn du davon
ausgehen kannst, dass der Mailzeichensatz zumindest ähnlich wie der
verwendete Zeichensatz ist (oder du einfach die Mail nochmal durch
einen Reader mit dem richtigen Zeichensatz liest) - den Meta-Tag
unbrauchbar machen oder ganz entfernen, bevor der Text geparst wird.

><meta http-equiv=Content-Type content="text/html;charset=iso-8859-1">

Bei meinem Test reichte ein

html=html.replaceAll("(?i)http-equiv=content-type","http-equiv=x-content-type");

(Java 1.4) um die Beispielmail zu decodieren. Bei Euros oder
exotischeren Zeichensätzen (oder wenn jemand so einen Text im Body
verwendet) o. ä. wäre es vermutlich nicht mehr gegangen.

Michael

--
Alle meine Antworten, Feststellungen, Behauptungen sind mit AFAIK und IMHO
zu lesen und nicht in der Luft- und Raumfahrt oder Atomindustrie zu verwenden.
-- Paul Ebermann in einer "Signatur" in dclj
(<news:ajgq6q.3...@epaul.my-fqdn.de>)

0 neue Nachrichten