HTML-Mail auslesen

seven

Grünschnabel
Hallo,

ich möchte eine HTML-Mail auslesen, in der wichtige Daten in einer Tabelle stehen. Die Anzahl der Zeilen kann unterschiedlich sein.
Das habe ich soweit geschafft. Das Programm öffnet das Mailpostfach, durchsucht alle eMails in denen im Betreff ein bestimmter
String steht und liest diese bis zu einem Punkt aus.
Leider hört es aus irgendwelchen Gründen mitten in der Tabelle auf, es kommt auch keine Fehlermeldung.
Ich habe mir schon den Source der eMail angeschaut, kann aber nichts ungewöhnliches feststellen.
Da ich mit Eclipse arbeite, bin ich auch schon step by step durchgegangen und irgendwann, beim durchlaufen der Tabelle mit
den Daten, hört er auf und schließt das Postfach ordnungsgemäß.

Das wird in der Console von Eclipse ausgegeben:
Code:
Nachricht: 25
Von: [xxxxxx@xxxxxxxx.de]
Betreff: Buchungsbestaetigung Buchungsnummer 425041 
Gesendet am: Tue Dec 15 16:06:25 CET 2009
Content-Type: multipart/alternative; 
	boundary="----_=_NextPart_000_0013B6EA.4B27B3EA"

javax.mail.internet.MimeMultipart@edc3a2
Encoding: ISO8859_1
C: RETR 26
S: +OK 35586 byte(s)
X-Message-Delivery: Vj0xLjE7dXM9MDtsPTA7YT0wO0Q9MTtTQ0w9MQ==
X-Message-Status: n:0
X-SID-PRA: xxxx@xxxxxx.de
X-Message-Info: JGTYoYF78jHgIR/d6NreP8xppbXtTv5jqMxc64GbnmqGzMr2ZQgTusit0C5h6SuZcFrWDgSTCmHSYxPsgsjxFg==
Received: from smtp-out-130.synserver.de ([212.40.180.130]) by snt0-mc2-f26.Snt0.xxxxxxx.com with xxxxxx SMTPSVC(6.0.3790.3959);
	 Tue, 15 Dec 2009 07:06:25 -0800
Received: (qmail 26200 invoked by uid 0); 15 Dec 2009 15:06:23 -0000
X-SynServer-TrustedSrc: 1
X-SynServer-AuthUser: info@xxxxxxx.de
X-SynServer-PPID: 26110
Received: from xxxx01.synserver.de (HELO 192.168.20.7) [217.119.48.193]
  by blue-ld-125.synserver.de with SMTP; 15 Dec 2009 15:06:23 -0000
To: xxxx@xxxxxxxxxx.de
From: xxxxx@xxxxxxxxxxx.de
Subject: Buchungsbestaetigung Buchungsnummer 425041 
Date: 15 Dec 2009 15:06:25 UT
Priority: normal
X-Priority: 3 (Normal)
Importance: normal
X-Mailer: DvISE by Tobit Software, Germany (0250.444B46464E464A4C4C4E)
X-David-Sym: 0
X-David-Flags: 0
Message-ID: <0013B6EA.4B27B3EA@192.168.20.7>
MIME-Version: 1.0
Content-Type: multipart/alternative;
 boundary="----_=_NextPart_000_0013B6EA.4B27B3EA"
Return-Path: xxxx@xxxxxxx.de
X-OriginalArrivalTime: 15 Dec 2009 15:06:25.0642 (UTC) FILETIME=[2BC6A4A0:01CA7D98]

This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.

