# Content einer email in sql-datenbank speichern



## dalco (18. Dez 2007)

hallo,
ich versuche einen kleinen mailbrowser zu schreiben, dazu will ich die bereits abgerufenen mails in einer sql datenbank speichern, es klappt bei der adresse, subjekt und einen datum.
beim inhalt, den ich mit: 

messages_.getContent();

bekomme, speichert er es nicht in die datenbank, hab das feld schon als VARCHAR oder TEXT genommen, wie kann ich den inhalt speichern, vorallem wenn der inhalt der mail nicht nur aus einfachem text besteht, denn damit geht es.

und mit:

messages.getSentDate();

wollte ich die zeit der letzten mail festhalten, um danach nur alle danach kommenden erneut in die datenbank zu speichern, alle abfragen auf diese zeit hin scheitern aber leider.

hier der teil des speichern:
-------------------------------------------------------------------------
// Connect to the POP3 server
      Session session = Session.getDefaultInstance(props, null);
      Store store = session.getStore(provider);
      store.connect(host, username, password);

      // Open the folder
      Folder inbox = store.getFolder("INBOX");

      if (inbox == null) {
        System.out.println("No INBOX");
        System.exit(1);
      }  
      inbox.open(Folder.READ_ONLY);

      // Get the messages from the server
      Message[] messages = inbox.getMessages();

      for (int i = 0; i < messages.length; i++) {
    	  Message m = messages; 

    	  System.out.println("-------------------------------------------------- MAIL:  "+i);
    	  System.out.println( "  Von:        " + m.getFrom()[0] );
    	  System.out.println("-- BETREFF --  " + messages.getSubject());
    	  System.out.println("-- ZEIT --  " + messages.getSentDate());
    	  System.out.println("-- INHALT --  " + messages.getContent() );



    	  data[0] = messages.getSubject();
    	  data[2] = messages.getSentDate();
    	  data[1] = m.getFrom()[0];


    	db.connectToDatabase();
  		con = db.getConnection();
  		update.doEntrie(con , "INSERT INTO tino (id, fromAdr, subject, sendTime, contend) VALUES (\""
  									+i+"\",\""
  									+m.getFrom()[0]+"\",\""
  									+messages.getSubject()+"\",\""
  									+messages.getSentDate()+"\",\""
  									+messages.getContent()+"\")");
        db.close();
     } 

-----------------------------------------------------

danke für eure tipps
mfg
Tino_


----------



## tuxedo (18. Dez 2007)

Das ist doch ein JDBC Thema und kein Netzwerk-Thema?

Folgende Fragen stellen sich mir:

1) Wieso benutzt du keine [ code ] [ /code ] Tags?
2) Wieso öffnest du in einer FOR-Schleife X-Mal die DB Verbindung und schließt sie wieder? Vor der Schleife öffnen und danach schließen. Aber nicht immer und immer wieder IN der Schleifen.
3) Was ist "update.doEntrie()"?? Ich hätt's so gemacht (weiß nicht warum du da noch eine extra Klasse für benutzt wenn du da schon mit dem Connection-Objekt rumhantierst ):


```
Statement statement = con.createStatement();
int affected = statement.executeUpdate(""INSERT INTO tino (id, fromAdr, subject, sendTime, contend) VALUES (\""
+i+"\",\""
+m.getFrom()[0]+"\",\""
+messages[i].getSubject()+"\",\""
+messages[i].getSentDate()+"\",\""
+messages[i].getContent()+"\")"); 
System.out.println(affected+" Zeilen in die DB eingetragen.");
```


----------



## Guest (18. Dez 2007)

hi,
das mit dem "code" seh ich jetzt auch, du hast mir leider nicht auf meine frage geantwortet, sondern meinen gleichen code gepostet, das schließen der datenbank ok, und die extra klasse hab ich halt.
beantworte doch bitte die frage, warum ich den mit getContent() fehler bekomme und das nicht in ein TEXT-Feld in der sql datenbank speichern kann.
deine idee ist nur eine andere schreibweise, kümmert sich aber nicht um die frage.
danke
Tino


----------



## tuxedo (18. Dez 2007)

Ich seh in deinen Posts bis dato kein "?". 

Aber mal davon abgesehen, das hier könnte eine Frage sein:



> wie kann ich den inhalt speichern, vorallem wenn der inhalt der mail nicht nur aus einfachem text besteht