------_=_NextPart_000_0013B6EA.4B27B3EA
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Diso-8859-1"><style type=3D"text/css"><!--body,td,th {	font-family: Verdana, Arial, Helvetica, sans-serif;	font-size: 12px;}.Stil1 {font-size: xx-small}.Stil3 {font-size: xx-small; font-weight: bold; }body {	margin-left: 10px;}--></style></head><body><div align=3D"center"><table width=3D"600" border=3D"0" style=3D"text-align: left;">  <tr>    <td><table border=3D"0">      <tr>        <td width=3D"350">&nbsp;</td>        <td width=3D"250"><p align=3D"right"><img src=3D"d:\Daten\xxxx_MessageController\xxxxxx_Booking\xxxxxxxx-testhotel\Logo.gif"><br />        </p></td>      </tr>	  <tr>        <td width=3D"350">&nbsp;</td>        <td width=3D"250"><div align=3D"right"><br />          xxxxxxxx, den 15.12.2009</div></td>      </tr>    </table></td>  </tr>  <tr>    <td>      <strong>
Buchungsbest&auml;tigung</strong></td>  </tr>  <tr>    <td>&nbsp;</td>  </tr>  <tr>    <td>Hiermit best&auml;tigen wir Ihnen Ihre verbindliche Buchung, die wir unter der <strong><br />Buchungsnummer 425041 </strong>registriert haben. Nachstehend die von Ihnen eingegebenen Buchungsdaten: </FONT></td>  </tr>  <tr>    <td>&nbsp;</td>  </tr>  <tr>    <td><hr size=3D"5" color=3D"#cddaeb" noshade ></td>  </tr>  <tr>    <td><table width=3D"100%" border=3D"0">      <tr>        <td width=3D"22%"><span class=3D"Stil3">Anreise:</span></td>        <td width=3D"32%">16.12.2009</td>        <td width=3D"17%"><span class=3D"Stil3">Abreise:</span></td>        <td width=3D"29%">23.12.2009 </td>      </tr>      <tr>        <td><span class=3D"Stil3">Buchungsnummer:</span></td>        <td>425041</td>        <td><span class=3D"Stil3">Buchungsdatum:</span></td>        <td>15.12.2009</td>      </tr>      <tr>        <td><span class=3D"Stil3">Gesamtsumme:</span></td>        <td>2,695,00 </td>        <td>
&nbsp;</td>        <td>&nbsp;</td>      </tr>      <tr>        <td><span class=3D"Stil3">Alle Preise in:</span></td>        <td>EURO</td>        <td>&nbsp;</td>        <td>&nbsp;</td>      </tr>      <tr>        <td><span class=3D"Stil3">Bemerkungen:</span></td>        <td colspan=3D"3" valign=3D"top">+++ Anreise nach 18 Uhr +++ Testbemerkung</td>        </tr> <tr>        <td><span class=3D"Stil3">Anreisezeit ca.:</span></td>        <td colspan=3D"3" valign=3D"top">18:00</td>        </tr>		<tr>        <td>&nbsp;</td>        <td colspan=3D"3" valign=3D"top"></td>        </tr>    </table></td>  </tr>  <tr>    <td><hr size=3D"5" color=3D"#cddaeb" noshade></td>  </tr>  <tr>    <td><table cellspacing=3D"0" rules=3D"all" border=3D"1" style=3D"border-collapse:collapse;">
	<tr>
		<td>Datum</td><td>Anzahl</td><td>Zimmertyp</td><td>Einzelpreis</td><td>Einzelsumme</td>
	</tr><tr>
		<td>16.12.2009</td><td>1</td><td>Grp1</td><td>77,00</td><td>77,00</td>
	</tr><tr>
		<td>17.12.2009</td><td>1</td><td>Grp1</td><td>77,00</td><td>77,00</td>
	</tr><tr>
		<td>18.12.2009</td><td>1</td><td>Grp1</td><td>77,00</td><td>77,00</td>
	</tr><tr>
		<td>19.12.2009</td><td>1</td><td>Grp1</td><td>77,00</td><td>77,00</td>
	</tr><tr>
		<td>20.12.2009</td><td>1</td><td>Grp1</td><td>77,00</td><td>77,00</td>
	</tr><tr>
		<td>21.12.2009</td><td>1</td><td>Grp1</td><td>77,00</td><td>77,00</td>
	</tr><tr>
		<td>22.12.2009</td><td>1</td><td>Grp1</td><td>77,00</td><td>77,00</td>
	</tr><tr>
		<td>16.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>
	</tr><tr>
		<td>17.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>
	</tr><tr>
		<td>18.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>
	</tr><tr>
		<td>19.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>         <<<----- hier bricht das Programm ab (nach dem Datum)
	</tr><tr>
		<td>20.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>
	</tr><tr>
		<td>21.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>
	</tr><tr>
		<td>22.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>
	</tr><tr>
		<td>16.12.2009</td><td>4</td><td>Grp4</td><td>44,00</td><td>176,00</td>
	</tr><tr>
		<td>17.12.2009</td><td>4</td><td>Grp4</td><td>44,00</td><td>176,00</td>
	</tr><tr>
		<td>18.12.2009</td><td>4</td><td>Grp4</td><td>44,00</td><td>176,00</td>
	</tr><tr>
		<td>19.12.2009</td><td>4</td><td>Grp4</td><td>44,00</td><td>176,00</td>
	</tr><tr>
		<td>20.12.2009</td><td>4</td><td>Grp4</td><td>44,00</td><td>176,00</td>
	</tr><tr>
		<td>21.12.2009</td><td>4</td><td>Grp4</td><td>44,00</td><td>176,00</td>
	</tr><tr>
		<td>22.12.2009</td><td>4</td><td>Grp4</td><td>44,00</td><td>176,00</td>
	</tr>
</table></td>  </tr>  <tr>    <td><hr size=3D"5" color=3D"#cddaeb" noshade></td>  </tr>  <tr>    <td> </td>  </tr>  <tr>    <td><hr size=3D"5" color=3D"#cddaeb" noshade></td>  </tr>  <tr>    <td><table width=3D"100%" border=3D"0">      <tr>        <td colspan=3D"3"><p class=3D"Stil3">Ihre Angaben<br />          <br /></p>          </td>        </tr>      <tr>        <td width=3D"45%">Frau Prof.</td>        <td width=3D"14%">&nbsp;</td>        <td width=3D"41%">&nbsp;</td>      </tr>      <tr>        <td>Anni</td>        <td>&nbsp;</td>        <td>&nbsp;</td>      </tr>      <tr>        <td>Schmidt</td>        <td><span class=3D"Stil3">Tel:</span></td>        <td>0123456789 </td>      </tr>      <tr>        <td>Bergbau GmbH</td>        <td><span class=3D"Stil3">Fax:</span></td>        <td>1234987654</td>      </tr>      <tr>        <td>Begstr.2</td>        <td><span class=3D"Stil3">Mobil:</span></td>        <td>0151987553</td>      </tr>      <tr>        <td>84467 München</td>
        <td><span class=3D"Stil3">EMail:</span></td>        <td>xxxx@xxxxxxxl.de</td>      </tr>      <tr>        <td>Deutschland</td>        <td>&nbsp;</td>        <td>&nbsp;</td>      </tr>  <tr>        <td>&nbsp;</td>        <td>&nbsp;</td>        <td>&nbsp;</td>      </tr><tr>        <td colspan=3D"2"></td>        <td></td>      </tr><tr>        <td colspan=3D"2">&nbsp;</td>        <td>&nbsp;</td>      </tr><tr>        <td colspan=3D"3"></td>        </tr><tr>        <td colspan=3D"3"></td>        </tr    ></table></td>  </tr>  <tr>    <td><hr size=3D"5" color=3D"#cddaeb" noshade></td>  </tr>  <tr>    <td><table width=3D"100%" border=3D"0">      <tr>        <td colspan=3D"3"><p class=3D"Stil3">Ihr Gastgeber<br />          <br /></p>          </td>        </tr>      <tr>        <td width=3D"45%">xxx-xxxx Testhotel</td>        <td width=3D"14%"><span class=3D"Stil3">Tel:</span></td>        <td width=3D"41%">03 51 25 44 1-0 </td>      </tr>      <tr>        <td>