Hab ich dir ja bereits geschrieben, und zwar NICHT mit deinem Code. Meine Fragen hast du übrigens gekonnt ignoriert. find ich nicht so schön für jemanden der Hilfe erwartet und nicht "mitarbeitet". 

Der DB ist es schnuppe ob der Mailcontent aus HTML, ASCII oder sonst was besteht. Fakt ist: Es passt in einen String. Und was in einen String passt, das kann man als Text in der DB speichern. 

Da bei uns allen hier im Forum die Kristallkugel - die einem sonst immer alles verrät, was der Threadersteller nicht preisgeben kann/will - defekt ist, kann ich dir nicht weiterhelfen. Ohne meine Kristallkugel hab ich keinen Schimmer was das für ein ominöser Fehler sein soll. Aber vielleicht kommst du ja auf den Trichter uns zu verraten was das für ein Fehler ist und welche DB du benutzt.

Also erst die Frage richtig stellen und genug Details liefer, und dann erst "klugscheißen" ;-)


----------



## Niki (18. Dez 2007)

Was liefert dir getContent zurück? Ich vermute du wirst nicht drum herum kommen den Content als binary in die Datenbank zu schreiben!


----------



## tuxedo (18. Dez 2007)

Muss doch auch als ASCII/Text gehen... ?!


----------



## Niki (18. Dez 2007)

Ich kenn das mail-Protokoll nicht, aber wenn ich Bilder in den Body einfüge, wo werden die dann übermittelt? Ist der Content sicher immer Text?


----------



## tuxedo (18. Dez 2007)

Die JavaMailAPI verrät es uns:



			
				http://java.sun.com/products/javamail/javadocs/javax/mail/Part.html hat gesagt.:
			
		

> Content:
> 
> The data type of the "content" is returned by the getContentType() method. The MIME typing system is used to name data types.
> .
> ...


----------



## Guest (18. Dez 2007)

hallo,

ich häng dir mal die fehlermeldung an, vielleicht kannst du was damit anfangen, ich denke eben, dass es der datenbank nicht egal ist, ob es nur aus text besteht, einfache text-mails speichert es ab, aber welche mit bildern, wie zb. werbemails von gmx nicht, da kommt es zu folgenden fehlermeldungen:


```
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'lass es und sammel briefmarken", 
naja vielleicht findet sich ja mal zeit drübe' at line 1
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2941)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
	at com.mysql.jdbc.Connection.execSQL(Connection.java:3243)
	at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1343)
	at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1260)
	at database.DB_Entrie.doEntrie(DB_Entrie.java:17)
	at mailserver.POP3Client.ReceiveMails(POP3Client.java:82)-------------------------------------------------- MAIL:  1

	at gui.GUIBuilder.<init>(GUIBuilder.java:95)
	at gui.GUIBuilder.getInstance(GUIBuilder.java:66)
	at start.Start.main(Start.java:9)
```

vielleicht hilft dir das weiter.
vielleicht muss ich mit getContent() alles in einen langen String umwandeln, der evtl. bilder weglässt??
oder klatscht er mir dann alles hintereinander und würde zeilenumbrüche weglassen, kurz, ich lege eine tabelle an mit namen und betreff, wenn ich zb. auf betreff klicke kommt die ganze email, wie zb beim outlook.
dazu sollte der inhalt der mail halt auch so wiedergegeben werden wie er geschrieben wurde und den wollte ich eben in der sql datenbank als großen TEXT feld speichern.

danke Tino


----------



## tuxedo (18. Dez 2007)

Der Fehler sieht danach aus, als ob du ein Zeichen in deinem String hast, welches du maskieren musst. Irgend ein Zeichen scheint da das SQL-Statement ungültig werden zu lassen.

Du kannst nicht jede Mail mit getContent in Text umwandeln. Es gibt in der Tat auch Mails bei denen das nicht geht weil im Content binäre Dateianhänge mit reingewurschtelt sind. Du musst also abhängig von getCOntentType() den Mailinhalt in der DB speichern bzw. den Mailinhalt vorher konvertieren. Ist halt eine Designfrage. Willst du nur die Texte in der DB haben oder alles, inklusive Dateianhänge?

Wenn letzteres, dann wirst du das Objekt, welches getCOntent() zurückliefert serialisieren und tatsächlich als BLOB in der DB speichern müssen. Aber das ist nun wirklich kein Netzwerkthema mehr. 

- Alex


----------