xxxxxxxxx 22</td>        <td><span class=3D"Stil3">Fax:</span></td>        <td>xxxxx xxx xxx</td>      </tr>      <tr>        <td>111111 xxxxx</td>        <td><span class=3D"Stil3">EMail:</span></td>        <td>xxxx@xxxxxxxx.de</td>      </tr>      <tr>        <td>Deutschland</td>        <td>&nbsp;</td>        <td>&nbsp;</td>      </tr>      <tr>        <td>&nbsp;</td>        <td>&nbsp;</td>        <td>&nbsp;</td>      </tr>      <tr>        <td colspan=3D"3">&lt;br&gt;</td>      </tr>      <tr>        <td colspan=3D"3">&nbsp;</td>        </tr>    </table></td>  </tr>   <tr>    <td><hr size=3D"5" color=3D"#cddaeb" noshade></td>  </tr>  <tr>    <td><p>Eventuelle R&uuml;ckfragen richten Sie bitte direkt an Ihren Gastgeber.<br />      Diese E-Mail wurde automatisch erzeugt. Bitte antworten Sie daher nicht auf diese E-Mail.<br>      Um  Ihren Gastgeber zu kontaktieren, nutzen die bitte die EMail Adresse des Gastgebers.</p>      </td>  </tr>  <tr>    <td>
  .
  AGB
  .
------------------------------------------------------------------------</p></div>'<br />      <span class=3D"Stil3">Stornofristen</span><br />      <table cellspacing=3D"0" rules=3D"all" border=3D"1" 

	</tr>
</table></td>  </tr></table></div></body></html>

------_=_NextPart_000_0013B6EA.4B27B3EA--

Java-Code Schnipsel:

Java:
Object content = m.getContent();
				if (content instanceof String) {
					body = (String) content;
				} else if (content instanceof Multipart) {
					Multipart mp = (Multipart) content;
					Part part = m;
					int anz = 0;
					for (int j = 0; j < mp.getCount(); j++) {
						part = mp.getBodyPart(j);

						//StringBuffer readBuffer = new StringBuffer();

						MimeBodyPart mimePart = (MimeBodyPart) part;

						final StringBuilder contentSB = new StringBuilder();
						InputStream is = mp.getBodyPart(j).getInputStream();

						InputStreamReader isr = new InputStreamReader(is, Charset.forName("iso-8859-1"));
						BufferedReader br = new BufferedReader(isr);

						HTMLEditorKit htmlKit = new HTMLEditorKit();
						HTMLDocument htmlDoc = (HTMLDocument) htmlKit
								.createDefaultDocument();
						HTMLEditorKit.Parser parser = new ParserDelegator();
						HTMLEditorKit.ParserCallback callback = htmlDoc
								.getReader(0);
						parser.parse(br, callback, true);

						HTMLDocument.Iterator iterator = htmlDoc
								.getIterator(HTML.Tag.CONTENT);

						for (iterator = htmlDoc.getIterator(HTML.Tag.CONTENT); 
							iterator.isValid(); iterator.next()) {
							int startOffset = iterator.getStartOffset();
							int endOffset = iterator.getEndOffset();
							int length = endOffset - startOffset;
							String text = htmlDoc.getText(startOffset, length);
							arrMail.add(text);
						}

Da ich damit noch keine Erfahrung habe, stehe ich jetzt ganz schön auf dem Schlauch.
Warum durchläuft das Programm die Mail nicht bis zum Ende?
Gibt es evtl. eine bessere Lösung?

Ich danke schon mal Voraus.

Gruß seven
 
Hi!

Willst du nur die Daten aus der Tabelle in deinem Programm verwenden? Das würde ich mit Tagsoup parsen und dann mit XPATH die benötigten Werte auslesen... Das wird meiner Meinung nach deutlich kürzer...

Kann aber auch sein, dass ich gerade einfach nicht sehe, wo das eigentliche Problem liegt...

Gruß,

RoCMe
 
Hi RoCMe ,

vielen dank für deine Antwort. :)

Mit XPath habe ich schon gearbeitet und Tagsoup müßte ich mir erstmal anschauen.
Ich habe mir mal die Struktur der Mail angeschaut und da sind 6 Tabellen in einer Tabelle. Für mich sind eigentlich nur die
Daten aus Tabelle 2, 3 und 4 relevant.
Schau mal in das Code-feld, dort habe ich geschrieben, wo das Programm abricht.
<td>19.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td> <<<----- hier bricht das Programm ab (nach dem Datum)

Irgendwie muß ich auch die Umlaute, die in der HTML-Mail sind, umwandeln und deshalb habe ich das HTMLEditorKit genommen.

Dann habe ich die Mail erstmal in eine HTML-Datei lokal gespeichert, diese Datei erneut ausgelesen und das Programm bricht wieder an der selben Stelle ab. :confused:

Jetzt werde ich mir mal Tagsoup anschauen, vielleicht bringt mich das weiter.

Für weitere Tipps wäre ich sehr dankbar.

Gruß seven
 
Zuletzt bearbeitet:
Hi!

Sicher nicht schön, aber wenn ich deine Tabelle aus einer Datei in einen BufferedReader einlese und an diese Funktion übergebe, dann gibt die genau die Daten aus, die du haben wolltest:

Java:
	/** only method we're really interested in :) */
	private void parse(BufferedReader htmlSource) throws Exception{
		//parse with tagsoup parser...
		SAXBuilder saxBuilder = new SAXBuilder("org.ccil.cowan.tagsoup.Parser");
		//read document
		Document document = saxBuilder.build(htmlSource);
		//get all needed rows
		///
		XPath x = XPath.newInstance("/h:html/h:body/h:div/h:table/h:tr[9]/h:td/h:table/h:tr");
		x.addNamespace("h", "http://www.w3.org/1999/xhtml");		
		List rows = x.selectNodes(document);
		System.out.println("SIZE: " + rows.size());
		//iterate over all rows, starting with 2. ...
		Iterator it = rows.iterator();
		it.next();
		do {
			Object o = it.next();
			if (o instanceof	Element) {
				parseRow((Element) o);
				System.out.println(((Element)o));
			}
			else {
				System.err.println("NON-ELEMENT OBJECT: " + o);
			}
		} while (it.hasNext());

		
	}
	private void parseRow(Element row) {
		Iterator it = row.getChildren().iterator();
		String entryRepresentation = "Datum: " + ((Element) it.next()).getText() + " ";
		 entryRepresentation += "Anzahl: " + ((Element) it.next()).getText() + " ";
		 entryRepresentation += "Zimmertyp: " + ((Element) it.next()).getText() + " ";
		 entryRepresentation += "Einzelpreis: " + ((Element) it.next()).getText() + " ";
		 entryRepresentation += "Einzelsumme: " + ((Element) it.next()).getText() + " ";
	}

Gruß,

RoCMe
 
HI,

ich habe mir das angeschaut und übernommen.
Leider bekomme ich eine Fehlermeldung und die Ausgabe in der Konsole für SIZE = 0.
Fehlermeldung:

SIZE: 0
Exception in thread "main" java.util.NoSuchElementException
at java.util.AbstractList$Itr.next(AbstractList.java:350)
at xxxxxxxx.TestTagsoup.parse(TestTagsoup.java:218)
at xxxxxxxx.TestTagsoup.main(TestTagsoup.java:195)

Die Meldung verstehe ich nicht, weil der Bufferedreader nicht leer ist.

Gruß seven
 
Hi!

Ich glaube, das hat nichts mit dem BufferedReader zu tun, sondern mit irgend einer Liste, die keine Elemente enthält...
Leider kann ich mit der Fehlermeldung nicht viel anfangen: An welcher Stelle hakt es denn genau (Welchen Zeilen in meinem Code entsprechen denn die ausgeworfenen Zeilen 195 und 218?

EDIT: Sorry, habs verstanden, kannte nur meinen Code nicht mehr... Das Problem ist anscheinend, dass die Liste "rows" keine Elemente hat - und darin sollten ja eigentlich alle Zeilen deiner Tabelle stehen...
Spiel mal ein wenig mit dem XPath rum - anscheinend passt der nicht richtig... Bei mir hats aber definitiv funktioniert!

Gruß,

RoCMe
 
Zuletzt bearbeitet:
Hi,

das ging jetzt aber flott. :)

sorry, is klar das du mit den Zeilennummern nichts anfangen kannst. Mein Fehler. ;)

Es ist Zeile
Code:
it.next();
.

Gruß seven
 
Ja, die Mail Benachrichtigung ist was tolles :)
Ich bin im Moment gezwungen, am Telefon zu sitzen und auf genervt auf Bedienung in einer Hotline zu warten *grml*

@Topic:
Siehe oben - spiel mal mit dem XPATH rum - irgendwas stimmt damit wohl nicht...
 
So eine Hotline ist schon was Tolles. ;)

Ich habe Mailbenachrichtigungen schon richtig lieb gewonnen. :D
Das XPath sieht garnicht mal so schlecht aus, aber vllt. liegt es daran, dass in der ersten und siebten Zeile noch eine Tabelle ist.
Ist aber auch Quatsch, denn es wird ja auf die 9. Zeile verwiesen, wo die wichtigen Daten stehen.
Ich werde mir noch mal XPath anschauen und dann rumprobieren.

Nochmal Danke.

Gruß seven
 
Hallo,

ich habe jetzt mit XPath rumexperimentiert und leider kein Erfolg gehabt.

Java:
SAXBuilder saxBuilder = new SAXBuilder(
					"org.ccil.cowan.tagsoup.Parser");
Document document = (Document) saxBuilder.build(is);

			String sXPathExpression = "//html/body/div";
			XPath xPathReader = XPath.newInstance(sXPathExpression);
			Object oElement = xPathReader.selectSingleNode(document);

DocType doctype = new DocType( "html", "-//W3C//DTD XHTML 1.0 Transitional//EN") ;
			document.  setDocType  ( (DocType) doctype );

DocType docType = (DocType) document.getDocType();
			System.out.println( "Element: " +   docType.getElementName  () );
			System.out.println( "Public ID: " +   docType.getPublicID()   );
			System.out.println( "System ID: " +   docType.getSystemID()   );
			
			List ergebnis = XPath.selectNodes( document, "/html/body/div" );
			System.out.println("Ergebnis: " + ergebnis);
			XPath xpath = XPath.newInstance( "/child::html/child::body/child::div/child::table" );
			List ergebnis2 = xpath.selectNodes( document );
			System.out.println("Ergebnis2: " + ergebnis2);

String sValue = null;
			if (oElement == null) {
				// Knoten/Attribut existiert gar nicht, eventuell falscher
				// XPath-Ausdruck
			} else if (oElement.getClass().getName().equalsIgnoreCase(
					"org.jdom.Attribute")) {
				Attribute jdomAttribute = (Attribute) oElement;
				sValue = jdomAttribute.getValue();
				System.out.println("Attribut: " + sValue);
			} else if (oElement.getClass().getName().equalsIgnoreCase(
					"org.jdom.Element")) {
				Element jdomElement = (Element) oElement;
				sValue = jdomElement.getValue();
				System.out.println("Element: " + sValue);
			}

Ausgabe auf der Console:
Element: html
Public ID: null
System ID: -//W3C//DTD XHTML 1.0 Transitional//EN
Ergebnis: []
Ergebnis2: []

Im InputStream ist alles drin, wenn ich es in eine Datei schreiben lasse, steht das ganze HTML drin.

Ich weiß jetzt auch nicht mehr weiter.
Was stimmt hier nicht?

Gruß seven.
 

Neue Beiträge

Zurück